C++ Asio 库实现 HTTP POST 请求:发送数据并接收响应
使用 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;
}
代码解释
- 包含头文件: 包含
iostream和boost/asio.hpp头文件,用于输入输出操作和使用 Asio 库。 - 创建 io_service 对象: 创建一个
io_service对象,用于管理 Asio 的事件循环。 - 解析服务器地址: 使用
tcp::resolver对象解析fangke.zstu.edu.cn的 IP 地址和端口号6007。 - 创建 socket 并连接: 创建一个
tcp::socket对象,并使用connect函数连接到解析后的服务器地址。 - 创建 HTTP 请求: 使用
boost::asio::streambuf对象构建 HTTP 请求,并使用std::ostream对象将请求内容写入缓冲区。 - 发送 HTTP 请求: 使用
boost::asio::write函数将 HTTP 请求数据发送至服务器。 - 接收 HTTP 响应: 使用
boost::asio::read_until函数读取服务器返回的 HTTP 响应,直到遇到为止。 - 解析 HTTP 响应头: 使用
std::istream对象解析 HTTP 响应头信息,获取 HTTP 版本、状态码和状态消息。 - 读取响应数据: 使用
boost::asio::read_until函数继续读取服务器返回的数据,直到遇到 `
` 为止。 10. 输出响应数据: 打印 HTTP 响应头信息和响应数据。
代码说明
- 代码中的注释已经解释了每个步骤的作用,可以根据需要进行修改和调整。
- 本示例中的 HTTP 请求使用的是最简单的 POST 请求格式,可以在实际应用中根据需要进行扩展和完善。
- 在实际使用中,建议添加错误处理机制,例如捕获异常或检查响应状态码,以确保代码的稳定性和可靠性。
总结
本示例演示了如何使用 Asio 库创建 HTTP POST 请求,发送数据至服务器并接收返回的数据。代码简单易懂,方便学习和使用。在实际应用中,可以根据需要进行扩展和完善,实现更复杂的网络功能。
原文地址: https://www.cveoy.top/t/topic/m1VZ 著作权归作者所有。请勿转载和采集!