2017-07-04 3 views
0

Wir haben dieses seltsame Problem mit der Anfrage Host-Header als URL der Anwendung festgelegt aufgetreten. Dies führt dazu, dass das externe System nicht mit unseren Anforderungen umgehen kann.Spring Integration Falscher Host-Header

Hier ist die DEBUG Log von Apache der Spring Integration application gehostet auf localhost:8082. Sie nicht den Inhalt für jetzt etwas dagegen, aber der Content-Type wird ein Problem sein später:

org.apache.http.wire - http-outgoing-0 >> "POST /health HTTP/1.1[\r][\n]" 
org.apache.http.wire - http-outgoing-0 >> "Accept: */*[\r][\n]" 
org.apache.http.wire - http-outgoing-0 >> "cookie: PHPSESSID=ost897ibh0j7rovf2rudr33c22[\r][\n]" 
org.apache.http.wire - http-outgoing-0 >> "host: localhost:8082[\r][\n]" 
org.apache.http.wire - http-outgoing-0 >> "connection: keep-alive[\r][\n]" 
org.apache.http.wire - http-outgoing-0 >> "Cache-Control: no-cache[\r][\n]" 
org.apache.http.wire - http-outgoing-0 >> "Content-Type: application/xml[\r][\n]" 
org.apache.http.wire - http-outgoing-0 >> "accept-encoding: gzip, deflate[\r][\n]" 
org.apache.http.wire - http-outgoing-0 >> "user-agent: PostmanRuntime/6.1.6[\r][\n]" 
org.apache.http.wire - http-outgoing-0 >> "Content-Length: 4[\r][\n]" 
org.apache.http.wire - http-outgoing-0 >> "[\r][\n]" 
org.apache.http.wire - http-outgoing-0 >> "test" 
org.apache.http.wire - http-outgoing-0 << "HTTP/1.1 200 OK[\r][\n]" 
org.apache.http.wire - http-outgoing-0 << "Content-Type: application/json[\r][\n]" 
org.apache.http.wire - http-outgoing-0 << "Transfer-Encoding: chunked[\r][\n]" 
org.apache.http.wire - http-outgoing-0 << "Server: Jetty(9.2.z-SNAPSHOT)[\r][\n]" 
org.apache.http.wire - http-outgoing-0 << "[\r][\n]" 
org.apache.http.wire - http-outgoing-0 << "27[\r][\n]" 
org.apache.http.wire - http-outgoing-0 << "{"success":true,"message":"Service up"}" 
org.apache.http.headers - http-outgoing-0 << HTTP/1.1 200 OK 
org.apache.http.headers - http-outgoing-0 << Content-Type: application/json 
org.apache.http.headers - http-outgoing-0 << Transfer-Encoding: chunked 
org.apache.http.headers - http-outgoing-0 << Server: Jetty(9.2.z-SNAPSHOT) 
org.apache.http.wire - http-outgoing-0 << "[\r][\n]" 
org.apache.http.wire - http-outgoing-0 << "0[\r][\n]" 
org.apache.http.wire - http-outgoing-0 << "[\r][\n]" 

und hier ist die Anforderung mit curl getan:

curl -v -X POST http://localhost:9292/health 
* Trying ::1... 
* TCP_NODELAY set 
* Connected to localhost (::1) port 9292 (#0) 
> POST /health HTTP/1.1 
> Host: localhost:9292 
> User-Agent: curl/7.54.0 
> Accept: */* 
> 
< HTTP/1.1 200 OK 
< Content-Type: application/json 
< Transfer-Encoding: chunked 
< Server: Jetty(9.2.z-SNAPSHOT) 

So mit Frühling Integration org.apache.http.wire - http-outgoing-0 >> "host: localhost:8082[\r][\n]"

und mit curl > Host: localhost:9292

Wir können dieleicht lösenProblem in Spring Integration durch den Header-Mapper der outgate Einstellung: handler.setHeaderMapper(new DefaultHttpHeaderMapper());

org.apache.http.wire - http-outgoing-0 >> "POST /health HTTP/1.1[\r][\n]" 
org.apache.http.wire - http-outgoing-0 >> "Accept: application/json, application/*+json[\r][\n]" 
org.apache.http.wire - http-outgoing-0 >> "Content-Type: text/plain;charset=UTF-8[\r][\n]" 
org.apache.http.wire - http-outgoing-0 >> "Content-Length: 4[\r][\n]" 
org.apache.http.wire - http-outgoing-0 >> "Host: localhost:9292[\r][\n]" 
org.apache.http.wire - http-outgoing-0 >> "Connection: Keep-Alive[\r][\n]" 
org.apache.http.wire - http-outgoing-0 >> "User-Agent: Apache-HttpClient/4.5.2 (Java/1.8.0_112)[\r][\n]" 
org.apache.http.wire - http-outgoing-0 >> "Accept-Encoding: gzip,deflate[\r][\n]" 
org.apache.http.wire - http-outgoing-0 >> "[\r][\n]" 
org.apache.http.wire - http-outgoing-0 >> "test" 

So waren wir in der Lage, das Problem mit dem Host Header zu lösen, leider scheint es, dass der Content-Type Satz durch eine enricher ignoriert wurde und wurde auf text/plain anstelle von application/xml festgelegt.

Was scheint hier das Problem zu sein? Ich gehe davon aus, dass dies nur mit einem einfachen DefaultHttpHeaderMapper zu tun hat.

Hier ist die Strömungskonfiguration Schnipsel:

public class BasicIntegrationConfig { 

    @Bean 
    public MessageChannel basicRequestChannel() { 
     return MessageChannels.publishSubscribe().get(); 
    } 

    @Bean 
    public MessageChannel basicResponseChannel() { 
     return MessageChannels.publishSubscribe().get(); 
    } 

    @Bean 
    public MessagingGatewaySupport basicInGate() { 
     HttpRequestHandlingMessagingGateway handler = new HttpRequestHandlingMessagingGateway(); 

     RequestMapping mapping = new RequestMapping(); 
     mapping.setPathPatterns("api/v1/basic"); 
     mapping.setMethods(HttpMethod.GET); 
     mapping.setProduces(MediaType.APPLICATION_JSON_UTF8_VALUE); 
     handler.setRequestMapping(mapping); 

     handler.setRequestChannel(basicRequestChannel()); 
     handler.setReplyChannel(basicResponseChannel()); 

     return handler; 
    } 

    @Bean 
    public MessageHandler basicOutGate() { 
     HttpRequestExecutingMessageHandler handler = 
       new HttpRequestExecutingMessageHandler("http://localhost:9292/health"); 
     handler.setHttpMethod(HttpMethod.POST); 
     handler.setExpectedResponseType(BaseResponse.class); 
     handler.setRequestFactory(new HttpComponentsClientHttpRequestFactory()); 
     handler.setHeaderMapper(new DefaultHttpHeaderMapper()); 
     return handler; 
    } 

    @Bean 
    public IntegrationFlow basicFlow() { 
     return (IntegrationFlowDefinition<?> f) -> f 
       .channel(basicRequestChannel()) 
       .log("basic") 
       .handle((GenericHandler<Object>) (o, map) -> "test") 
       .enrichHeaders(e -> e.header(MessageHeaders.CONTENT_TYPE, MediaType.APPLICATION_XML_VALUE, true)) 
       .log("basic") 
       .handle(basicOutGate()) 
       .log("basic") 
       .enrichHeaders(e -> e.header(MessageHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_UTF8_VALUE, true)) 
       .channel(basicResponseChannel()); 
    } 
} 

Antwort

0

Verwenden

DefaultHttpHeaderMapper mapper = DefaultHttpHeaderMapper.outboundMapper(); 
mapper.setExcludedOutboundStandardRequestHeaderNames(new String[] { "Host" }); 
handler.setHeaderMapper(mapper); 
+0

Danke für die präzise und richtige Antwort @Gary Russel! Ich habe http://docs.spring.io/spring-integration/api/org/springframework/integration/http/support/DefaultHttpHeaderMapper.html während des Traffics untersucht, sollte das getan haben, bevor ich die Frage gepostet habe. –