21xrx.com
2025-04-27 10:30:47 Sunday
文章检索 我的文章 写文章
C++ 发送 POST 请求
2023-06-23 08:48:18 深夜i     46     0
C++ POST 请求 发送 数据传输

C++是一种流行的编程语言,广泛应用于各种开发和应用场景。发送HTTP请求是C++编程中常见的任务之一,其中POST请求是一种常见的类型。本文将为您介绍如何使用C++发送POST请求。

POST请求是一种HTTP请求方法,用于将数据提交到服务器。与GET请求不同,POST请求将数据放在请求正文中,而不是在URL中。因此,POST请求通常用于向服务器提交表单数据或其他类型的数据。

发送POST请求的第一步是创建HTTP请求。在C++中,可以使用网络库或HTTP客户端库构建HTTP请求。以下示例代码使用C++标准库中的网络库:

#include <iostream>
#include <boost/asio.hpp>
using boost::asio::ip::tcp;
int main() {
  std::string host = "example.com";
  std::string path = "/submit-form";
  std::string data = "username=johndoe&password=secret";
  boost::asio::io_service io_service;
  tcp::resolver resolver(io_service);
  tcp::resolver::query query(host, "http");
  tcp::socket socket(io_service);
  boost::asio::connect(socket, resolver.resolve(query));
  boost::asio::streambuf request;
  std::ostream request_stream(&request);
  request_stream << "POST " << path << " HTTP/1.1\r\n";
  request_stream << "Host: " << host << "\r\n";
  request_stream << "Content-Type: application/x-www-form-urlencoded\r\n";
  request_stream << "Content-Length: " << data.length() << "\r\n";
  request_stream << "\r\n";
  request_stream << data;
  boost::asio::write(socket, request);
  boost::asio::streambuf response;
  boost::asio::read_until(socket, response, "\r\n");
  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;
  }
  boost::asio::read_until(socket, response, "\r\n\r\n");
  std::string header;
  std::stringstream header_stream;
  while (std::getline(response_stream, header) && header != "\r") {
    header_stream << header << "\n";
  }
  std::cout << "Response headers:\n" << header_stream.str() << "\n";
  if (response.size() > 0) {
    std::cout << "Response content:\n" << &response;
  }
  boost::system::error_code error;
  while (boost::asio::read(socket, response, boost::asio::transfer_at_least(1), error))
    std::cout << &response;
  
  std::cout << "\n";
  if (error != boost::asio::error::eof) {
    throw boost::system::system_error(error);
  }
  return 0;
}

在此代码示例中,首先定义了要发送POST请求的主机名称、路径和要提交的数据。然后创建了一个网络IO服务(io_service), 这个服务将用于与主机通信。设置要访问的主机和端口(通常是80),并使用dns解析服务(resolver)查找主机的IP地址。接下来,创建一个TCP套接字(socket)并连接到主机。然后将POST请求构建为本地流缓冲区(request),此缓冲区将发送到主机。在构建请求过程中,request_stream用于读写请求流缓冲区。在发送请求之前,使用boost::asio::write将请求缓冲区发送到服务器。使用boost::asio::streambuf将响应读入本地缓冲区(response),并使用boost::asio::read_until函数从服务器读取响应头和状态代码。然后从响应头中提取状态代码和版本。如果状态代码不等于200,说明HTTP请求没有成功。接下来,获取并输出响应头,并从服务器读取响应正文。最后,清理并关闭网络套接字并退出。

总体来说,发送POST请求是一种常见的任务,可以使用C++发送POST请求来提交数据到服务器,这可以极大地帮助您的应用程序与网络服务集成。

  
  

评论区