关于原生feign发起请求时,参数注解的相关问题

先说结论:
POST请求必须指定请求头,body参数用@RequestBody或者@Param(需要一个一个写)。
GET请求,传参只能用@QueryMap,后边变量是Map形式,哪怕是一个参数也必须放到map里边。如果是路径变量,用@Param,路径中用{变量名}占位,注解的value为变量名。
以上所有结论只针对于原生feign。

首先是post请求:
如果不设置请求头的话,默认的是stream流的body形式,一定要指定。

@RequestLine("POST /test/post")
    @Headers({"Content-Type: application/json", "Accept: application/json"})
    JSONObject post(@QueryMap Map<String,Object> param, @RequestBody Map<String,Object> body);

①post请求如果有url路径参数,请求方式如上,可以正常接收。

Map<String,Object> param = new HashMap<>();
        param.put("query","ttttt");
        Map<String,Object> body = new HashMap<>();
        body.put("body","bbbb");
        JSONObject pp = testClient.post(param,body);

接收方打印结果:
关于原生feign发起请求时,参数注解的相关问题_第1张图片

②其实body也可以用另一种写法:

@RequestLine("POST /test/post")
    @Headers({"Content-Type: application/json", "Accept: application/json"})
    JSONObject post2(@QueryMap Map<String,Object> param, @Param("query") String query,
                     @Param("happy")String happy);

调用代码:

Map<String,Object> param = new HashMap<>();
        param.put("query","ttttt");
        Map<String,Object> body = new HashMap<>();
        body.put("body","bbbb");
        JSONObject qq = testClient.post2(param,"body","everyday");

打印结果如下:
关于原生feign发起请求时,参数注解的相关问题_第2张图片
说明用@Param注解也是可以的。

二、对于GET请求,
测试了几种方法,@Param,@RequestParam,@QueryMap(不填map,填单个参数)

@RequestLine("GET /test/get")
    JSONObject get(@QueryMap String query);

    @RequestLine("GET /test/get")
    JSONObject get2(@RequestParam("query") String query);

    @RequestLine("GET /test/get")
    JSONObject get3(@Param("query") String query);

调用:

JSONObject bb = testClient.get("getQuery");
        JSONObject cc = testClient.get2("getQuery");
        JSONObject dd = testClient.get3("getQuery");

发现都不行,找不到这个传递参数,信息如下:
关于原生feign发起请求时,参数注解的相关问题_第3张图片
关于原生feign发起请求时,参数注解的相关问题_第4张图片
关于原生feign发起请求时,参数注解的相关问题_第5张图片
目前发现想要传递参数只能用@QueryMap,然后参数用Map才行。
@Param用于路径变量传递见之前的博客路径变量

你可能感兴趣的:(日常工作问题,java,web开发,java,feign,http)