Java ApacheHttpClient空响应头
我正在尝试使用Http/1.1 get方法从数据记录器获取数据,但响应只包含Http正文,没有标头。我收到以下异常:Java ApacheHttpClient空响应头,java,http,apache-httpclient-4.x,Java,Http,Apache Httpclient 4.x,我正在尝试使用Http/1.1 get方法从数据记录器获取数据,但响应只包含Http正文,没有标头。我收到以下异常: Exception in thread "main" org.apache.http.client.ClientProtocolException at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:909) at org.apache.http.imp
Exception in thread "main" org.apache.http.client.ClientProtocolException
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:909)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:1066)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:1044)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:1035)
at Main.main(Main.java:42)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Caused by: org.apache.http.ProtocolException: The server failed to respond with a valid HTTP response
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:103)
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:62)
at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:254)
at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:289)
at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:252)
at org.apache.http.impl.conn.ManagedClientConnectionImpl.receiveResponseHeader(ManagedClientConnectionImpl.java:191)
at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:300)
at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:127)
at org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:712)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:517)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906)
... 9 more
代码:
终端:
telnet xxx.xxxxxxx.xxx 80
Trying xxx.xxxxxxx.xxx...
Connected to xxx.xxxxxxx.xxx.
Escape character is '^]'.
GET /api/1.0/getData?preserve=true HTTP/1.1
Host: xxx.xxxxxxx.xxx
Connection: close
User-Agent: Apache-HttpClient/4.2.1 (java 1.5)
{"name":"DEI2","id":"00d0694318ac","fw":"1.0.23","data":[]}
Connection closed by foreign host.
有没有办法跳过HTTP响应头处理并只处理响应体?
不是我认为这个方法是个好主意,但这就是如何用Apache httpCurror
完成的。如果响应不包含状态行和标头,则它是无效的http。您不能使用http客户端来处理它。我知道,我想知道我是否可以使用它来解决一些问题,以避免编写原始套接字代码。不,您不能。处理代码太嵌入到库中,可能不值得。修复服务器。这就是问题所在。。。我无法修复它,它是一个封闭源代码的电子数据记录器。
telnet xxx.xxxxxxx.xxx 80
Trying xxx.xxxxxxx.xxx...
Connected to xxx.xxxxxxx.xxx.
Escape character is '^]'.
GET /api/1.0/getData?preserve=true HTTP/1.1
Host: xxx.xxxxxxx.xxx
Connection: close
User-Agent: Apache-HttpClient/4.2.1 (java 1.5)
{"name":"DEI2","id":"00d0694318ac","fw":"1.0.23","data":[]}
Connection closed by foreign host.
static class CustomHttpConnection extends DefaultBHttpClientConnection {
public CustomHttpConnection(final int buffersize) {
super(buffersize);
}
@Override
public SessionInputBuffer getSessionInputBuffer() {
return super.getSessionInputBuffer();
}
}
// Create protocol processor
HttpProcessor processor = HttpProcessorBuilder.create()
.addAll(new RequestContent(),
new RequestTargetHost(),
new RequestConnControl(),
new RequestUserAgent("HTTP/1.1"))
.build();
// Target host
InetSocketAddress target = new InetSocketAddress("localhost", 8080);
// Create custom connection that exposes its session input buffer
CustomHttpConnection conn = new CustomHttpConnection(10 * 1024);
try {
// Open socket
Socket socket = new Socket();
socket.connect(target, 5000);
// Bind it to the connection
conn.bind(socket);
// Create and initialize request
HttpGet request = new HttpGet("/");
// Force connection close
request.addHeader(HTTP.CONN_DIRECTIVE, HTTP.CONN_CLOSE);
// Create and initialize execution context
HttpClientContext context = HttpClientContext.create();
context.setTargetHost(new HttpHost(target.getHostName(), target.getPort()));
context.setRequestConfig(RequestConfig.DEFAULT);
context.setAttribute(HttpClientContext.HTTP_REQUEST, request);
context.setAttribute(HttpClientContext.HTTP_CONNECTION, conn);
// Process request
processor.process(request, context);
// Send request
conn.sendRequestHeader(request);
if (request instanceof HttpEntityEnclosingRequest) {
conn.sendRequestEntity(((HttpEntityEnclosingRequest) request));
}
conn.flush();
SessionInputBuffer connSessionInputBuffer = conn.getSessionInputBuffer();
IdentityInputStream instream = new IdentityInputStream(connSessionInputBuffer);
int l;
byte[] buff = new byte[1024];
while ((l = instream.read(buff)) != -1) {
System.out.println(new String(buff, 0, l, Consts.ASCII));
}
} finally {
conn.close();
}