好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

使用Feign调用第三方http接口

Feign调用第三方http接口

我们平常在开发的时候,经常会碰到调用第三方的接口,这个时候我们可以使用httpClient或者restTemplate,但是这两种方式相比较与Feign调用,都会麻烦一点儿。

Feign是声明式服务调用客户端,既规范又简洁,帮我们屏蔽了http调用的复杂性,而且完美切入springcloud技术体系。

下面就来演示一下

使用Feign来调用第三方的客户端。

?

1

2

3

4

5

@FeignClient (name = "my-feign-client" , url = "http://**" )

public interface MyFeignClient{  

    @RequestMapping (value = "**" , method = RequestMethod.GET)

    ResponseEntity getMsg( @RequestParam ( "token" ) String token);    

}

其中name不要和注册中心的服务名称相同,url就是我们要请求的地址。

通过上面就可以看出非常的简单,而且序列化啥的都帮我们做好了,不用我们关心,值得尝试 

原生Feign调用第三方接口

最近做一个小项目,小到只有一个页面,和几个接口而已。

因为项目是自己一个人在做,所以所有的定义都可以自己做主。

项目的目的是为了推送给第三方页面收集到的数据,所以对接是重头戏。

之前对接过各种第三方短信接口,用的无非是httpClient的get/post,用多了就想换一个技术熟悉一下。

引入依赖

啥也不说,先引入一堆东西,不是每一个都有用,但是用到了就很方便。

core :是必须要引的,核心依赖。 gson/jackson :gson我的代码中有用到,处理json数据。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

< dependency >

     < groupId >io.github.openfeign</ groupId >

     < artifactId >feign-core</ artifactId >

     < version >9.5.0</ version >

</ dependency >

< dependency >

     < groupId >com.netflix.feign</ groupId >

     < artifactId >feign-gson</ artifactId >

     < version >8.18.0</ version >

</ dependency >

< dependency >

     < groupId >io.github.openfeign</ groupId >

     < artifactId >feign-slf4j</ artifactId >

     < version >9.5.0</ version >

</ dependency >

< dependency >

     < groupId >io.github.openfeign</ groupId >

     < artifactId >feign-hystrix</ artifactId >

     < version >9.5.0</ version >

</ dependency >

< dependency >

     < groupId >io.github.openfeign</ groupId >

     < artifactId >feign-jackson</ artifactId >

     < version >9.5.0</ version >

</ dependency >

写接口

下面这个接口是免费的,公开的,所以应该不会涉及到利益问题。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

package com.geewise.ddsp.phonecollect.api; 

import com.alibaba.fastjson.JSONObject;

import feign.Param;

import feign.RequestLine; 

import java.net.MalformedURLException;

 

/**

  * 手机号查询地区

  */

public interface DetailPhoneClient {

    /**

      * http://mobsec-dianhua.baidu.com/dianhua_api/open/location?tel=13322222222&qq-pf-to=pcqq.c2c

      * response:{"response":{"13322222222":{"detail":{"area":[{"city":"大连"}],"province":"辽宁","type":"domestic","operator":"电信"},"location":"辽宁大连电信"}},"responseHeader":{"status":200,"time":1539141421138,"version":"1.1.0"}}

      * @param tel

      * @return

      */

    @RequestLine ( "GET /open/location?tel={tel}&qq-pf-to=pcqq.c2c" )

    JSONObject getDetailByPhone( @Param (value = "tel" ) String tel);

}

使用

在controller层中可以直接调用,直接上代码 。

最重要的地方就是Feign.builder()这一段,下面是判断,因为是第三方的,不是自己写的接口,判断的比较细了,有点啰嗦。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

  /**

      * 用手机号查询所属地域

      *

      * @param phone 手机号

      * @return 所属地域

      */

    private String getCityByPhone(String phone) {

        DetailPhoneClient detailPhoneClient = Feign.builder()

                .decoder( new GsonDecoder())

                .target(DetailPhoneClient. class , "http://mobsec-dianhua.baidu.com/dianhua_api" );

        JSONObject detailByPhone = detailPhoneClient.getDetailByPhone(phone);

        logger.info( "查询手机号所属地区:" + detailByPhone);

        // 获取手机号信息的数据

        if (!detailByPhone.containsKey( "response" )) {

            return null ;

        }

        JSONObject response = detailByPhone.getJSONObject( "response" );

        if (!response.containsKey(phone)) {

            return null ;

        }

        JSONObject phoneDetail = response.getJSONObject(phone);

        if (!phoneDetail.containsKey( "detail" )) {

            return null ;

        }

        JSONObject detail = phoneDetail.getJSONObject( "detail" );

        if (!detail.containsKey( "area" )) {

            return null ;

        }

        JSONArray area = detail.getJSONArray( "area" );

        if (area.size() == 0 ) {

            return null ;

        }

        JSONObject cityJsonObject = area.getJSONObject( 0 );

        if (!cityJsonObject.containsKey( "city" )) {

            return null ;

        }

        return cityJsonObject.getString( "city" );

    }

深入理解

会用了,再来了解一下。

权威的宝典:github-openfeign(由于这个写的比较通俗易懂,又比较权威,所以代码就不copy过来了,省时省力)

1、Gson/Jackson(处理json格式的数据)两者都包括一个编码器,一个解码器

2、Sax/JAXB(处理xml格式的数据,因为我还没有接触到这种格式的,毕竟现在json比较流行嘛,只能先写到这里,用到再说)

3、OkHttp,JAX-RS,Ribbon(负载均衡),Hystrix(熔断机制)。这几个都没有用到,等用到了 ,再上官网上查吧

4、可以在接口上添加header,具体的可以上githua上面查

?

1

@Headers ( "Content-Type: application/xml" )

有时间写一下和cloud结合的怎么用

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

原文链接:https://blog.csdn.net/weixin_41751625/article/details/106312801

查看更多关于使用Feign调用第三方http接口的详细内容...

  阅读:23次