Java 8 HttpUrlConnection 无法使用 http 协议 2 解析响应
Java 8 HttpUrlConnection fail to parse response with http protocol 2
我们正在 运行 维护一个项目 java 8。现在我们必须通过他们的 api 调用合作伙伴服务器以将一些数据迁移到我们的数据库中。
当我们调用他们的服务器时,出现异常:
Caused by: org.apache.http.ProtocolException: The server failed to respond with a valid HTTP response
这种情况下的响应代码是-1。
所以我尝试使用 curl 从他们的服务器获取数据,我看到他们的响应状态行是:
HTTP/2 200
当 HttpURLConnection 像这样检查时:
if (statusLine.startsWith("HTTP/1.")) {
int codePos = statusLine.indexOf(' ');
if (codePos > 0) {
int phrasePos = statusLine.indexOf(' ', codePos+1);
if (phrasePos > 0 && phrasePos < statusLine.length()) {
responseMessage = statusLine.substring(phrasePos+1);
}
// deviation from RFC 2616 - don't reject status line
// if SP Reason-Phrase is not included.
if (phrasePos < 0)
phrasePos = statusLine.length();
try {
responseCode = Integer.parseInt
(statusLine.substring(codePos+1, phrasePos));
return responseCode;
} catch (NumberFormatException e) { }
}
}
return -1;
因为这里的状态行是 2,而不是 1,所以无法读取和解析来自服务器的响应。
但是我们不能只将 Java 升级到更高版本,因为它需要大量测试以确保没有任何问题,有人知道在 java 8 中解决这个问题吗?
你可以利用 HttpClient 5.0 吗?这在 Java 7 及更高版本上支持 HTTP/2(请注意,您的合作伙伴服务不支持以某种形式降级到 HTTP/1.x,这让我有些惊讶?)
我们正在 运行 维护一个项目 java 8。现在我们必须通过他们的 api 调用合作伙伴服务器以将一些数据迁移到我们的数据库中。
当我们调用他们的服务器时,出现异常:
Caused by: org.apache.http.ProtocolException: The server failed to respond with a valid HTTP response
这种情况下的响应代码是-1。
所以我尝试使用 curl 从他们的服务器获取数据,我看到他们的响应状态行是:
HTTP/2 200
当 HttpURLConnection 像这样检查时:
if (statusLine.startsWith("HTTP/1.")) {
int codePos = statusLine.indexOf(' ');
if (codePos > 0) {
int phrasePos = statusLine.indexOf(' ', codePos+1);
if (phrasePos > 0 && phrasePos < statusLine.length()) {
responseMessage = statusLine.substring(phrasePos+1);
}
// deviation from RFC 2616 - don't reject status line
// if SP Reason-Phrase is not included.
if (phrasePos < 0)
phrasePos = statusLine.length();
try {
responseCode = Integer.parseInt
(statusLine.substring(codePos+1, phrasePos));
return responseCode;
} catch (NumberFormatException e) { }
}
}
return -1;
因为这里的状态行是 2,而不是 1,所以无法读取和解析来自服务器的响应。
但是我们不能只将 Java 升级到更高版本,因为它需要大量测试以确保没有任何问题,有人知道在 java 8 中解决这个问题吗?
你可以利用 HttpClient 5.0 吗?这在 Java 7 及更高版本上支持 HTTP/2(请注意,您的合作伙伴服务不支持以某种形式降级到 HTTP/1.x,这让我有些惊讶?)