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());
}
}
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. –