【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秒会之异常处理系列)