JAVA踩坑记录Feign调用服务时,get请求参数异常
Posted Ethan_LiYan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA踩坑记录Feign调用服务时,get请求参数异常相关的知识,希望对你有一定的参考价值。
【场景】
server-1 服务,暴露的get请求接口:
@RequestMapping(value = "/empInfoPdf", method = RequestMethod.GET)
public String getEmpInfoPdf(EmpResumeQuery empResumeQuery) throws Exception
return empResumeService.getEmpInfoPdf(empResumeQuery);
server-2 服务,通过feign进行请求
@FeignClient("talent-server")
public interface TalentServerClient
/**
* 调用server-1暴露的接口
*/
@RequestMapping(value = "/talent/resume/empInfoPdf" , method = RequestMethod.GET)
String getEmpInfoPdf(@RequestBody EmpResumeQuery empResumeQuery);
结果,server-1 服务,接收到参数一直都是post请求!!!
检查feign调用方式与服务端所声明的方式一致,但是为什么为会变成Post请求呢?翻看源码,发现feign默认的远程调用使用的是jdk底层的HttpURLConnection,这在feign-core包下的Client接口中的convertAndSend方法可看到:
if (request.body() != null)
if (contentLength != null)
connection.setFixedLengthStreamingMode(contentLength);
else
connection.setChunkedStreamingMode(8196);
connection.setDoOutput(true);
OutputStream out = connection.getOutputStream();
if (gzipEncodedRequest)
out = new GZIPOutputStream(out);
else if (deflateEncodedRequest)
out = new DeflaterOutputStream(out);
try
out.write(request.body());
finally
try
out.close();
catch (IOException suppressed) // NOPMD
该段代码片段会判断requestBody是否为空,我们知道GET请求默认是不会有requestBody的,因此该段代码会执行到HttpURLConnection中的 private synchronized OutputStream getOutputStream0() throws IOException; 方法:
if (this.method.equals("GET"))
this.method = "POST";
最关键的代码片段已显示当请求方式为GET请求,会将该GET请求修改为POST请求!
【解决】
服务暴露的feign接口,如果是多参数,都用POST吧,简单粗暴。
或者在@RequestMapping注解中加入consumes的属性(不了解自行百度)
以上是关于JAVA踩坑记录Feign调用服务时,get请求参数异常的主要内容,如果未能解决你的问题,请参考以下文章
SpringCloud Feign调用服务接口时,GET请求变成POST请求报错 _
SpringCloud - Feign 调用服务及传递参数踩坑记录
SpringCloud中Feign服务调用请求方式及参数总结