2016-08-02 202 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,如果需要的話,它會爲您做。