一、Feign的使用(客户端调用 json/xml格式的接口)

1.服务端接口编写

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.2.RELEASE</version>
</parent> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-xml-provider</artifactId>
<version>2.9.0</version>
</dependency>
</dependencies>
  @RequestMapping(value = "/hello", method = RequestMethod.GET)
public String hello() {
return "hello world";
} @RequestMapping(value = "/person/create", method = RequestMethod.POST,
produces = MediaType.APPLICATION_JSON_VALUE,
consumes = MediaType.APPLICATION_JSON_VALUE)
public String createPerson(@RequestBody Person person) {
System.out.println(person.getName() + "~~~~~~~" +person.getAge());
return "success, id:" + person.getId();
} @RequestMapping(value = "/createXmlPerson/create", method = RequestMethod.POST,
produces = MediaType.APPLICATION_XML_VALUE,
consumes = MediaType.APPLICATION_XML_VALUE)
public String createXmlPerson(@RequestBody Person person) {
System.out.println(person.getName() + "~~~~~~~" +person.getAge());
return "<result><message>success</message></result>";
}

2.客户端编写

(1)导入jar包

<dependencies>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-core</artifactId>
<version>9.5.0</version>
</dependency> <dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-gson</artifactId>
<version>9.5.0</version>
</dependency> <!--配置xml客户端-->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-jaxb</artifactId>
<version>9.5.0</version>
</dependency> <dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
</dependency> <dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency> <!--httpclient-->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.5</version>
</dependency>
</dependencies>

(2)编写客户端测试代码

public interface ClientInterface {

    @RequestLine("GET /hello")
public String hello(); @RequestLine("GET /person/{id}")
public Person getPerson(@Param("id") Integer id); @RequestLine("POST /person/create")
@Headers("Content-Type: application/json")
public String createPerson(Person person); @RequestLine("POST /createXmlPerson/create")
@Headers("Content-Type: application/xml")
public Result createXmlPerson(Person person);
}
public static void main(String[] args) {
//hello
ClientInterface helloClient = Feign.builder().target(ClientInterface.class, "http://localhost:8080"); String hello = helloClient.hello();
System.out.println(hello); //json 创建 Person
ClientInterface creatPersonInter = Feign.builder()
.encoder(new GsonEncoder())
.target(ClientInterface.class, "http://localhost:8080"); Person person = new Person();
person.setAge(18);
person.setId(1);
person.setName("admin"); String result = creatPersonInter.createPerson(person);
System.out.println("result:" + result); //xml 创建 Person
JAXBContextFactory jaxbContextFactory = new JAXBContextFactory.Builder().build();
ClientInterface xmlClient = Feign.builder().encoder(new JAXBEncoder(jaxbContextFactory))
.decoder(new JAXBDecoder(jaxbContextFactory))
.target(ClientInterface.class, "http://localhost:8080/"); Person person1 = new Person();
person1.setAge(18);
person1.setId(1);
person1.setName("admin");
Result result2 = xmlClient.createXmlPerson(person1);
System.out.println("result:"+result2.getMessage());
}

二、自定义Feign客户端

1.编写myClient

import feign.Client;
import feign.Request;
import feign.Response;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils; import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Collection;
import java.util.HashMap; public class MyClient implements Client {
@Override
public Response execute(Request request, Request.Options options) throws IOException {
try {
System.out.println("自定义的client"); //创建一个默认的客户端
CloseableHttpClient httpClient = HttpClients.createDefault(); //获取调用的http方法
final String method = request.method(); //创建一个HttpClient 的 HttpRequest
HttpRequestBase httpRequestBase = new HttpRequestBase() {
@Override
public String getMethod() {
return method;
}
}; //设置请求地址
httpRequestBase.setURI(new URI(request.url())); //执行请求,获取响应
HttpResponse httpResponse = httpClient.execute(httpRequestBase); //获取响应的内容
byte[] body = EntityUtils.toByteArray(httpResponse.getEntity()); //将HttpClient d的响应对象转换为Feign的Response
Response response = Response.builder()
.body(body)
.headers(new HashMap<String, Collection<String>>())
.status(httpResponse.getStatusLine().getStatusCode())
.build();
return response;
} catch (URISyntaxException e) {
e.printStackTrace();
}
return null;
}
}

2.编写MyClientTest测试

public static void main(String[] args) {
ClientInterface clientInterface = Feign.builder()
.client(new MyClient())
.target(ClientInterface.class, "http://localhost:8080"); String hello = clientInterface.hello();
System.out.println(hello);
}

Feign 客户端的使用 二的更多相关文章

  1. Spring Cloud之Feign客户端超时时间配置

    关于雪崩效应: 默认情况下tomcat只有一个线程去处理客户端发送的所有请求.高并发情况下,如果客户端请求都在同一接口,tomcat的所有线程池去处理,导致其他接口服务访问不了,等待. Tomcat有 ...

  2. Spring Cloud之Feign客户端调用工具

    feign介绍 Feign客户端是一个web声明式http远程调用工具,提供了接口和注解方式进行调用. Spring Cloud 支持 RestTemplate  Fetin Feign客户端实际开发 ...

  3. Spring Boot使用Feign客户端调用远程服务时出现:timed-out and no fallback available,failed and no fallback available的问题解决

    timed-out and no fallback available: 这个错误基本是出现在Hystrix熔断器,熔断器的作用是判断该服务能不能通,如果通了就不管了,调用在指定时间内超时时,就会通过 ...

  4. Feign 客户端调用错误

    1.@RequestBody 必须要写在实现接口中 2.Feign 客户端调用的时候如果有参数的话,默认是发送post请求 3.服务接口中的请求参数必须要加上@RequestParam("r ...

  5. Springcloud 整合Hystrix 断路器,支持Feign客户端调用

    1,在这篇博文中,已经大致说过了Springcloud服务保护框架 Hystrix在服务隔离,服务降级,以及服务熔断中的使用 https://www.cnblogs.com/pickKnow/p/11 ...

  6. Feign客户端的重构,新建springcloud架构

    1,在上篇博文中,已经实现了feign 客户端来远程调用接口的功能,因为feign 客户端在springcloud 开发过程中是比较常用的方式 https://www.cnblogs.com/pick ...

  7. Feign客户端实现RPC 调用

    1,springcloud 中支持http调用的两种方式,RestTemplate,Feign客户端 2,Feign 客户端是一个声明式(注解方式)http 远程调用工具 3,实现方式如下: 第一步: ...

  8. WCF学习之旅—实现支持REST客户端应用(二十四)

    WCF学习之旅—实现REST服务(二十二) WCF学习之旅—实现支持REST服务端应用(二十三) 在上二篇文章中简单介绍了一下RestFul与WCF支持RestFul所提供的方法,及创建一个支持RES ...

  9. Jquery.Qrcode在客户端动态生成二维码并添加自定义Logo

    0 Jquery.Qrcode简介 Jquery.Qrcode.js是一个在浏览器端基于Jquery动态生成二维码的插件,支持Canvas和Table两种渲染方式,它的优点是在客户端动态生成,减轻了服 ...

随机推荐

  1. 跨域问题与SpringBoot解决方案

    什么是跨域? 定义:浏览器从一个域名的网页取请求另一个域名下的东西.通俗点说,浏览器直接从A域访问B域中的资源是不被允许的,如果想要访问,就需要进行一步操作,这操作就叫"跨域".例 ...

  2. php启动后netstat看不到9000端口的问题

    https://www.cnblogs.com/jonsea/p/5522018.html     php-fpm配置文件详解 其实就是PHP配置文件改一个参数 listen = 127.0.0.1: ...

  3. Nginx 反向代理,IP、端口,项目路径变化的问题

    这两天在云上部署公司项目,涉及到nginx反向代理,在部署完成测试,发现在下载文件的时候,无法下载,提示链接被拒绝. 假设nginx代理地址: http://121.53.21.188:9012/we ...

  4. K3CLOUD表关联

    销售订单关联发货通知单 销售订单表 T_SAL_ORDER A T_SAL_ORDERENTRY B T_SAL_ORDERENTRY_LK C 发货通知单表 T_SAL_DELIVERYNOTICE ...

  5. 解决scoped 下confirm 样式问题

  6. 学习python-20191108(1)Mysql、Flask

    一.使用pymysql模块操作MYSQL 导入pymysql模块: pip install pymysql 1.增删改 import pymysql # 定义数据库连接信息 config = {    ...

  7. WebFilter 在springBoot工程中不起作用

    [1]@ServletComponentScan 必须有一个注解将带有@WebFilter的类包含进去. [2]自定义 FiltersConfig extends WebMvcConfigurerAd ...

  8. 详解js面向对象编程

    转自:http://segmentfault.com/a/1190000000713346 基本概念 ECMA关于对象的定义是:”无序属性的集合,其属性可以包含基本值.对象或者函数.“对象的每个属性或 ...

  9. openssl nodejs https+客户端证书+usbkey

    mac sslconfig 文件路径 /System/Library/OpenSSL/openssl.cnf 一生成CA openssl req -new -x509 -keyout ca.key - ...

  10. C++中字符串的表示与转换

    转换总结 1.char*转string:可以直接赋值. 2.char[]转string:可以直接赋值. 3.char*转char[]:不能直接赋值,可以循环char*字符串逐个字符赋值,也可以使用st ...