2016-08-02 2 views
0

Я использую симуляцию в весеннем облаке, у меня есть проблема.значение запроса содержит `{aa%` причина feign возвращен http status code 400

Это мой модный клиент.

@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, String ... значения).

Это означает, что если значение содержит { и в первом случае значение не может быть кодировано.

Как это исправить?

ответ

0

Символ {является unsafe character, так что вы должны кодировать его:

Символы могут быть небезопасными по ряду причин. ....

.... [недостающая часть] ....

Других символы небезопасны, поскольку шлюзы и другие транспортные средства известны иногда модифицируют такие символы. Этими символами являются «{», «}», «|», «\», «^», «~»,
«[", "]" и "`.

Все небезопасные символы всегда должны быть закодированы в URL-адресе. Например, символ «#» должен быть закодирован в URL-адресах даже в системах, которые обычно не обрабатывают идентификаторы фрагментов или якорей, поэтому, если URL-адрес скопирован в другую систему, которая их использует, нет необходимости изменять URL-кодирование.

В целом, характер { должен быть закодирован как %7B:

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

Подробнее:

В противном случае feign-netflix использует {и} для размещения переменных, а затем заменяет его параметрами params, аннотированными @Param("name"), но вы используете Spring impl, и это делает это для вас, если это необходимо.