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 调用服务及传递参数踩坑记录

Feign调用中的两种Header传参方式

SpringCloud中Feign服务调用请求方式及参数总结

spring cloud——feign为GET请求时的对象参数传递

谷粒商城笔记+踩坑(20)——订单确认页。feign异步请求头丢失问题+令牌保证幂等性