21xrx.com
2024-11-10 00:44:18 Sunday
登录
文章检索 我的文章 写文章
C++ 发送 POST 请求
2023-06-23 08:48:18 深夜i     --     --
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请求来提交数据到服务器,这可以极大地帮助您的应用程序与网络服务集成。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复