springCloud-feign

Feign的使用

Feign是Netflix开发的声明式、模板化的HTTP客户端,Feign可以帮助我们更快捷、优雅地调用HTTP API。在Spring Cloud中,使用Feign非常简单——创建一个接口,并在接口上添加一些注解,代码就完成了。Feign支持多种注解,例如Feign自带的注解或者JAX-RS注解等。Spring Cloud对Feign进行了增强,使Feign支持了Spring MVC注解,并整合了Ribbon和Eureka,从而让Feign的使用更加方便。Spring Cloud Feign是基于Netflix feign实现,整合了Spring Cloud Ribbon和Spring Cloud Hystrix,除了提供这两者的强大功能外,还提供了一种声明式的Web服务客户端定义的方式。Spring Cloud Feign帮助我们定义和实现依赖服务接口的定义。在Spring Cloud feign的实现下,只需要创建一个接口并用注解方式配置它,即可完成服务提供方的接口绑定,简化了在使用Spring Cloud Ribbon时自行封装服务调用客户端的开发量。Spring Cloud Feign具备可插拔的注解支持,支持Feign注解、JAX-RS注解和Spring MVC的注解。

Feign在使用过程中的传参问题,以下作为记录总结

a. Feign作为消费者GET方式去消费服务

  1. 在所有参数前加上@RequestParam注解。method可加,可不加,为了简单,个人觉得直接加上。

b. Feign作为消费者POST方式去消费服务

  1. 在所有参数前加上@RequestParam注解。method加上Post.

c. 使用@RequestBody注解(有且至多一个,多了报错),其他的参数前,必须使用@RequstParam。

tips:

  1. 服务消费者中,使用feign消费服务时,如果参数前什么也不写,那么默认是由@RequestBody指明的。

  2. 单参参数前未使用@RequestParam或参数前使用了@RequestBody注解(此时不论是否手动指定请求方式、不论指定的方式是POST还是GET,那么最终都以POST方式消费服务)

  3. @RequestBody注解的参数,需要POST方式才能传递数据。

  4. @RequstParam("name"),这个变量名说是可加,可不加(接受参数名字和传递过来变量名字一致时候),建议加上。测试时候省事。

服务提供者

在服务提供者的Controller中,如果要接收(服务消费中传过来的)被@RequestBody指明的参数,那么对应方法的对应参数前一定要有@RequestBody;(如果没有的话,收到的参数值就为null;如果写成@RequestParam的话,那么feign调用会失败)如果要接收(服务消费中传过来的)被@RequestParam指明的参数,那么可以写@RequestParam,也可以不写(当服务提供者中对应的参数名字与服务消费者传过来的参数名字一致时,可以不写,不一致时,需要写)

a. 多参数以get方式消费服务提供者全部参数加上@RequestParam,method可加可不加,建议加上。

b. 以post方式消费服务提供者多参数时,如果服务消费者想采用POST进行feign调用,那么:服务消费者中该接口方法里的这些参数前,最多只能有一个参数是@RequestBody指明的,其余的参数必须使用@RequestParam指明。

c. 如果服务消费者传过来参数时,全都用的是@RequestParam的话,那么服务提供者的Controller中对应参数前可以写@RequestParam,也可以不写(当两边参数名字一致时,可以省略不写)

d. 如果服务消费者传过来参数时,有@RequestBody的话,那么服务提供者的Controller中对应参数前必须要写@RequestBody(如果是多参数的话,其余参数前视情况可以写@RequestParam,也可以不写)

tips: 如果接口与接口的实现分别处于两个服务中,那么接口就相当于服务消费者,而接口的实现则相当于服务提供者。两者之间仍然满足本文上所述要求。

@RequestParam与@RequestBody的区别

@RequestParam用来处理Content-Type: 为application/x-www-form-urlencoded编码的内容。(Http协议中,如果不指定Content-Type,则默认传递的参数就是application/x-www-form-urlencoded类型)RequestParam可以接受简单类型的属性,也可以接受对象类型。实质是将Request.getParameter() 中的Key-Value参数Map利用Spring的转化机制ConversionService配置,转化成参数接收对象或字段。

tips: 在Content-Type: application/x-www-form-urlencoded的请求中,get 方式中queryString的值,和post方式中 body data的值都会被Servlet接受到并转化到Request.getParameter()参数集中,所以@RequestParam可以获取的到。

@RequestBody处理HttpEntity传递过来的数据,一般用来处理非Content-Type: application/x-www-form-urlencoded编码格式的数据。

  1. GET请求中,因为没有HttpEntity,所以@RequestBody并不适用。
  2. POST请求中,通过HttpEntity传递的参数,必须要在请求头中声明数据的类型Content-Type,SpringMVC通过使用HandlerAdapter 配置的HttpMessageConverters来解析HttpEntity中的数据,然后绑定到相应的bean上。

转载于:https://my.oschina.net/1than/blog/3023349

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值