使用Feign调用第三方http接口

 更新时间:2022年03月10日 08:55:16   作者:虎哥和你一起学编程  
这篇文章主要介绍了使用Feign调用第三方http接口,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Feign调用第三方http接口

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

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

下面就来演示一下

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

@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数据。
<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>

写接口

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

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()这一段,下面是判断,因为是第三方的,不是自己写的接口,判断的比较细了,有点啰嗦。

 /**
     * 用手机号查询所属地域
     *
     * @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上面查

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

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

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

相关文章

  • Spring Cloud Ubuntu环境部署的步骤与注意事项

    Spring Cloud Ubuntu环境部署的步骤与注意事项

    这篇文章主要给大家介绍了关于Spring Cloud Ubuntu环境部署的步骤与注意事项,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring Cloud具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-12-12
  • Java操作FTP实现上传下载功能

    Java操作FTP实现上传下载功能

    这篇文章主要为大家详细介绍了Java如何通过操作FTP实现上传下载的功能,文中的示例代码讲解详细,对我们学习Java有一定帮助,需要的可以参考一下
    2022-11-11
  • Rabbitmq中的channel接口常用方法详解

    Rabbitmq中的channel接口常用方法详解

    这篇文章主要介绍了Rabbitmq中的channel接口常用方法详解,为了确保消息一定被消费者处理,rabbitMQ提供了消息确认功能,就是在消费者处理完任务之后,就给服务器一个回馈,服务器就会将该消息删除,需要的朋友可以参考下
    2023-09-09
  • 利用java和sqlserver建立简易图书管理系统的完整步骤

    利用java和sqlserver建立简易图书管理系统的完整步骤

    图书馆管理系统是图书馆管理工作中不可缺少的部分,它对于图书馆的管理者和使用者都非常重要,下面这篇文章主要给大家介绍了关于利用java和sqlserver建立简易图书管理系统的完整步骤,需要的朋友可以参考下
    2022-06-06
  • Java 并发编程:volatile的使用及其原理解析

    Java 并发编程:volatile的使用及其原理解析

    下面小编就为大家带来一篇Java 并发编程:volatile的使用及其原理解析。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-05-05
  • SpringBoot 使用Mongo的GridFs实现分布式文件存储操作

    SpringBoot 使用Mongo的GridFs实现分布式文件存储操作

    这篇文章主要介绍了Spring Boot 使用Mongo的GridFs实现分布式文件存储操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • tomcat的keepAlive参数深入探究

    tomcat的keepAlive参数深入探究

    这篇文章主要为大家介绍了tomcat的keepAlive参数深入探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • Java 常见排序算法代码分享

    Java 常见排序算法代码分享

    这篇文章主要介绍了Java 常见排序算法代码分享,文章通过分享详细的代码总结文章内容,具有一定的参考价值,需要的小伙伴可以参考一下,希望对你有所帮助
    2022-03-03
  • 在lambda的foreach遍历中break退出操作(lambda foreach break)

    在lambda的foreach遍历中break退出操作(lambda foreach break)

    这篇文章主要介绍了在lambda的foreach遍历中break退出操作(lambda foreach break),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • idea项目报错缺失maven依赖问题及解决

    idea项目报错缺失maven依赖问题及解决

    这篇文章主要介绍了idea项目报错缺失maven依赖问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03

最新评论