私はすでに同様のテーマに関するいくつかの質問/回答を確認しましたが、私の場合には適切な答えを見つけることができません。私は春のRestTemplateを使用しますが、以下の例外を除いて、第三者のサーバーからの応答を取得するために失敗していjava.net.SocketException:SpringのRestTemplateを使用しているサーバーからのファイルの終了が予期しないです。
:
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
をしかし、コマンドラインを使用して同じ要求/ヘッダー/ペイロードを送信するときにカールがあるようですこれはそれの詳細な出力で、全く問題はない:
* 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:認証トークンとサーバのIPアドレスがセキュリティ上の理由で変更されました。
春はしばらくハングしてから例外がスローされるようですが、おそらくデフォルトで何かを待っています...レスポンスのContent-Lengthヘッダー?もしそうなら、それを上書きすることはできますか?
例外は、以下の迎撃から来ている:インターセプターが無効になっている
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());
}
場合は、同じ例外が発生しますが、今、このスタックトレースを持つ:次のコードスニペットから使用されている
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());
}
}
:
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
上記は欠落しているヘッダーの別のヒントです応答では、どちらか、どのようにそのような待機を避けるために知っていない。
任意のヒントは
EDIT理解されるであろう:送信
ヘッダ:
Accept: [application/json, application/*+json]
Authorization: [Bearer dsgfsdgf786dsfg7dsgf]
Content-Type: [application/json]
User-Agent: [Waypoint]
Content-Length: [567]
EnapRequestクラス: パッケージcl.waypoint.integracionと、
{
"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"
}
RestTemplateオブジェクトが既に次のサポートを設定している:リクエストボディが実際にJSON(カールと全く同じ、改善された読書のためここではかなりプリント)として送信されて
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;
}
}
コンバーター:
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
何かがあるようですPOSTリクエストのヘッダや本文に間違っている。 EnapRequestクラスを追加できますか? – Rocherlee
@Rocherleeはヘッダ、ボディ、リクエストクラスを追加しました! – gvasquez