java.net.SocketException: Unexpected end of file from server mit Spring RestTemplate
Hab ich schon überprüft, mehrere Fragen /Antworten zu ähnlichen Themen, aber kann nicht finden die richtige Antwort für mein Fall.
Ich bin mit Spring RestTemplate aber nicht die Antwort, die vom server eines Dritten, mit der folgenden Ausnahme:
Exception in thread "main" org.springframework.web.client.ResourceAccessException: I/O error on POST request for "http://64.76.157.19:8283/ENAP/ProveedorExterno/v1.0/insertarUltimaPosicion":Unexpected end of file from server; nested exception is java.net.SocketException: Unexpected end of file from server
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:567)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:512)
at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:454)
at cl.waypoint.integracion.GenericCallback.sendEnap(GenericCallback.java:187)
at cl.waypoint.integracion.GenericCallback.main(GenericCallback.java:167)
Caused by: java.net.SocketException: Unexpected end of file from server
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:718)
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:579)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1322)
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:468)
at org.springframework.http.client.SimpleClientHttpResponse.getRawStatusCode(SimpleClientHttpResponse.java:48)
at cl.waypoint.integracion.GenericCallback$LoggingRequestInterceptor.log(GenericCallback.java:229)
at cl.waypoint.integracion.GenericCallback$LoggingRequestInterceptor.intercept(GenericCallback.java:216)
at org.springframework.http.client.InterceptingClientHttpRequest$RequestExecution.execute(InterceptingClientHttpRequest.java:84)
at org.springframework.http.client.InterceptingClientHttpRequest.executeInternal(InterceptingClientHttpRequest.java:69)
at org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:48)
at org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:53)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:551)
... 4 more
Aber wenn Sie den gleichen request/Header/Nutzlast mithilfe der Befehlszeile curl scheint es überhaupt kein problem, dies ist der verbose Ausgabe:
* Trying A.B.C.D...
* Connected to A.B.C.D (A.B.C.D) port 8283 (#0)
> POST /ENAP/ProveedorExterno/v1.0/insertarUltimaPosicion HTTP/1.1
> Host: A.B.C.D:8283
> User-Agent: curl/7.43.0
> Accept: */*
> Content-Type: application/json
> Authorization: Bearer dsgfsdgf786dsfg7dsgf
> Content-Length: 567
>
* upload completely sent off: 567 out of 567 bytes
< HTTP/1.1 200 OK
< Access-Control-Allow-Origin: *
< Access-Control-Allow-Methods: POST
< Access-Control-Allow-Headers: authorization,Access-Control-Allow-Origin,Content-Type
< Content-Type: application/json
< Date: Wed, 27 Jul 2016 13:35:26 GMT
< Transfer-Encoding: chunked
<
* Connection #0 to host 64.76.157.19 left intact
PS: Autorisierungs-und token-server die IP-Adresse geändert wurden aus Gründen der Sicherheit.
Frühling scheint zu hängen, für eine Weile und dann, dann werfen die Ausnahme ist, ist es vielleicht etwas zu warten, standardmäßig...Content-Length-header auf die Antwort? Wenn dem so ist, kann das überschrieben werden?
Ausnahme stammt aus der folgenden interceptor:
class LoggingRequestInterceptor implements ClientHttpRequestInterceptor {
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
throws IOException {
ClientHttpResponse response = execution.execute(request, body);
log(request, body, response);
return response;
}
private void log(HttpRequest request, byte[] body, ClientHttpResponse response) throws IOException {
HttpHeaders headers = request.getHeaders();
System.out.println("=============================");
for (Entry<String, List<String>> header : headers.entrySet()) {
System.out.println(header.getKey() + ": " + header.getValue());
}
System.out.println("=============================");
System.out.println(new String(body));
System.out.println(response.getRawStatusCode());
System.out.println(response.getStatusText());
}
}
Das aus dem folgenden code-snippet:
private void sendEnap(String patente, String fecha, String latitud, String longitud, BigInteger sentido,
BigInteger velocidad, int ignicion) {
RestTemplate restTemplate = new RestTemplate();
//set interceptors/requestFactory
ClientHttpRequestInterceptor ri = new LoggingRequestInterceptor();
List<ClientHttpRequestInterceptor> ris = new ArrayList<ClientHttpRequestInterceptor>();
ris.add(ri);
restTemplate.setInterceptors(ris);
MultiValueMap<String, String> headers = new LinkedMultiValueMap<String, String>();
headers.add("Authorization", "Bearer " + ENANGAB_TOKEN);
headers.add("Content-Type", MediaType.APPLICATION_JSON.toString());
headers.add("User-Agent", "Waypoint");
EnapRequest enapRequest = new EnapRequest(patente, fecha, latitud, longitud, sentido, velocidad, ignicion);
HttpEntity<EnapRequest> request = new HttpEntity<EnapRequest>(enapRequest, headers);
ResponseEntity<EnapResponse> response = restTemplate.exchange(ENAP_ENDPOINT, HttpMethod.POST, request,
EnapResponse.class);
System.out.println(response.getBody());
}
Wenn der interceptor ist deaktiviert, dieselbe Ausnahme ergibt sich aber nun mit diesem stacktrace:
Exception in thread "main" org.springframework.web.client.ResourceAccessException: I/O error on POST request for "http://64.76.157.19:8283/ENAP/ProveedorExterno/v1.0/insertarUltimaPosicion":Unexpected end of file from server; nested exception is java.net.SocketException: Unexpected end of file from server
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:567)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:512)
at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:454)
at cl.waypoint.integracion.GenericCallback.sendEnap(GenericCallback.java:187)
at cl.waypoint.integracion.GenericCallback.main(GenericCallback.java:167)
Caused by: java.net.SocketException: Unexpected end of file from server
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:718)
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:579)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1322)
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:468)
at org.springframework.http.client.SimpleClientHttpResponse.getRawStatusCode(SimpleClientHttpResponse.java:48)
at org.springframework.http.client.AbstractClientHttpResponse.getStatusCode(AbstractClientHttpResponse.java:33)
at org.springframework.web.client.DefaultResponseErrorHandler.getHttpStatusCode(DefaultResponseErrorHandler.java:56)
at org.springframework.web.client.DefaultResponseErrorHandler.hasError(DefaultResponseErrorHandler.java:50)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:552)
... 4 more
Oben ist ein weiterer Hinweis für eine fehlende header für die Antwort, weiß nicht, was man, und wie man Sie vermeiden so warten auch.
Irgendwelche Tipps würde sehr geschätzt
EDIT:
Header gesendet:
Accept: [application/json, application/*+json]
Authorization: [Bearer dsgfsdgf786dsfg7dsgf]
Content-Type: [application/json]
User-Agent: [Waypoint]
Content-Length: [567]
EnapRequest Klasse:
Paket cl.Wegpunkt.integracion;
import java.math.BigInteger;
import com.fasterxml.jackson.annotation.JsonProperty;
public class EnapRequest {
@JsonProperty("token_proveedor")
private String tokenProveedor = GenericCallback.ENANGAB_TOKEN;
private Posicion[] posicion;
public EnapRequest(String patente, String fecha, String latitud, String longitud, BigInteger sentido,
BigInteger velocidad, int ignicion) {
posicion = new Posicion[1];
posicion[0] = new Posicion(patente, fecha, latitud, longitud, sentido, velocidad, ignicion);
}
public String getTokenProveedor() {
return tokenProveedor;
}
public void setTokenProveedor(String tokenProveedor) {
this.tokenProveedor = tokenProveedor;
}
public Posicion[] getPosicion() {
return posicion;
}
public void setPosicion(Posicion[] posicion) {
this.posicion = posicion;
}
}
Den request-body ist in der Tat gesendet werden als JSON (genau das gleiche wie mit curl, ziemlich drucken Sie hier für verbessertes Lesen):
{
"posicion": [
{
"patente": "AB1234",
"latitud": "-36.752752",
"longitud": "-73.0804947",
"direccion": "120",
"velocidad": "65",
"transportista": "ENANGAB",
"sensora1": null,
"sensora2": null,
"sensora3": null,
"mopo_sensord1": null,
"mopo_sensord2": null,
"mopo_sensord3": null,
"mopo_sensord4": null,
"mopo_sensord5": null,
"mopo_sensord6": null,
"opcional1": null,
"opcional2": null,
"opcional3": null,
"opcional4": null,
"codigo_interno": null,
"fecha_hora": "2016-07-15T14:24:00",
"mopo_estado": "1",
"mopo_estado_ignicion": "1",
"moev_numero_evento": "45"
}
],
"token_proveedor": "dsgfsdgf786dsfg7dsgf"
}
Des RestTemplate Objekt bereits konfiguriert die Unterstützung für die folgenden Konverter:
class org.springframework.http.converter.ByteArrayHttpMessageConverter
class org.springframework.http.converter.StringHttpMessageConverter
class org.springframework.http.converter.ResourceHttpMessageConverter
class org.springframework.http.converter.xml.SourceHttpMessageConverter
class org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter
class org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter
class org.springframework.http.converter.json.MappingJackson2HttpMessageConverter
hinzugefügte Header, body und fordern Klasse..danke!
InformationsquelleAutor gvasquez | 2016-07-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, das problem hier ist, dass Ihr Antrag hat einen falschen Datentyp, die server können nicht analysiert und kann daher nicht Antworten.
Da, die Sie senden eine POST-Anforderung mit JSON
Content-Type
header, IhreEnapRequest
müssen, werden JSON-kodiert.Zu tun, dass, müssen Sie sicherstellen, dass
EnapRequest
ist ein POJO-Klasse, dann ändern Sie Ihren code innerhalbsendEnap()
und sind der Jackson-Bibliotheken in den classpath
Was passiert, wenn Sie versuchen
curl
mit HeaderUser-Agent: Waypoint
undAccept: application/json, application/*+json
? Derzeitcurl
hatUser-Agent: curl/7.43.0
undAccept: */*
mmmm....netter Hinweis, keine Reaktion änderung der accept-header! Schalten Sie das RestTemplate zu Akzeptieren: / und jetzt funktioniert es, ein wenig seltsam, aber als LOCKE meldet, dass die Antwort ist "application/json; charset=UTF-8", durch Spring kein solcher header gefunden wird.
Froh zu wissen, dass es jetzt funktioniert. Ich denke, dass müssen Sie möglicherweise Lesen Sie die server-API Dokument für die detaillierte Anleitung.
ziemlich schlechte docs auf der server-Seite ?
InformationsquelleAutor Rocherlee
Ich hatte den gleichen Fehler, überprüfen Sie die Größe des Pakets konfiguriert auf der Netzwerk-Ebene für den server(wenn es ein Ungleichgewicht gibt - die Größe des Pakets zu erwarten ist kleiner als die Größe des Pakets erhalten, dieser Fehler würde auftreten)
Führen Sie den folgenden Befehl auf dem server treffen:
ip-addr | grep mtu
InformationsquelleAutor Devarati Tripathi