最近在工作中,由于合作商只提供uRL,我这边需要通过HTTP请求Get或Post方式请求Json数据,然后解析JSON格式,解析json我使用的第三方库jsoncpp,代码如下
#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 ( lpUrl.empty()) { 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, strHostName:%s, strPageName:%s, port:%d ",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 = (strHeader.empty()) ? 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 = (strPostData.empty()) ? 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]='