C++通过HTTP请求Get或Post⽅式请求Json数据(转)
#pragma once
#include <iostream>
#include <windows.h>
#include <wininet.h>
using namespace std;
//每次读取的字节数
#define READ_BUFFER_SIZE 4096
enum HttpInterfaceError
{
Hir_Success = 0, //成功
Hir_InitErr, //初始化失败
Hir_ConnectErr, //连接HTTP服务器失败
Hir_SendErr, //发送请求失败
Hir_QueryErr, //查询HTTP请求头失败
Hir_404, //页⾯不存在
Hir_IllegalUrl, //⽆效的URL
Hir_CreateFileErr, //创建⽂件失败
Hir_DownloadErr, //下载失败
Hir_QueryIPErr, //获取域名对应的地址失败
Hir_SocketErr, //套接字错误
Hir_UserCancel, //⽤户取消下载
Hir_BufferErr, //⽂件太⼤,缓冲区不⾜
Hir_HeaderErr, //HTTP请求头错误
Hir_ParamErr, //参数错误,空指针,空字符
Hir_UnknowErr,
};
enum HttpRequest
{
Hr_Get,
Hr_Post
};
class CWininetHttp
{
public:
CWininetHttp(void);
~CWininetHttp(void);
public:
// 通过HTTP请求:Get或Post⽅式获取JSON信息 [3/14/2017/shike]
const std::string RequestJsonInfo( const std::string& strUrl,
HttpRequest type = Hr_Get,
std::string lpHeader = "",
std::string lpPostData = "");
protected:
/
/ 解析卡⼝Json数据 [3/14/2017/shike]
void ParseJsonInfo(const std::string &strJsonInfo);
// 关闭句柄 [3/14/2017/shike]
void Release();
// 释放句柄 [3/14/2017/shike]
void ReleaseHandle( HINTERNET& hInternet );
// 解析URL地址 [3/14/2017/shike]
void ParseURLWeb( std::string strUrl, std::string& strHostName, std::string&
strPageName, WORD& sPort);
// UTF-8转为GBK2312 [3/14/2017/shike]
char* UtfToGbk(const char* utf8);
private:
HINTERNET m_hSession;
HINTERNET m_hConnect;
HINTERNET m_hRequest;
HttpInterfaceError m_error;
};
/*************************************************
File name : WininetHttp.cpp
Description: 通过URL访问HTTP请求⽅式获取JSON
Author : shike
Version : 1.0
Date : 2016/10/27
Copyright (C) 2016 - All Rights Reserved
*************************************************/
#include "WininetHttp.h"
//#include "Common.h"
//#include <json/json.h>
#include <fstream>
//#include "common/CVLog.h"
#pragma comment(lib, "Wininet.lib")
#include <tchar.h>
using namespace std;
extern CCVLog CVLog;
CWininetHttp::CWininetHttp(void):m_hSession(NULL),m_hConnect(NULL),m_hRequest(NULL)
{
}
CWininetHttp::~CWininetHttp(void)
{
Release();
}
// 通过HTTP请求:Get或Post⽅式获取JSON信息 [3/14/2017/shike]
const std::string CWininetHttp::RequestJsonInfo(const std::string& lpUrl,
HttpRequest type/* = Hr_Get*/,
std::string strHeader/*=""*/,
std::string strPostData/*=""*/)
{
std::string strRet = "";
try
{
if ( pty())
if ( pty())
{
throw Hir_ParamErr;
}
Release();
m_hSession = InternetOpen(_T("Http-connect"), INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, NULL); //局部
if ( NULL == m_hSession )
{
throw Hir_InitErr;
}
INTERNET_PORT port = INTERNET_DEFAULT_HTTP_PORT;
std::string strHostName = "";
std::string strPageName = "";
ParseURLWeb(lpUrl, strHostName, strPageName, port);
printf("lpUrl:%s,\nstrHostName:%s,\nstrPageName:%s,\nport:%d\n",lpUrl.c_str(),strHostName.c_str(),strPageName.c_str(), (int)port);
m_hConnect = InternetConnectA(m_hSession, strHostName.c_str(), port, NULL, NULL, INTERNET_SERVICE_HTTP, NULL, NULL);
if ( NULL == m_hConnect )
{
throw Hir_ConnectErr;
}
std::string strRequestType;
if ( Hr_Get == type )
{
strRequestType = "GET";
}
else
{
strRequestType = "POST";
}
m_hRequest = HttpOpenRequestA(m_hConnect,strRequestType.c_str(), strPageName.c_str(),"HTTP/1.1", NULL, NULL, INTERNET_FLAG_RELOAD, NULL);
if ( NULL == m_hRequest )
{
throw Hir_InitErr;
}
DWORD dwHeaderSize = (pty()) ? 0 : strlen(strHeader.c_str());
BOOL bRet = FALSE;
if ( Hr_Get == type )
{
bRet = HttpSendRequestA(m_hRequest,strHeader.c_str(),dwHeaderSize,NULL, 0);
}
else
{
DWORD dwSize = (pty()) ? 0 : strlen(strPostData.c_str());
bRet = HttpSendRequestA(m_hRequest,strHeader.c_str(),dwHeaderSize,(LPVOID)strPostData.c_str(), dwSize);
}
if ( !bRet )
{
throw Hir_SendErr;
}
}
char szBuffer[READ_BUFFER_SIZE + 1] = {0};
DWORD dwReadSize = READ_BUFFER_SIZE;
if ( !HttpQueryInfoA(m_hRequest, HTTP_QUERY_RAW_HEADERS, szBuffer, &dwReadSize, NULL) )
{
throw Hir_QueryErr;
}
if ( NULL != strstr(szBuffer, "404") )
{
throw Hir_404;
}
while( true )
{
bRet = InternetReadFile(m_hRequest, szBuffer, READ_BUFFER_SIZE, &dwReadSize);
if ( !bRet || (0 == dwReadSize) )
{
break;
}
szBuffer[dwReadSize]='\0';
strRet.append(szBuffer);
}
}
catch(HttpInterfaceError error)
{
m_error = error;
}
return std::move(strRet);
}
// 解析Json数据 [11/8/2016/shike]
//void CWininetHttp::ParseJsonInfo(const std::string &strJsonInfo)
/
/{
// Json::Reader reader; //解析json⽤Json::Reader
// Json::Value value; //可以代表任意类型
// if (!reader.parse(strJsonInfo, value))
// {
// CVLog.LogMessage(LOG_LEVEL_ERROR,"[CXLDbDataMgr::GetVideoGisData] Video Gis parse "); // }
// if (!value["result"].isNull())
// {
// int nSize = value["result"].size();
// for(int nPos = 0; nPos < nSize; ++nPos) //对数据数组进⾏遍历
// {connect下载
//PGCARDDEVDATA stru ;
//stru.strCardName = value["result"][nPos]["tollgateName"].asString();
//stru.strCardCode = value["result"][nPos]["tollgateCode"].asString();
//std::string strCDNum = value["result"][nPos]["laneNumber"].asString(); //增加:车道总数
//stru.nLaneNum = atoi(strCDNum.c_str());
//std::string strLaneDir = value["result"][nPos]["laneDir"].asString(); //增加:车道⽅向,进⾏规则转换
//std::string strLaneDir = value["result"][nPos]["laneDir"].asString(); //增加:车道⽅向,进⾏规则转换
//stru.strLaneDir = TransformLaneDir(strLaneDir);
//stru.dWgs84_x = value["result"][nPos]["wgs84_x"].asDouble();
//stru.dWgs84_y = value["result"][nPos]["wgs84_y"].asDouble();
//stru.dMars_x = value["result"][nPos]["mars_x"].asDouble();
/
/stru.dMars_y = value["result"][nPos]["mars_y"].asDouble();
//place_back(stru);
// }
// }
//}
// 解析URL地址 [3/14/2017/shike]
void CWininetHttp::ParseURLWeb( std::string strUrl, std::string& strHostName, std::string& strPageName, WORD& sPort) {
sPort = 80;
string strTemp(strUrl);
std::size_t nPos = strTemp.find("");
if (nPos != std::string::npos)
{
strTemp = strTemp.substr(nPos + 7, strTemp.size() - nPos - 7);
}
nPos = strTemp.find('/');
if ( nPos == std::string::npos ) //没有到
{
strHostName = strTemp;
}
else
{
strHostName = strTemp.substr(0, nPos);
}
std::size_t nPos1 = strHostName.find(':');
if ( nPos1 != std::string::npos )
{
std::string strPort = strTemp.substr(nPos1 + 1, strHostName.size() - nPos1 - 1);
strHostName = strHostName.substr(0, nPos1);
sPort = (WORD)atoi(strPort.c_str());
}
if ( nPos == std::string::npos )
{
return ;
}
strPageName = strTemp.substr(nPos, strTemp.size() - nPos);
}
// 关闭句柄 [3/14/2017/shike]
void CWininetHttp::Release()
{
ReleaseHandle(m_hRequest);
ReleaseHandle(m_hConnect);
ReleaseHandle(m_hSession);
}
// 释放句柄 [3/14/2017/shike]
void CWininetHttp::ReleaseHandle( HINTERNET& hInternet )
{
if (hInternet)
{
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论