转载: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 READ_BUFFER_SIZE        4096enum HttpInterfaceError
{Hir_Success = 0,        //成功Hir_InitErr,            //初始化失败Hir_ConnectErr,            //连接HTTP服务器失败Hir_SendErr,            //发送请求失败Hir_QueryErr,            //查询HTTP请求头失败Hir_404,                //页面不存在Hir_IllegalUrl,            //无效的URLHir_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,\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 = (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]='\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::ReaderJson::Value value;                                        //可以代表任意类型if (!reader.parse(strJsonInfo, value))  {  CVLog.LogMessage(LOG_LEVEL_ERROR,"[CXLDbDataMgr::GetVideoGisData] Video Gis parse data error...");}if (!value["result"].isNull())        {int nSize = value["result"].size();for(int nPos = 0; nPos < nSize; ++nPos)                //对数据数组进行遍历{//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();        //增加:车道方向,进行规则转换//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();//lstCardDevData.emplace_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("http://");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) { InternetCloseHandle(hInternet); hInternet = NULL; }
}// UTF-8转为GBK2312 [3/14/2017/shike]
char* CWininetHttp::UtfToGbk(const char* utf8)
{int len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0);wchar_t* wstr = new wchar_t[len+1];memset(wstr, 0, len+1);MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wstr, len);len = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL);char* str = new char[len+1];memset(str, 0, len+1);WideCharToMultiByte(CP_ACP, 0, wstr, -1, str, len, NULL, NULL);if(wstr) delete[] wstr;return str;
}

C++通过HTTP请求Get或Post方式请求Json数据相关推荐

  1. JSON进阶第二篇 AJAX方式传递JSON数据

    上一篇<JSON进阶第一篇 在PHP与javascript 中使用JSON>示范了在PHP和javascript中如何使用JSON类型的数据,本篇将介绍用AJAX方式得到JSON数据从而动 ...

  2. C++通过HTTP请求Get或Post方式请求Json数据(转)

    原文网址:https://www.cnblogs.com/shike8080/articles/6549339.html #pragma once #include <iostream> ...

  3. HttpURLConnection 使用 Post 方式传递 Json 数据网络请求实例小记

    1.我新建了一个新项目,先添加权限: <uses-permission android:name="android.permission.INTERNET"/> 2.添 ...

  4. 学习AJAX必知必会(2)~Ajax基本使用,设置请求行、请求体、请求头,服务端响应JSON数据

    一.Ajax的基本使用 1.核心对象 XMLHttpRequest,AJAX 的所有操作都是通过该对象进行的. 2.发送ajax请求(4个步骤): 创建xhr对象,然后open方法初始化,设置请求方式 ...

  5. django 使用Ajax方式POST JSON数据包

    示例1: js: function SaveAction(){//点击 保存按键var senddata = {"type":"A", "host&q ...

  6. php curl form-data,在php curl multipart / form-data请求中发送一个文件和json数据

    我正在尝试在PHP的curl请求中上传文件和json数据 . 请求在命令行中使用curl正常工作 . 这是命令行中的curl请求: curl -v --basic -u'username' -F fi ...

  7. java http 流_java 模拟http请求,通过流(stream)的方式,发送json数据和文件

    发送端: /** * 以流的方式 * 发送文件和json对象 * * @return */ public static String doPostFileStreamAndJsonObj(String ...

  8. HttpClient通过Post方式发送Json数据

    服务器用的是Springmvc,接口内容: [java] view plaincopy print? @ResponseBody @RequestMapping(value="/order& ...

  9. php 使用curl通过post方式提交json数据

    2019独角兽企业重金招聘Python工程师标准>>> $arrayData = array("name" => "Hagrid", & ...

最新文章

  1. 配置hadoop集群一
  2. lisp直线连接圆象限电_圆并不难,为什么很多考生就是学不会?
  3. Asp.net 批量导入Excel用户数据功能加强版
  4. 【分享】纯js的n级联动列表框 —— 基于jQuery,支持下拉列表框和列表框,最重要的是n级,当然还有更重要的...
  5. Android开发中的logcat工具使用方法
  6. # 2017-2018-1 20155336《信息安全技术》实验二——Windows口令破解
  7. 如何用 Python 从 0 开始创建一个区块链?
  8. 2021Java面经:史上最全的《Java面试题及解析》
  9. 乾颐堂现任明教教主(2014年课程)TCPIP协议详解卷一 第四节课笔记
  10. 深入FM和FFM原理与实践
  11. EOS多节点环境部署
  12. java 渲染_Java字体渲染
  13. 网易蜗牛读书产品分析报告
  14. Java程序员跳槽之旅,离开京东,14面面试回顾和一点感想
  15. Java多线程(学习分享)
  16. 真香!取得软考证书可参加通信行业高级职称转评转升
  17. Google Play开发者账号注册过程中的安全问题
  18. 面试总结:移动web设计与开发
  19. 基于java的保险业务管理系统的设计与实现
  20. 【码蹄集新手村 600 题】判断输入的俩个正整数是否为蛮生质数(蛮生素数)

热门文章

  1. 线性代数——向量、向量加法、向量数乘
  2. html如何让窗口不在任务栏显示,电脑最小化窗口后无法在任务栏中显示怎么解决...
  3. matlab中怎么归一化频率,浅谈频率归一化问题
  4. 超融合解决方案已成新黑马 市场排名初见端倪
  5. 带宽测试初探(UDP发包方式)
  6. 安卓 模拟返回按键
  7. 脑电EEG的几种蒙太奇
  8. mui报错:[Intervention] Unable to preventDefault inside passive event listener due to target being
  9. autojs教程:完善找图函数,图片内随机点击
  10. Ubuntu 16.04 安装 vivado2018.3