2

Ich habe einen Anwendungsfall, in dem ich alle Header, die mit einem bestimmten Präfix beginnen, an den Schein-Client übergeben muss. Ich kenne die Anzahl oder genaue Namen dieser Header nicht. Es scheint keinen Weg zu geben, dies leicht zu tun, da der Feign-Client erwartet, dass alle Header unter Verwendung von @RequestHeader("name") spezifiziert werden. Es scheint nicht so etwas wie @RequestHeader HttpHeaders zu unterstützen, was sehr nützlich wäre. Irgendwelche Vorschläge?Wie kann man eine beliebige Anzahl von Kopfzeilen an den Feign-Client übergeben, ohne alle Namen zu kennen?

Antwort

2

Zum Zeitpunkt des Schreibens, hat Feign keine dynamischen Header oder Abfrageparameter unterstützt eine Karte. Der Spring Cloud Feign-Client basiert auf den Spring-Annotationen anstelle von Feign-Annotationen, und die Implementierungen von AnnotatedParameterProcessor haben einen Fehler, sodass sie nicht tun, was die Dokumentation angibt, dass sie tun sollten.

RequestHeader doc:

Wenn die Methode Parameter Karte, MultiValueMap oder httpheaders dann die -Karte mit allen Header-Namen und Werten gefüllt wird.

RequestParam doc:

Wenn die Methode Parameter-Karte oder eine MultiValueMap und ein Parametername ist nicht angegeben ist, dann wird die Karte Parameter mit allen Anfrage Parameternamen und Werte aufgefüllt wird.

Ich habe eine pull request eingereicht, die das beheben wird. Bis dahin verwende ich eine Erweiterung von SpringMvcContract, die meine eigenen AnnotatedParameterProcessor Implementierungen verwendet. Ich habe die Gewohnheit SpringMvcContract ein Feign.Builder wie folgt verwendet:

@Autowired 
FormattingConversionService feignConversionService; 

@Bean 
@Scope(SCOPE_PROTOTYPE) 
public Feign.Builder feignBuilder() { 
    return HystrixFeign.builder() 
      .contract(feignContract()); 
} 

@Bean 
public Contract feignContract() { 
    return new EnhancedSpringMvcContract(feignConversionService); 
} 
0

Von der documentation sollten Sie in der Lage sein, eine Kopfzuordnung für dynamische Kopfzeilen anzugeben.

In Fällen, in denen sowohl die Header-Feld Schlüssel und Werte sind dynamisch und die Bandbreite der möglichen Schlüssel nicht vor der Zeit bekannt sein und zwischen den verschiedenen Methodenaufrufe in der gleichen api/Client (zB benutzerdefinierte Metadaten-Header-Felder diese variieren können Als "x-amz-meta- " oder "x-goog-meta-" kann ein Map-Parameter mit HeaderMap versehen werden, um eine Abfrage zu erstellen, die den Inhalt der Map als Header-Parameter verwendet.

@RequestLine("POST /") 
void post(@HeaderMap Map<String, Object> headerMap); 
+0

funktioniert nicht. Überprüfen Sie meine [hier] (https://gist.github.com/abhijitsarkar/c3ab6269ef92c8f0323ca2a1bf8b8bda), die reproduzierbaren Code hat. –

Verwandte Themen