SpringCloud 之 Fegin —— 发送GET、POST请求以及文件上传
由于项目需要调用其他微服务的数据,首先想到的就是写一个http网络请求的工具类,但是想到在之前看springCloud的时候里面有这个Fegin可以实现,就顺便实践一下,虽然过程有点坎坷,好在都顺利解决了,在实践的过程中主要遇见了以下几个问题
1) 不同请求方式传参方式不同
2) 同一请求方式请求头信息不同
3) 发送请求时候的编码器不同
4) 文件上传
(一) Fegin使用
1) 添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
点击查看代码
2)在启动类上加上注解
@EnableEurekaClient
@EnableHystrixDashboard
@EnableFeignClients //这个就是使用Feign需要添加的注解
@SpringBootApplication
public class VideoProxyServiceApplication { public static void main(String[] args) {
SpringApplication.run(VideoProxyServiceApplication.class, args);
} }
点击查看代码
3)Feign 客户端接口
@Component
@FeignClient(name = "stream-service",url = "${stream_service}") //name指定FeignClient的名称,url一般用于调试,可以手动指定@FeignClient调用的地址
public interface StreamServiceClient { //GET请求
@RequestMapping(value = "/task/findById",method = RequestMethod.GET)
String findById(@RequestParam(value = "id") String id);
点击查看代码
4)在Controller层里调用
@RestController
@RequestMapping(value = "stream")
public class StreamServiceController {
@Autowired
private StreamServiceClient streamServiceClient; @RequestMapping(value = "/findById",method = RequestMethod.GET)
public ResponseResult findById(String id) {
String s = streamServiceClient.findById(id);
return responseResult(s, "jsonObject"); //ResponseResult是封装的一个返回对象,而responseResult是写的一个处理结果的公共方法,这里就不展示了
} 点击查看代码
点击查看代码
到这里整个Feign的使用基本上就结束了,但是如果你认为这样你就可以顺利的使用Feign,那么恭喜你,你将会很闹心,因为在调用别人的服务的时候你不确定人家到底是需要怎么取请求,如果是你写接口只要你自己测试通了那就万事大吉,可是现在是别人写的接口让你调,那么你就需要考虑很多问题了,至少在我实践中遇到的有这几种,请求头需要设置、请求的时候请求参数在路径上传参该怎么传等等一系列问题
划重点,我主要就是讲的运用,也就是在实际使用过程中对于不同的请求,我们应该怎么做
(二) GET请求
对于GET请求应该算是最简单的了,在这里我分两种来说,一种参数就在请求头上,还有一种是参数在路径中的
1) 对于参数在请求头中的请求
@RequestMapping(value = "/task/findById",method = RequestMethod.GET)
String findById(@RequestParam(value = "id") String id);
在@RequestMapping注解中value值是接口,method规定请求方式,在传参的时候注意一定要加上@RequestParam,值是请求的参数名
2)请求参数在路径中的请求
@RequestMapping(value = "/shrekapi/job/{id}",method = RequestMethod.GET)
String deletejob(@PathVariable("id") String id);
这里注意我们的注解是@PathVariable加上参数名
(三)POST请求
POST请求,请求的时候我遇到了三种情况,
1、请求参数在请求体中(这种方式其实是最方便的)
//
@RequestMapping(value = /addLable",method = RequestMethod.POST)
String addLable(@RequestBody PointMsg lableName);//PointMsg是实体类
请求的时候直接在参数前加上@RequestBody,定义方法为POST
2、请求参数在请求头中
//
@RequestMapping(value = "/updateStatusByCameraId",method = RequestMethod.POST)
String updateStatusByCameraId(@RequestParam("camera") String camera);
这种请求的产生应该是在写接口的时候参数前没有加注解造成的,其实这种方式跟GET请求是一模一样的
3、请求头映射条件不同
//删除标签
@RequestMapping(value = "/deleteLable",method = RequestMethod.POST,headers = {"content-type=application/x-www-form-urlencoded"})
String deleteLable(@RequestParam("id") String id);
对于需要更改请求头映射的直接使用headers,定义不同的映射
(四)文件上传、自定义编码器
由于文件上传的时候我们我们传参数的时候其实传的是文件,这个时候我们默认的编码器是不支持这种的,需要我们自定义编码器并应到我们的client
注:在网上很多提到了自定义编码器并使用@Configuration使其生效,最好不要这样,一旦使用了这个注解那就是全局都使用这个编码器了,那么你的其他请求就会出现问题,报编码器异常
我们的写的时候可以直接在客户端接口上指定使用哪个编码器,并且只在这个客户端接口生效,还有注意一点的就是,@FeignClient里面的name属性不可以和其他客户端接口重复,重复的话等于是同一个客户端接口还是会使用指定的编码器
@Component
@FeignClient(name = "stream-service-File",url = "${stream_service}",configuration = FileUploadServiceClient.FeignMultipartSupportConfig.class)
public interface FileUploadServiceClient {
//文件上传
@RequestMapping(value = "/importFile",method = RequestMethod.POST,produces = {MediaType.APPLICATION_JSON_UTF8_VALUE}, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
String upload(@RequestBody MultipartFile file); @RequestMapping(value = "/downloadExcel",method = RequestMethod.GET,consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
Response downloadFile(); //自定义文件上传编码器
class FeignMultipartSupportConfig { @Bean
public Encoder multipartFormEncoder() {
return new SpringFormEncoder();
} @Bean
public feign.Logger.Level multipartLoggerLevel() {
return feign.Logger.Level.FULL;
}
} }
到这里结束,如果遇到了新的问题欢迎一起探讨,上述所有都是在使用过程中遇到的一些问题,仅做记录,供君参考
SpringCloud 之 Fegin —— 发送GET、POST请求以及文件上传的更多相关文章
- Django 10 GET和POST(HttpRequest对象,GET和POST请求,文件上传,HttpResponse对象的cookie)
Django 10 GET和POST(HttpRequest对象,GET和POST请求,文件上传,HttpResponse对象的cookie) 一.HttpRequest对象 #HttpRequest ...
- Android okHttp网络请求之文件上传下载
前言: 前面介绍了基于okHttp的get.post基本使用(http://www.cnblogs.com/whoislcj/p/5526431.html),今天来实现一下基于okHttp的文件上传. ...
- 使用HttpClient 发送 GET、POST、PUT、Delete请求及文件上传
package org.caeit.cloud.dev.util; import java.io.File; import java.io.IOException; import java.io.Un ...
- 使用HttpClient 发送 GET、POST(FormData、Raw)、PUT、Delete请求及文件上传
httpclient4.3.6 package org.caeit.cloud.dev.util; import java.io.File; import java.io.IOException; i ...
- 测试平台系列(92) 让http请求支持文件上传
大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的教程,希望大家多多支持. 欢迎关注我的公众号米洛的测开日记,获取最新文章教程! 回顾 上一节呢,我们编写了oss的 ...
- Laravel请求/Cookies/文件上传
一.HTTP请求 1.基本示例:通过依赖注入获取当前 HTTP 请求实例,应该在控制器的构造函数或方法中对Illuminate\Http\Request 类进行类型提示,当前请求实例会被服务容器自动注 ...
- Android 普通okhttp、okhttp utils执行 post get请求,文件上传下载、请求图片
public class OKHttpActivity extends Activity implements View.OnClickListener { public static final M ...
- 前端笔记之微信小程序(三)GET请求案例&文件上传和相册API&配置https
一.信息流小程序-GET请求案例 1.1服务端接口开发 一定要养成接口的意识,前端单打独斗出不来任何效果,必须有接口配合,写一个带有分页.关键词查询的接口: 分页接口:http://127.0.0.1 ...
- springboot 文件上传及java使用post请求模拟文件上传
参考自:https://blog.csdn.net/qq_25958999/article/details/83988974 接收端Controller类中方法: @RequestMapping(va ...
随机推荐
- centOS安装python3 以及解决 导入ssl包出错的问题
参考: https://www.cnblogs.com/mqxs/p/9103031.html https://www.cnblogs.com/cerutodog/p/9908574.html 确认环 ...
- jenkins配置发送测试结果邮件
简单版: https://www.cnblogs.com/gcgc/p/5631385.html https://blog.51cto.com/qicheng0211/1919341 升级版 http ...
- js 计算是今天多少周
/** * 判断年份是否为润年 * * @param {Number} year */ function isLeapYear(year) { return (year % 400 == 0) || ...
- 【原创】基于NodeJS Express框架开发的一个VIP视频网站项目及源码分享
项目名称:视频网站项目 开发语言:HTML,CSS(前端),JavaScript,NODEJS(expres)(后台) 数据库:MySQL 开发环境:Win7,Webstorm 上线部署环境:Linu ...
- models中字段参数blank和null的用法区别
blank当blank=True时,说明此处的数据可以不填,默认情况下为False,也就意味着默认情况下,所输入的数据不得空,blank是和页面表单有关,在页面需要输入参数的时候,如果在models里 ...
- 获取springbean的几种方式
首先我说一下我遇到的问题,再项目初始化时候,spring容器初始化前要执行的操作中使用到了bean去做一些增删改查操作,这样做是不能自己使用springbean的数据源去操作的,所以需要动态获取spr ...
- 【模板】Link-Cut Tree
#include<cstdio> #include<algorithm> #define N 500010 #define rg register #define ls (c[ ...
- 2019字节跳动冬令营day7娱乐赛19题题解
啊没去听讲题,也没发纸质题解,电子版题解也没有 为最后几个unsolve自闭了一段时间才全都A掉 3个队友写的我没看的题通过人数蛮多就不管了 题目地址:https://pan.baidu.com/s/ ...
- 精彩的linux shell 命令
1. Star Wars (telnet) telnet是基于Telnet协议的远程登录客户端程序,经常用来远程登录服务器.除此还可以用它来观看星球大战: telnet towel.blinken ...
- EasyUI 在textbox里面输入数据敲回车后查询和普通在textbox输入数据敲回车的区别
EasyUI实现回车键触发事件 $('#id').textbox('textbox').keydown(function (e) { if (e.keyCode == 13) { alert('ent ...