0

我在 spring-cloud 中使用 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在 query(String name, String... values) 中调用的方法。

这意味着如果值包含{and 在 first 中,则该值不能被编码。

我怎样才能解决这个问题?

4

1 回答 1

0

字符 { 是一个不安全的字符,因此您必须对其进行编码:

由于多种原因,字符可能不安全。……

.... [遗失的部分]....

其他字符是不安全的,因为已知网关和其他传输代理有时会修改这些字符。这些字符是“{”、“}”、“|”、“\”、“^”、“~”、
“[”、“]”和“`”。

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

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

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

更多信息:

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

于 2016-08-08T07:58:14.393 回答