Caused by: java.io.IOException: HTTP/1.1 header 解析器没有接收到任何字节
Caused by: java.io.IOException: HTTP/1.1 header parser received no bytes
我是第一次得到
Caused by: java.io.IOException: HTTP/1.1 header parser received no bytes
(我的应用程序到目前为止似乎可以正常工作...)
HttpClient httpClient = HttpClient.newHttpClient();
HttpRequest httpRequest = HttpRequest
.newBuilder()
.GET()
.uri(URI.create("..."))
.header("Content-Type", "application/json")
.build();
System.out.print(httpRequest.toString()); // dbg - it's ok
HttpResponse<String> response = null;
try {
response = httpClient.send(httpRequest,
HttpResponse.BodyHandlers.ofString());
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
if (response != null && response.statusCode() == 200) {
JSONObject jsonObject = new JSONObject(response.body());
JSONArray jsonArray = jsonObject.getJSONArray("data");
ObjectMapper objectMapper = ObjectMapperCreator.getNewObjectMapper();
try {
if (jsonArray.length() > 0) {
correctlyCaught = true;
return objectMapper.readValue(jsonArray.get(0).toString(), GeocodingResponse.class);
}
} catch (IOException e) {
e.printStackTrace();
}
}
这是代码。为什么会出现此错误?
请尝试传递 HTTP 版本:
HttpClient.newBuilder()
.version(Version.HTTP_1_1)
.build();
HTTP header 是服务器将响应的第一件事。
那个错误说它是空的。那么实际上,这个错误,粗略地翻译,意思是:“服务器绝对没有返回任何东西并挂断了”。
这也解释了为什么'it worked before'。不是你;就是那个服务器它已损坏、离线或已更新或更换,因此无法再处理您的请求。
这个 + 其他链接的 SO 答案建议你强制使用 HTTP/1.1 模式 - 你只是在修改你发送请求的方式,希望你可以调整它,这样服务器就不会阻塞它。很可能服务器只是离线,您所要做的就是等待一段时间或与管理员联系。也可以尝试连接到 URL,例如curl 或您的浏览器以查看发生了什么。
另一个常见的原因是他们只是让他们的 HTTP(如 non-HTTPS 端)离线或者它死了并且没有人注意到因为没有人*再连接 HTTP。那么解决方法可能就是……在那个 URL 中扔一个 's'。浏览器一直通过各种机制悄悄地将 http://
urls 升级为 https://
urls,但是 java HTTP 库不会这样做,除非你明确要求为此(通过使 url https
为基础)。因此,请检查 URL(它不在粘贴中):如果它是 http://
,请考虑改用 https://
再试一次。
旁注:
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
if (response != null && response.statusCode() == 200) {
请不要这样做。你在这里写的是:如果发生错误,不恰当地记录它(syserr 不是记录事情的合适地方)然后静静地什么都不做。你正在为自己的疯狂追逐和失败做好准备。帮自己一个忙。现在 IDE、 进入您的 IDE,找到配置自动完成模板的位置。并摆脱那些无用的、令人畏缩的 e.printStackTrace()
并使其成为 throw new RuntimeException("Uncaught", e);
。当发生您懒得去处理的事情时,您最后一件事 就是'silently do nothing'。您希望崩溃具有适当的堆栈跟踪。
这个解决方案适合我,
HttpClient.newBuilder()
.version(HttpClient.Version.HTTP_1_1)
.build();
我是第一次得到
Caused by: java.io.IOException: HTTP/1.1 header parser received no bytes
(我的应用程序到目前为止似乎可以正常工作...)
HttpClient httpClient = HttpClient.newHttpClient();
HttpRequest httpRequest = HttpRequest
.newBuilder()
.GET()
.uri(URI.create("..."))
.header("Content-Type", "application/json")
.build();
System.out.print(httpRequest.toString()); // dbg - it's ok
HttpResponse<String> response = null;
try {
response = httpClient.send(httpRequest,
HttpResponse.BodyHandlers.ofString());
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
if (response != null && response.statusCode() == 200) {
JSONObject jsonObject = new JSONObject(response.body());
JSONArray jsonArray = jsonObject.getJSONArray("data");
ObjectMapper objectMapper = ObjectMapperCreator.getNewObjectMapper();
try {
if (jsonArray.length() > 0) {
correctlyCaught = true;
return objectMapper.readValue(jsonArray.get(0).toString(), GeocodingResponse.class);
}
} catch (IOException e) {
e.printStackTrace();
}
}
这是代码。为什么会出现此错误?
请尝试传递 HTTP 版本:
HttpClient.newBuilder()
.version(Version.HTTP_1_1)
.build();
HTTP header 是服务器将响应的第一件事。
那个错误说它是空的。那么实际上,这个错误,粗略地翻译,意思是:“服务器绝对没有返回任何东西并挂断了”。
这也解释了为什么'it worked before'。不是你;就是那个服务器它已损坏、离线或已更新或更换,因此无法再处理您的请求。
这个 + 其他链接的 SO 答案建议你强制使用 HTTP/1.1 模式 - 你只是在修改你发送请求的方式,希望你可以调整它,这样服务器就不会阻塞它。很可能服务器只是离线,您所要做的就是等待一段时间或与管理员联系。也可以尝试连接到 URL,例如curl 或您的浏览器以查看发生了什么。
另一个常见的原因是他们只是让他们的 HTTP(如 non-HTTPS 端)离线或者它死了并且没有人注意到因为没有人*再连接 HTTP。那么解决方法可能就是……在那个 URL 中扔一个 's'。浏览器一直通过各种机制悄悄地将 http://
urls 升级为 https://
urls,但是 java HTTP 库不会这样做,除非你明确要求为此(通过使 url https
为基础)。因此,请检查 URL(它不在粘贴中):如果它是 http://
,请考虑改用 https://
再试一次。
旁注:
} catch (IOException | InterruptedException e) { e.printStackTrace(); } if (response != null && response.statusCode() == 200) {
请不要这样做。你在这里写的是:如果发生错误,不恰当地记录它(syserr 不是记录事情的合适地方)然后静静地什么都不做。你正在为自己的疯狂追逐和失败做好准备。帮自己一个忙。现在 IDE、 进入您的 IDE,找到配置自动完成模板的位置。并摆脱那些无用的、令人畏缩的 e.printStackTrace()
并使其成为 throw new RuntimeException("Uncaught", e);
。当发生您懒得去处理的事情时,您最后一件事 就是'silently do nothing'。您希望崩溃具有适当的堆栈跟踪。
这个解决方案适合我,
HttpClient.newBuilder()
.version(HttpClient.Version.HTTP_1_1)
.build();