橋竹 2024-06-18 21:25 采纳率: 40%
浏览 17

使用httplib库编写 HTTP 客户端

最近在Linux系统上 Qt Creator 中使用 C++ 和 httplib 库编写 HTTP 客户端。通过auto res = cli.Post发送member=1111111,获得的响应数据大概是一万多字节。
断点调试时发现if (res && res->status == 200)时会偶发性遇到 httplib::Error::Read (4) 错误

img

但是在判断状态前添加size_t size = res->body.size();则不会报错;

img

如果获得响应数据大概是两万多字节,就算添加读取数据大小也还是报错httplib::Error::Read (4) ,请问是什么原因以及该怎么解决。

  • 写回答

1条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-18 21:25
    关注

    引自免费微信小程序:皆我百晓生

    遇到httplib::Error::Read (4)错误通常表示在尝试读取响应数据时遇到了问题。错误码4通常对应于“中断函数调用”,但在网络编程的上下文中,它更可能意味着读操作遇到了一个错误,比如连接突然关闭、数据接收不完整等。你提到在获取响应体大小之前不报错,而在之后检查状态码时出现问题,这表明在某些情况下,读取响应体的操作可能未完全完成就进行了状态检查。

    为了解决这个问题,你可以采取以下几个步骤:

    1. 确保连接完全关闭:在处理完响应后,确保httplib客户端对象正确地释放了资源。虽然httplib通常会自动管理这些,但显式地调用close()方法可能有助于避免某些边缘情况。

    2. 增加超时时间:如果服务器响应慢或网络不稳定,可以考虑增加httplib的超时设置。这样可以给服务器更多的时间来完成响应。

    3. 检查网络稳定性:确保网络环境稳定,没有丢包或延迟高的问题。可以使用网络监控工具检查网络状况。

    4. 使用异常处理:在C++中,可以使用try-catch块来捕获并处理httplib可能抛出的异常。这样可以更优雅地处理错误,并提供错误信息给用户。

    5. 分段读取数据:如果数据量大,可以考虑分段读取数据,而不是一次性读取整个响应体。这样可以减少内存压力,同时也可以更好地处理部分数据接收的情况。

    下面是一个修改后的代码示例,展示了如何使用异常处理和增加超时时间:

    #include <httplib.h>
    #include <iostream>
    
    int main() {
        httplib::Client cli("http://yourserver.com");
        // 设置超时时间(可选)
        cli.set_connection_timeout(10, 0); // 10秒超时
        cli.set_read_timeout(10, 0);       // 10秒超时
    
        try {
            auto res = cli.Post("/path", {{"Content-Type", "application/json"}}, "data");
            if (res) {
                size_t size = res->body.size();
                if (res->status == 200) {
                    std::cout << "Response body size: " << size << std::endl;
                    // 处理成功响应
                } else {
                    std::cerr << "HTTP Request failed with status: " << res->status << std::endl;
                    // 处理错误响应
                }
            }
        } catch (const httplib::Error& e) {
            std::cerr << "Error occurred: " << e.what() << std::endl;
            // 处理异常
        }
    
        return 0;
    }
    

    通过以上修改,你应该能更健壮地处理HTTP请求中的各种异常情况。如果问题仍然存在,可能需要进一步检查服务器端的配置或网络环境。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月18日

悬赏问题

  • ¥30 网站服务器通过node.js部署了一个项目!前端访问失败
  • ¥15 WPS访问权限不足怎么解决
  • ¥15 java幂等控制问题
  • ¥15 海湾GST-DJ-N500
  • ¥15 氧化掩蔽层与注入条件关系
  • ¥15 Django DRF 如何反序列化得到Python对象类型数据
  • ¥15 多数据源与Hystrix的冲突
  • ¥15 如何在线硕士了解,广告太多,希望有真实接触过的人回答下?(标签-学习|关键词-在线硕士)
  • ¥15 zabbix6.4与frp如何进行联动
  • ¥15 如何使用Echarts制作途中时间序列表