使用 Asio 库创建 HTTP POST 请求并接收数据

本示例演示了如何使用 Boost.Asio 库创建 HTTP POST 请求,将数据发送至 fangke.zstu.edu.cn:6007 服务器,并接收服务器返回的数据。

代码示例

#include <iostream>
#include <boost/asio.hpp>

using boost::asio::ip::tcp;

int main()
{
    boost::asio::io_service io_service;

    // 获取服务器的 IP 地址
    tcp::resolver resolver(io_service);
    tcp::resolver::query query('fangke.zstu.edu.cn', '6007');
    tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);

    // 创建 socket 并连接到服务器
    tcp::socket socket(io_service);
    boost::asio::connect(socket, endpoint_iterator);

    // 创建 HTTP 请求
    boost::asio::streambuf request;
    std::ostream request_stream(&request);
    request_stream << 'POST / HTTP/1.1
';
    request_stream << 'Host: fangke.zstu.edu.cn
';
    request_stream << 'Content-Type: application/x-www-form-urlencoded
';
    request_stream << 'Content-Length: 16
';
    request_stream << 'Connection: close

';
    request_stream << 'param1=value1
';

    // 发送 HTTP 请求
    boost::asio::write(socket, request);

    // 读取服务器返回的数据
    boost::asio::streambuf response;
    boost::asio::read_until(socket, response, '
');

    // 输出服务器返回的 HTTP 头信息
    std::istream response_stream(&response);
    std::string http_version;
    response_stream >> http_version;
    unsigned int status_code;
    response_stream >> status_code;
    std::string status_message;
    std::getline(response_stream, status_message);
    if (!response_stream || http_version.substr(0, 5) != 'HTTP/')
    {
        std::cout << 'Invalid response
';
        return 1;
    }
    if (status_code != 200)
    {
        std::cout << 'Response returned with status code ' << status_code << '
';
        return 1;
    }

    // 输出服务器返回的数据
    boost::asio::read_until(socket, response, '

');
    std::string header;
    while (std::getline(response_stream, header) && header != '
')
        std::cout << header << '
';
    std::cout << '
';
    if (response.size() > 0)
        std::cout << &response;

    return 0;
}

代码解释

  1. 包含头文件: 包含 iostreamboost/asio.hpp 头文件,用于输入输出操作和使用 Asio 库。
  2. 创建 io_service 对象: 创建一个 io_service 对象,用于管理 Asio 的事件循环。
  3. 解析服务器地址: 使用 tcp::resolver 对象解析 fangke.zstu.edu.cn 的 IP 地址和端口号 6007
  4. 创建 socket 并连接: 创建一个 tcp::socket 对象,并使用 connect 函数连接到解析后的服务器地址。
  5. 创建 HTTP 请求: 使用 boost::asio::streambuf 对象构建 HTTP 请求,并使用 std::ostream 对象将请求内容写入缓冲区。
  6. 发送 HTTP 请求: 使用 boost::asio::write 函数将 HTTP 请求数据发送至服务器。
  7. 接收 HTTP 响应: 使用 boost::asio::read_until 函数读取服务器返回的 HTTP 响应,直到遇到 为止。
  8. 解析 HTTP 响应头: 使用 std::istream 对象解析 HTTP 响应头信息,获取 HTTP 版本、状态码和状态消息。
  9. 读取响应数据: 使用 boost::asio::read_until 函数继续读取服务器返回的数据,直到遇到 `

` 为止。 10. 输出响应数据: 打印 HTTP 响应头信息和响应数据。

代码说明

  • 代码中的注释已经解释了每个步骤的作用,可以根据需要进行修改和调整。
  • 本示例中的 HTTP 请求使用的是最简单的 POST 请求格式,可以在实际应用中根据需要进行扩展和完善。
  • 在实际使用中,建议添加错误处理机制,例如捕获异常或检查响应状态码,以确保代码的稳定性和可靠性。

总结

本示例演示了如何使用 Asio 库创建 HTTP POST 请求,发送数据至服务器并接收返回的数据。代码简单易懂,方便学习和使用。在实际应用中,可以根据需要进行扩展和完善,实现更复杂的网络功能。

C++ Asio 库实现 HTTP POST 请求:发送数据并接收响应

原文地址: https://www.cveoy.top/t/topic/m1VZ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录