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);
}

encodeIfNotVariablequery(String name, String... values) で呼び出されるメソッド。

これは{、最初の に と を含む値の場合、値をエンコードできないことを意味します。

どうすればこれを修正できますか?

4

1 に答える 1

0

文字 { は安全でない文字であるため、エンコードする必要があります。

キャラクターは、さまざまな理由で安全ではない可能性があります。....

……【欠品】……

ゲートウェイやその他のトランスポート エージェントがそのような文字を変更することがあることが知られているため、その他の文字は安全ではありません。これらの文字は、"{"、"}"、"|"、"\"、"^"、"~"、
"["、"]"、および "`" です。

すべての安全でない文字は、常に URL 内でエンコードする必要があります。たとえば、文字「#」は、通常はフラグメントまたはアンカー識別子を処理しないシステムでも URL 内でエンコードする必要があります。そのため、URL がそれらを使用する別のシステムにコピーされた場合、その URL を変更する必要はありません。 URL エンコーディング。

要約すると、文字は次の{ようにエンコードする必要があります%7B

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

より詳しい情報:

それ以外の場合、feign-netflixは { および } を使用して変数を配置し、それを で注釈が付けられた引数 params に置き換えますが、Spring @Param("name")impl を使用しており、必要に応じてそれを実行します。

于 2016-08-08T07:58:14.393 に答える