Java HttpURLConnection 请求抛出 IOException 和无效的 Http 响应

Java HttpURLConnection request throwing IOException with Invalid Http response

我正在使用 Java 8 发出 POST 请求,如下所示:

URL url = new URL("http://target.server.com/doIt");
URLConnection connection = url.openConnection();
HttpURLConnection httpConn = (HttpURLConnection) connection;

byte[] soapBytes = soapRequest.getBytes();
httpConn.setRequestProperty("Host", "target.host.com");
httpConn.setRequestProperty("Content-Length", soapBytes.length+"");
httpConn.setRequestProperty("Content-Type", "application/soap+xml; charset=utf-8");
httpConn.setRequestMethod("POST");
httpConn.setConnectTimeout(5000);
httpConn.setReadTimeout(35000);
httpConn.setDoOutput(true);
httpConn.setDoInput(true);
OutputStream out = httpConn.getOutputStream();
out.write(soapBytes);
out.close();

int statusCode;
try {
    statusCode = httpConn.getResponseCode();
} catch (IOException e) {
    InputStream stream = httpConn.getErrorStream();
    if (stream == null) {
        throw e;
    } else {
        // this never happens
    }
}

我的 soap 请求包含一个文档 ID 和目标服务器(托管我不拥有或无权访问的第三方服务)return一个与提供的 ID 匹配的 PDF 文档。

大多数时候,服务器 return 是一个 PDF 文档,有时当文档不可用时状态代码为 500。但是,有时对 getResponseCode() 的调用会抛出带有 "Invalid Http response".

的 IOException

我认为无论发生什么情况,服务器总会有一些对 return 的响应代码。

正如 AxelH 指出的那样,在连接远程服务器时一定有问题,在这种情况下您无法获得有效响应。

如果您在测试环境中,您可以在 TCP 级别(而不是 HTTP 级别)监控连接:在您的客户端和监控远程服务器之间放置一个监视器两个对等点之间交换的所有 TCP 流量。如果您使用的是 Eclipse,则可以创建一个 TCP 监视器