C++ 一个简单的实现HTTP GET和POST请求的类
最近有个项目需要用到HTTP GET和POST请求,但是网上没有找到特别好用的类,就自己写了一个。
这个类除了实现了GET和POST请求,还有对Response中的头部分信息的简单处理。
代码主要参考
[ C++ 实现 发送HTTP Get/Post请求 ]。
头文件很简单:
#pragma once
#include <string>
#include <vector>
class HttpRequest
public:
HttpRequest(const std::string& ip, int port);
~HttpRequest(void);
std::string HttpGet(std::string req);
std::string HttpPost(std::string req, std::string data);
static std::string genJsonString(std::string key, int value);
static std::vector<std::string> split(const std::string &s, const std::string &seperator);
static std::string getHeader(std::string respose, std::string key);
private:
std::string m_ip;
int m_port;
CPP文件
CPP文件:
#include "HttpRequest.h"
#include <WinSock.h>
#include <iostream>
#pragma comment(lib, "ws2_32.lib")
HttpRequest::HttpRequest(const std::string& ip, int port) : m_ip(ip), m_port(port)
HttpRequest::~HttpRequest(void)
std::string HttpRequest::HttpGet(std::string req)
std::string ret = "";
WSADATA wData;
::WSAStartup(MAKEWORD(2, 2), &wData);
SOCKET clientSocket = socket(AF_INET, 1, 0);
struct sockaddr_in ServerAddr = {0};
ServerAddr.sin_addr.s_addr = inet_addr(m_ip.c_str());
ServerAddr.sin_port = htons(m_port);
ServerAddr.sin_family = AF_INET;
int errNo = connect(clientSocket, (sockaddr*)&ServerAddr, sizeof(ServerAddr));
if(errNo == 0)
std::string strSend = " HTTP/1.1\r\n"
"Cookie:16888\r\n\r\n";
strSend = "GET " + req + strSend;
errNo = send(clientSocket, strSend.c_str(), strSend.length(), 0);
if(errNo > 0)
std::cout << "errNo:" << errNo << std::endl;
return ret;
char bufRecv[3069] = {0};
errNo = recv(clientSocket, bufRecv, 3069, 0);
if(errNo > 0)
ret = bufRecv;
std::cout << "errNo:" << errNo << std::endl;
return ret;
errNo = WSAGetLastError();
std::cout << "errNo:" << errNo << std::endl;
::WSACleanup();
catch (...)
return "";
return ret;
std::string HttpRequest::HttpPost(std::string req, std::string data)
std::string ret = "";
WSADATA wData;
::WSAStartup(MAKEWORD(2, 2), &wData);
SOCKET clientSocket = socket(AF_INET, 1, 0);
struct sockaddr_in ServerAddr = {0};
ServerAddr.sin_addr.s_addr = inet_addr(m_ip.c_str());
ServerAddr.sin_port = htons(m_port);
ServerAddr.sin_family = AF_INET;
int errNo = connect(clientSocket, (sockaddr*)&ServerAddr, sizeof(ServerAddr));
if(errNo == 0)
char len[10] = {0};
sprintf(len, "%d", data.length());
std::string strLen = len;
std::string strSend = " HTTP/1.1\r\n"
"Cookie:16888\r\n"
"Content-Type:application/x-www-form-urlencoded\r\n"
"Charset:utf-8\r\n"
"Content-Length:";
strSend = "POST " + req + strSend + strLen + "\r\n\r\n" + data;
errNo = send(clientSocket, strSend.c_str(), strSend.length(), 0);
if(errNo > 0)
std::cout << "errNo:" << errNo << std::endl;
return ret;
char bufRecv[3069] = {0};
errNo = recv(clientSocket, bufRecv, 3069, 0);
if(errNo > 0)
ret = bufRecv;
std::cout << "errNo:" << errNo << std::endl;
return ret;
errNo = WSAGetLastError();
::WSACleanup();
catch (...)
return "";
return ret;
std::string HttpRequest::genJsonString(std::string key, int value)
char buf[128] = {0};
sprintf(buf, "{\"%s\":%d}", key.c_str(), value);
std::string ret = buf;
return ret;
std::vector<std::string> HttpRequest::split(const std::string &s, const std::string &seperator)
std::vector<std::string> result;
typedef std::string::size_type string_size;
string_size i = 0;
while(i != s.size()){
int flag = 0;
while(i != s.size() && flag == 0){
flag = 1;
for(string_size x = 0; x < seperator.size(); ++x)
if(s[i] == seperator[x]){
flag = 0;
break;
flag = 0;
string_size j = i;
while(j != s.size() && flag == 0){
for(string_size x = 0; x < seperator.size(); ++x)
if(s[j] == seperator[x]){
flag = 1;
break;
if(flag == 0)
if(i != j){
result.push_back(s.substr(i, j-i));
i = j;
return result;
std::string HttpRequest::getHeader(std::string respose, std::string key)
std::vector<std::string> lines = split(respose, "\r\n");
for (int i = 0; i < lines.size(); i++)
std::vector<std::string> line = split(lines[i], ": ");
if (line.size() >= 2 && line[0] == key)
return line[1];
return "";
写了一个简单的控制台程序,用于测试:
#include "HttpRequest.h"
#include <iostream>
#include <Windows.h>
int _tmain(int argc, _TCHAR* argv[])
HttpRequest httpReq("192.168.10.100", 8888);
std::string res = httpReq.HttpGet("/getsomething/");
std::cout << res << std::endl;
Sleep(1000);
res = httpReq.HttpPost("/postsomething/", HttpRequest::genJsonString("something", 100));
std::cout << res << std::endl;
return 0;
- 发送的字符串中,“GET”和“POST”一定要用大写字母,否则会出现出现HTTP 400 错误;
- POST请求如果有内容(std::string data不为空),“Content-Length”一定要有;
- 亲测可用;
CInternetSession mysession;
二、连接到Http服务器:
CHttpConnection*myconn=mysession.GetHttpConnection("www.baidu.com");
三、打开Http请求:
CHttpFile*myfile=myconn->OpenRequest(
转载:C++通过HTTP请求Get或Post方式请求Json数据
最近在工作中,由于合作商只提供uRL,我这边需要通过HTTP请求Get或Post方式请求Json数据,然后解析JSON格式,解析json我使用的第三方库jsoncpp,代码如下
#pragma once
#include <iostream>
#include <windows.h>
#include <wininet.h>
using namespace std;
//每次读取的字节数
#define
1、简述最近简单看了一下关于HTTP请求方面的知识,之前一直用Qt来实现,有专门HTTP请求的QNetworkAccessManager类来处理,实现也比较简单,这里主要讲解一下用C++代码来实现HTTP 的Get/Post请求。
一个HTTP请求报文由请求行(request line)、请求头(header)、和请求数据*3个部分组成,注意请求头部分和请求数据中间需要加上“\r\n”*。下图给
所谓的HTTP协议是基于IP/TCP协议的, 所以要获取远端的html数据只要创建socket对象就足够了;
HTTP是基于IP/TCP加上了网络请求的固定格式, 比如:
运行下面代码
method
Content-hos...
HTTP(超文本传输协议)是一种客户端与服务端的传输协议,最早用于浏览器和服务器之间的通信,后来因为其使用灵活、方便等特点,广泛用于客户端与服务端的通信。文章将简单介绍HTTP协议,同时以C++方式分别实现HTTP GET、POST 请求
HTTP 请求报文
HTTP请求报文的一般格式由4部分组成:请求行、请求头部、空行、请求数据。如下图所示:
请求行:包含3部分内容:请求方法,URL,...
原文地址:http://www.cnblogs.com/lidabo/p/6404533.html
纯C++实现的HTTP请求(POST/GET),支持windows和linux,
进行简单的封装, 方便调用。实现如下:
#include "HttpConnect.h"
#ifdef WIN32
#pragma comment(lib,"ws2_32.lib")
#endif
Http...
目录准备其他情况代码实现包含文件实现代码函数解释调用注意事项
c++调用httppost方法实现报文转发接收之前的准备工作,先通过postman测试接口是否连通。
这里的是地址+端口+接口 后面一定要加上 ?param=
然后看返回的报文是否正确
如果电脑没有postman可以用ie浏览器代替,地址+端口+接口 后面一定要加上 ?param= +发送报文,回车查看页面。
代码实现
下面 包含的头文件与l
一.采用libcurl库进行HTTP 通信,采用jsoncpp 进行json生成与解析
二.libcurl编译过程中的问题与解决
无法解析的外部符号 __imp__curl_easy_init
WIN7下一个errorMSB3073的解决办法
VS2010 c++ 错误的处理方法
关于形如--error LNK2005: xxx 已经在 msvcrtd.lib ( MS...