【问题标题】:Caused by: java.io.IOException: HTTP/1.1 header parser received no bytes原因:java.io.IOException: HTTP/1.1 header parser received no bytes
【发布时间】:2021-01-28 21:04:30
【问题描述】:

我是第一次来

原因:java.io.IOException:HTTP/1.1 标头解析器未收到任何字节

(我的应用程序似乎可以运行到现在......)

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();
                }
            }

这是代码。为什么会出现此错误?

【问题讨论】:

标签: java ioexception


【解决方案1】:

HTTP 标头是服务器将响应的第一件事

那个错误说它是空的。实际上,这个错误,粗略的翻译,意思是:“服务器完全没有发回并挂断了”。

这也解释了为什么“它以前有效”。不是你;就是那个服务器。它已损坏、脱机或已更新或替换,因此无法再处理您的请求。

这个 + 其他链接的 SO 答案建议您强制使用 HTTP/1.1 模式 - 您只是在调整发送请求的方式,希望您可以对其进行调整,以便服务器不会阻塞它。很可能服务器刚刚离线,您所要做的就是等待一段时间或与管理员联系。还可以尝试使用例如连接到 URL curl 或您的浏览器以查看发生了什么。

另一个常见的原因是他们只是将他们的 HTTP(如非 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,现在,找到您配置自动完成模板的位置。并摆脱那些无用的、令人畏缩的e.printStackTrace() 并使其成为throw new RuntimeException("Uncaught", e);。当发生您懒得处理的事情时,您想要的最后一件事就是“默默地什么也不做”。您希望使用适当的堆栈跟踪来崩溃。

【讨论】:

    【解决方案2】:

    请尝试传递 HTTP 版本:

    HttpClient.newBuilder()
    .version(Version.HTTP_1_1)
    .build();
    

    【讨论】:

    • 这是正确答案。接收 HTTP 请求的服务器一定不支持 HTTP 2,所以我们必须在请求中显式设置版本为 1.1。
    • @CompEng88 这并不容易。对我来说,这是服务器上的某种防火墙。我一直收到响应几分钟,然后什么都没有。
    【解决方案3】:

    这个解决方案对我有用,

    HttpClient.newBuilder()
    .version(HttpClient.Version.HTTP_1_1)
    .build();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-17
      • 2016-12-17
      • 1970-01-01
      • 1970-01-01
      • 2014-08-29
      • 2022-06-27
      • 2018-05-18
      • 2013-07-16
      相关资源
      最近更新 更多