2016-08-02 2 views
0

J'utilise feign au printemps-nuage, j'ai un problème.la valeur de la requête contient `{aa%` cause feign retourné le code de statut http 400

Ceci est mon défaut de client feign.

@FeignClient("food-service") 
public interface FoodService { 
    @RequestMapping(value = {"/food"},method = {RequestMethod.GET}) 
    List<Food> find(@RequestParam("name") String name); 
} 
foodService.find("{co%%"); 

cet appel sera retourné le code d'état 400.

Ensuite, je passe en revue le code, et je trouve ce code dans la classe RequestTemplate:

private String encodeIfNotVariable(String in) { 
    if (in == null || in.indexOf('{') == 0) { 
     return in; 
    } 
    return urlEncode(in); 
} 

La méthode encodeIfNotVariable appelée dans la requête (nom String, String ... valeurs).

Cela signifie que si la valeur contient { et dans le premier, la valeur ne peut pas être codée.

Comment puis-je résoudre ce problème?

Répondre

0

Le caractère {est un unsafe character vous devez donc encoder:

Les personnages peuvent être dangereux pour plusieurs raisons. ....

.... [partie manquante] ....

D'autres personnages ne sont pas sûrs parce que les passerelles et les autres agents de transport sont connus pour parfois modifier ces caractères. Ces caractères sont "{", "}", "|", "\", "^", "~",
"[", "]" et "` ".

Tous les caractères dangereux doivent toujours être codés dans une URL. Par exemple, le caractère "#" doit être codé dans les URL, même dans les systèmes qui ne traitent généralement pas les identificateurs de fragment ou d'ancre, de sorte que si l'URL est copiée dans un autre système qui les utilise, il ne sera pas nécessaire Encodage d'URL

En résumé, le caractère { doit être encodée comme %7B:

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

Plus d'infos:

Sinon, feign-netflix utilise {et} pour mettre des variables et ensuite les remplacer par des arguments params annotés avec @Param("name"), mais vous utilisez spring impl et c'est fait pour vous si c'est nécessaire.