【问题标题】:query value contain `{aa%` cause feign returned http status code 400查询值包含 `{aa%` 导致 feign 返回 http 状态码 400
【发布时间】:2016-12-07 06:41:09
【问题描述】:

我在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(String name, String... values)。

这意味着如果值包含{ 并且在第一个中,则该值不能被编码。

我该如何解决这个问题?

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

    综上所述,字符{必须编码为%7B

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

    更多信息:

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

    【讨论】:

      猜你喜欢
      • 2021-01-13
      • 2013-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-30
      • 1970-01-01
      相关资源
      最近更新 更多