查询值包含`{aa%`原因feign返回http状态代码400

时间:2016-08-02 03:48:14

标签: spring-cloud spring-cloud-netflix netflix-feign feign

我在春云中使用假装,我遇到了问题。

这是我的假装客户端。

@FeignClient("food-service")
public interface FoodService {
    @RequestMapping(value = {"/food"},method = {RequestMethod.GET})
    List<Food> find(@RequestParam("name") String name);
}
foodService.find("{co%%");

此调用将返回状态码400。

然后我查看代码,并在RequestTemplate类中找到了这段代码:

private String encodeIfNotVariable(String in) {
    if (in == null || in.indexOf('{') == 0) {
        return in;
    }
    return urlEncode(in);
}

查询中调用的方法encodeIfNotVariable(String name,String ... values)。

这意味着如果包含{的值并且在第一个值中,则无法对该值进行编码。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

字符{是unsafe character,因此您必须对其进行编码:

  

由于多种原因,角色可能不安全。 ....

     

.... [缺少部分] ....

     

其他字符不安全,因为已知网关和其他传输代理有时会修改此类字符。这些字符是&#34; {&#34;,&#34;}&#34;,&#34; |&#34;,&#34; \&#34;,&#34; ^&# 34;,&#34;〜&#34;,
  &#34; [&#34;,&#34;]&#34;和&#34;`&#34;。

     

所有不安全的字符必须始终在URL中编码。例如,角色&#34;#&#34;必须在URL中编码,即使在通常不处理片段或锚标识符的系统中也是如此,因此如果将URL复制到另一个使用它们的系统中,则无需更改URL编码。

总之,字符{必须编码为%7B

foodService.find("%7Bco%%");

更多信息:

否则,feign-netflix使用{和}来放置变量,然后用带@Param("name")注释的参数params替换它,但是你正在使用spring impl,如果需要它就可以为你做。