2016-08-02 130 views
0

我在spring-cloud中使用feign,我遇到了问题。查询值包含`{aa%`导致虚假返回的http状态代码400

这是我的假客户端def。

@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(字符串名称,字符串...值)。

这意味着如果包含{的值和第一个值不能被编码。

我该如何解决这个问题?

回答

0

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

字符可以是不安全的多种原因。 ....因为网关和其他传输剂已知有时修改这样的字符

.... [缺失部分] ....

其它字符是不安全的。这些字符是“{”,“}”,“|”,“\”,“^”,“〜”,
“[”,“]”和“`”。

所有不安全的字符必须始终在URL中进行编码。例如,即使在通常不处理片段或锚点标识符的系统中,字符“#”也必须在URL中进行编码,以便如果URL被复制到另一个使用它们的系统中,则不需要更改网址编码。

总之,性格{必须被编码为%7B

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

更多信息:

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