2016-07-22 23 views
3

Ich rufe eine Spring Data Erholung URL Frühling Integration mit einem <int-http:outbound-gateway>.Frühling Integration mit Spring Data Rest: leer Nutzlast in Antwort von Outbound-Gateway

Mein Aufruf ist eine einfache HTTP GET gegenüber einer bekannten Ressource URL (in meinem Fall, "Beispiele").

Dies ist die Konfiguration des <int-http:outbound-gateway>:

<int-http:outbound-gateway id="internalGW" request-channel="dataRestChannel" 
    encode-uri="true" url-expression="payload" 
    http-method="GET" extract-request-payload="true" 
    header-mapper="headerMapper"> 
</int-http:outbound-gateway> 

In den Protokollen ich diese Meldung sehen: Attribut

Die ‚extractPayload‘, da die HTTP keine Relevanz für die aktuelle Anfrage hat Die Methode ist 'GET', und für diese Methode wird kein Anforderungshauptteil gesendet.

Ich nehme an, dass das auf die http-method="GET" extract-request-payload="true" Konfiguration verwiesen wird, aber ich weiß nicht, ob diese Warnung für die Frage relevant ist.

Dies ist der Aufruf von diesem ausgehenden Kanal mit einer Nachricht, die die URL enthält REST aufgerufen werden:

public Object invokeUrl(String url){ 
    MessagingChannel messagingChannel = (MessagingChannel)ApplicationContextResolver.getApplicationContext().getBean("requestChannelBean"); 
    MessageChannel dataRestChannel = messagingChannel.getDataRestChannel(); 
    MessagingTemplate messagingTemplate = new MessagingTemplate(); 
    Message<?> requestMessage = MessageBuilder.withPayload(url).build(); 
    Message<?> response = messagingTemplate.sendAndReceive(dataRestChannel, requestMessage); 
    return response.getPayload(); 
} 

Der Aufruf ist in Ordnung, ich habe einen HTTP-Statuscode 200; dies ist die response.getPayload():

<200 OK, 
{ 
    Server=[Apache-Coyote/1.1], 
    Cache-Control=[no-cache,no-store,max-age=0,must-revalidate], 
    Pragma=[no-cache], 
    Expires=[0], 
    X-XSS-Protection=[1; mode=block], 
    X-Frame-Options=[DENY,DENY], 
    X-Content-Type-Options=[nosniff,nosniff], 
    Transfer-Encoding=[chunked], 
    Date=[Fri,22 Jul 2016 13:03:22 GMT], 
    Content-Type=[application/hal+json], 
    Content-Length=[0] 
}> 

Aber ich verstehe nicht, warum der „Nutzlast Körper“ ist leer, wie Sie in den Content-Length-Header sehen.

response GenericMessage<T> (id=219) 
    headers MessageHeaders (id=221)  
    payload ResponseEntity<T> (id=222) 
     body null  
     headers HttpHeaders (id=224) 
     statusCode HttpStatus (id=159)  

Wenn ich direkt auf diese URL mit einem GET auf dem Browser gehen, das ist die Antwort, die ich erhalten:

{ 
    "_embedded": { 
     "examples": [] 
    }, 
    "_links": { 
     "self": { 
      "href": "http://localhost:8080/restapp/api/examples" 
     }, 
     "profile": { 
      "href": "http://localhost:8080/restapp/api/profile/examples" 
     } 
    } 
} 

Ich würde dies als Antwort-Payload erwartet, keine leere Nutzlast.

Es scheint, dass der ResponseEntity.body, den ich erhalte, leer ist.

Gibt es eine Möglichkeit, das gleiche JSON-Ergebnis des HTTP-Get mit dem Outbound-Gateway zu erhalten?

Vielen Dank im Voraus.

UPDATE

Wie aus Gary Vorschlag habe ich den Datenverkehr überwacht.

Hier gibt es die Details der Anfragen:

Frühling Integration Anfrage:

GET http://localhost:8080/restapp/api/examples HTTP/1.1 
Host: localhost:8080 
Connection: keep-alive 
Cache-Control: max-age=0 
Upgrade-Insecure-Requests: 1 
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 
Accept-Encoding: gzip, deflate, sdch 
Accept-Language: it-IT,it;q=0.8,en-US;q=0.6,en;q=0.4 

Browser-Anfrage:

GET http://localhost:8080/restapp/api/examples HTTP/1.1 
Host: localhost:8080 
Connection: keep-alive 
Cache-Control: max-age=0 
Upgrade-Insecure-Requests: 1 
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 
Accept-Encoding: gzip, deflate, sdch 
Accept-Language: it-IT,it;q=0.8,en-US;q=0.6,en;q=0.4 
Cookie: JSESSIONID=C966FB7DB6B172D530D7C1F4DC57C6B8 

Die Anfragen scheint gleich zu sein, mit Ausnahme eines Kopf (die Cookie-JSESSIONID fehlt im Integrationskontext).

UPDATE 2

Vielleicht habe ich den Grund der leeren Nutzlast auf die Antwort gefunden.

"extractData" Die Methode der org.springframework.web.client.RestTemplate hat die Objektinstanz this.delegate auf einen Nullwert gefassten.

Also, im Gegenzug gibt es ein ResponseEntity Objekt ohne den Körper.

@Override 
public ResponseEntity<T> extractData(ClientHttpResponse response) throws IOException { 
    if (this.delegate != null) { // this.delegate is null 
     T body = this.delegate.extractData(response); 
     return new ResponseEntity<T>(body, response.getHeaders(), response.getStatusCode()); 
    } 
    else { 
     return new ResponseEntity<T>(response.getHeaders(), response.getStatusCode()); // <- it's executed this one 
    } 
} 

Es wäre interessant herauszufinden, warum dieses delegate auf null gesetzt ist.

+0

Es gibt wahrscheinlich etwas anderes in der Anfrage. Ich schlage vor, dass Sie einen TCP-Monitor verwenden (es gibt einen eingebauten Eclipse, oder verwenden Sie wireshark usw.), um die beiden Anfragen/Antworten zu vergleichen. Wenn Sie es nicht herausfinden können, bearbeiten Sie die Frage mit den Netzwerk-Traces. –

+0

Danke für den Vorschlag, Gary. Ich habe die Frage mit den Details der Anfragen bearbeitet. –

+0

Hört sich an, als ob Ihre Server-App eine Sitzung benötigt (Login?) - Sie müssen auf der Serverseite debuggen. –

Antwort

3

Sie müssen expected-response-type="java.lang.String" zum Gateway hinzufügen.

+0

Es hat funktioniert! Vielen Dank! –