纯C++实现的HTTP请求封装(POST/GET)

简介: 纯C++实现的HTTP请求(POST/GET),支持windows和linux, 进行简单的封装, 方便调用。实现如下: #include "HttpConnect.h" #ifdef WIN32 #pragma comment(lib,"ws2_32.

纯C++实现的HTTP请求(POST/GET),支持windows和linux, 
进行简单的封装, 方便调用。实现如下:

#include "HttpConnect.h"

#ifdef WIN32
#pragma comment(lib,"ws2_32.lib")
#endif

HttpConnect::HttpConnect()
{
#ifdef WIN32 //此处一定要初始化一下,否则gethostbyname返回一直为空 WSADATA wsa = { 0 }; WSAStartup(MAKEWORD(2, 2), &wsa); #endif } HttpConnect::~HttpConnect() { } void HttpConnect::socketHttp(std::string host, std::string request) { int sockfd; struct sockaddr_in address; struct hostent *server; sockfd = socket(AF_INET,SOCK_STREAM,0); address.sin_family = AF_INET; address.sin_port = htons(80); server = gethostbyname(host.c_str()); memcpy((char *)&address.sin_addr.s_addr,(char*)server->h_addr, server->h_length); if(-1 == connect(sockfd,(struct sockaddr *)&address,sizeof(address))){ DBG <<"connection error!"<<std::endl; return; } DBG << request << std::endl; #ifdef WIN32 send(sockfd, request.c_str(),request.size(),0); #else write(sockfd,request.c_str(),request.size()); #endif char buf[1024*1024] = {0}; int offset = 0; int rc; #ifdef WIN32 while(rc = recv(sockfd, buf+offset, 1024,0)) #else while(rc = read(sockfd, buf+offset, 1024)) #endif { offset += rc; } #ifdef WIN32 closesocket(sockfd); #else close(sockfd); #endif buf[offset] = 0; DBG << buf << std::endl; } void HttpConnect::postData(std::string host, std::string path, std::string post_content) { //POST请求方式 std::stringstream stream; stream << "POST " << path; stream << " HTTP/1.0\r\n"; stream << "Host: "<< host << "\r\n"; stream << "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3\r\n"; stream << "Content-Type:application/x-www-form-urlencoded\r\n"; stream << "Content-Length:" << post_content.length()<<"\r\n"; stream << "Connection:close\r\n\r\n"; stream << post_content.c_str(); socketHttp(host, stream.str()); } void HttpConnect::getData(std::string host, std::string path, std::string get_content) { //GET请求方式 std::stringstream stream; stream << "GET " << path << "?" << get_content; stream << " HTTP/1.0\r\n"; stream << "Host: " << host << "\r\n"; stream <<"User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3\r\n"; stream <<"Connection:close\r\n\r\n"; socketHttp(host, stream.str()); }

 

调用方法:

    HttpConnect *http = new HttpConnect();
    http->getData("127.0.0.1", "/login", "id=liukang&pw=123"); http->postData("127.0.0.1", "/login","id=liukang&pw=123"); 

 

 

 
目录
相关文章
|
6月前
|
JSON 数据处理 数据安全/隐私保护
【C/C++ 数据传输结构设计】GET与SEND的设计与实践
【C/C++ 数据传输结构设计】GET与SEND的设计与实践
72 0
|
4月前
|
编译器 开发工具 C++
【Python】已解决error: Microsoft Visual C++ 14.0 or greater is required. Get it with “Microsoft C++ Build
【Python】已解决error: Microsoft Visual C++ 14.0 or greater is required. Get it with “Microsoft C++ Build
1936 0
|
6月前
|
JSON Java 数据安全/隐私保护
java中的http请求的封装(GET、POST、form表单、JSON形式、SIGN加密形式)
java中的http请求的封装(GET、POST、form表单、JSON形式、SIGN加密形式)
490 1
|
1月前
|
Linux 开发工具 C语言
【c++】c++发送http请求
【c++】c++发送http请求
|
1月前
|
数据采集 Web App开发 数据安全/隐私保护
User-Agent在C++ HTTP请求中的作用
User-Agent在C++ HTTP请求中的作用
|
4月前
|
JSON Dart API
Flutter dio http 封装指南说明
本文介绍了如何实现一个通用、可重构的 Dio 基础类,包括单例访问、日志记录、常见操作封装以及请求、输出、报错拦截等功能。
110 2
Flutter dio http 封装指南说明
|
4月前
|
Java Spring
spring restTemplate 进行http请求的工具类封装
spring restTemplate 进行http请求的工具类封装
199 3
|
4月前
|
Go 开发者
golang的http客户端封装
golang的http客户端封装
61 0
|
5月前
|
缓存 负载均衡 NoSQL
Redis系列学习文章分享---第十四篇(Redis多级缓存--封装Http请求+向tomcat发送http请求+根据商品id对tomcat集群负载均衡)
Redis系列学习文章分享---第十四篇(Redis多级缓存--封装Http请求+向tomcat发送http请求+根据商品id对tomcat集群负载均衡)
81 1
|
6月前
|
XML JSON JavaScript
推荐一个比较好用的c++版本http协议库-cpp-httplib
推荐一个比较好用的c++版本http协议库-cpp-httplib
204 1