2017-12-18 2 views
1

Wir haben eine einfache Kamelroute "Von-> auf":Http-Header Content-Length in Kamel cxf Client-Anfrage

<from uri="cxf:bean:testServiceProvider?loggingFeatureEnabled=true" /> 
<to uri="cxf:bean:testServiceClient?loggingFeatureEnabled=true" /> 

Diese Route wirkt wie ein Router oder Proxy für eine dritte Web-Service-Partei:

  • Clients verwenden es als Endpunkt.
  • Fügt der Soap-Nachricht WSS-Header hinzu.
  • Route Anforderungen an echte Endpunkt.

Dienst und Client in diesem Proxy werden mit cxf Beans erstellt.

Der Webdienst des Endpunkts scheint Content-Length HTTP-Header zu erfordern, aber cxf Anforderungen an Endpunkt enthält diesen Header standardmäßig nicht. Alle von diesem Proxy getan Anfragen erhalten die gleiche Antwort:

HTTP response '411: Length required' when communicating with https://host:port/testService 

Wir haben versucht, diesen Titel mit einem OutInterceptor hinzuzufügen, und fügte hinzu, es zu PROTOCOL_HEADERS:

Map<String, List> headers = (Map<String, List>) message.get(Message.PROTOCOL_HEADERS); 
headers.put("Content-Length", Collections.singletonList(String.valueOf(messageLength))); 

Zwei Fragen:

Wie kenne den Wert messageLength? Gibt es einen einfacheren Weg, dies zu tun?

Danke!

Antwort

0

Sie mit http versuchen: Leitung, deaktivieren AllowChunking. Dadurch wird erzwungen, dass cxf den Content-Length-Header in die Anfrage aufnimmt. Standardmäßig ermöglicht das cxf-Verhalten das Chunking, so dass das Problem, dem Sie gegenüberstehen, generiert werden kann, selbst wenn Sie den Content-length-Header angeben.

<http:conduit name="{http://namespace}WebService.http-conduit"> 
    <http:client AllowChunking="false" CacheControl="No-Cache" 
ContentType="text/xml;charset=UTF-8" ConnectionTimeout="900000" 
ReceiveTimeout="900000" Connection="Keep-Alive" /> 
</http:conduit> 
+0

Schön! Endlich arbeiten. Danke @jarey – jakinho

0

Wenn Sie sich die CXF-Dokumentation ansehen, können Sie möglicherweise die relayHeaders-Funktionalität verwenden, um Header vom Endpunkt "von" zum Endpunkt "to" zu propagieren.

CXF Bean Docs

Alternativ können Sie den Wert des Content-Length von der eingehenden Nachricht kopieren, wie hier vorgeschlagen ...

„Wenn Sie diese Header in der alten Version von Kamel behalten möchten, Sie benötigen , um die Header in eine Map einzufügen und diese Map in den Nachrichtenheader mit den Schlüssel "org.apache.cxf.message.PROTOCOL_HEADERS" einzufügen. "

Copy headers

+0

Danke für die Antwort @PillHead, aber der Proxy fügt der Soap-Nachricht Web-Service-Security-Header hinzu, so dass die Inhaltslänge nicht identisch ist. Ich werde meine Frage bearbeiten. – jakinho

Verwandte Themen