Java ApacheHttpClient空响应头

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

我正在尝试使用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.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();
}