C++通过HTTP请求Get或Post方式请求Json数据
转载: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数据相关推荐
- JSON进阶第二篇 AJAX方式传递JSON数据
上一篇<JSON进阶第一篇 在PHP与javascript 中使用JSON>示范了在PHP和javascript中如何使用JSON类型的数据,本篇将介绍用AJAX方式得到JSON数据从而动 ...
- C++通过HTTP请求Get或Post方式请求Json数据(转)
原文网址:https://www.cnblogs.com/shike8080/articles/6549339.html #pragma once #include <iostream> ...
- HttpURLConnection 使用 Post 方式传递 Json 数据网络请求实例小记
1.我新建了一个新项目,先添加权限: <uses-permission android:name="android.permission.INTERNET"/> 2.添 ...
- 学习AJAX必知必会(2)~Ajax基本使用,设置请求行、请求体、请求头,服务端响应JSON数据
一.Ajax的基本使用 1.核心对象 XMLHttpRequest,AJAX 的所有操作都是通过该对象进行的. 2.发送ajax请求(4个步骤): 创建xhr对象,然后open方法初始化,设置请求方式 ...
- django 使用Ajax方式POST JSON数据包
示例1: js: function SaveAction(){//点击 保存按键var senddata = {"type":"A", "host&q ...
- php curl form-data,在php curl multipart / form-data请求中发送一个文件和json数据
我正在尝试在PHP的curl请求中上传文件和json数据 . 请求在命令行中使用curl正常工作 . 这是命令行中的curl请求: curl -v --basic -u'username' -F fi ...
- java http 流_java 模拟http请求,通过流(stream)的方式,发送json数据和文件
发送端: /** * 以流的方式 * 发送文件和json对象 * * @return */ public static String doPostFileStreamAndJsonObj(String ...
- HttpClient通过Post方式发送Json数据
服务器用的是Springmvc,接口内容: [java] view plaincopy print? @ResponseBody @RequestMapping(value="/order& ...
- php 使用curl通过post方式提交json数据
2019独角兽企业重金招聘Python工程师标准>>> $arrayData = array("name" => "Hagrid", & ...
最新文章
- 配置hadoop集群一
- lisp直线连接圆象限电_圆并不难,为什么很多考生就是学不会?
- Asp.net 批量导入Excel用户数据功能加强版
- 【分享】纯js的n级联动列表框 —— 基于jQuery,支持下拉列表框和列表框,最重要的是n级,当然还有更重要的...
- Android开发中的logcat工具使用方法
- # 2017-2018-1 20155336《信息安全技术》实验二——Windows口令破解
- 如何用 Python 从 0 开始创建一个区块链?
- 2021Java面经:史上最全的《Java面试题及解析》
- 乾颐堂现任明教教主(2014年课程)TCPIP协议详解卷一 第四节课笔记
- 深入FM和FFM原理与实践
- EOS多节点环境部署
- java 渲染_Java字体渲染
- 网易蜗牛读书产品分析报告
- Java程序员跳槽之旅,离开京东,14面面试回顾和一点感想
- Java多线程(学习分享)
- 真香!取得软考证书可参加通信行业高级职称转评转升
- Google Play开发者账号注册过程中的安全问题
- 面试总结:移动web设计与开发
- 基于java的保险业务管理系统的设计与实现
- 【码蹄集新手村 600 题】判断输入的俩个正整数是否为蛮生质数(蛮生素数)
热门文章
- 线性代数——向量、向量加法、向量数乘
- html如何让窗口不在任务栏显示,电脑最小化窗口后无法在任务栏中显示怎么解决...
- matlab中怎么归一化频率,浅谈频率归一化问题
- 超融合解决方案已成新黑马 市场排名初见端倪
- 带宽测试初探(UDP发包方式)
- 安卓 模拟返回按键
- 脑电EEG的几种蒙太奇
- mui报错:[Intervention] Unable to preventDefault inside passive event listener due to target being
- autojs教程:完善找图函数,图片内随机点击
- Ubuntu 16.04 安装 vivado2018.3