如何用asio创建一个httpfangkezstueducn6007swagger的GET请求并且接受返回的数据
以下是使用asio库创建HTTP GET请求,并接收返回数据的示例代码:
#include <iostream>
#include <asio.hpp>
using asio::ip::tcp;
int main() {
try {
asio::io_context io_context;
// 1. 解析主机名和端口号
tcp::resolver resolver(io_context);
tcp::resolver::results_type endpoints = resolver.resolve("fangke.zstu.edu.cn", "6007");
// 2. 创建socket连接
tcp::socket socket(io_context);
asio::connect(socket, endpoints);
// 3. 发送GET请求
asio::streambuf request;
std::ostream request_stream(&request);
request_stream << "GET /swagger HTTP/1.1\r\n";
request_stream << "Host: fangke.zstu.edu.cn:6007\r\n";
request_stream << "Connection: close\r\n\r\n";
asio::write(socket, request);
// 4. 接收响应
asio::streambuf response;
asio::read_until(socket, response, "\r\n");
// 5. 输出响应头
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\n";
return 1;
}
if (status_code != 200) {
std::cout << "Response returned with status code " << status_code << "\n";
return 1;
}
std::cout << "Response status code: " << status_code << "\n";
// 6. 输出响应正文
asio::read_until(socket, response, "\r\n\r\n");
std::string header;
while (std::getline(response_stream, header) && header != "\r") {}
std::cout << "\n";
if (response.size() > 0) {
std::cout << &response;
}
return 0;
}
catch (std::exception& e) {
std::cout << "Exception: " << e.what() << "\n";
return 1;
}
}
这段代码使用了asio库中的tcp::resolver、tcp::socket、asio::streambuf等类以及相应的成员函数来完成GET请求的发送和响应的接收。其中,第1步使用tcp::resolver类解析指定主机名和端口号,第2步使用tcp::socket类创建socket连接,第3步使用asio::write函数发送GET请求,第4步使用asio::read_until函数接收响应,第5步解析响应头并输出响应状态码,第6步输出响应正文。
原文地址: https://www.cveoy.top/t/topic/byay 著作权归作者所有。请勿转载和采集!