zoukankan      html  css  js  c++  java
  • jsoncpp 和 libcurl的编译与使用 vs2010

    jsoncpp的编译

    • 到对应的官网进行资源的下载
    • 打开jsoncpp-src-0.5.0 -> makefiles -> vs71 -> jsoncpp.sln
    • 转换项目为VS2010格式
    • 生成的.lib文件在 jsoncpp-src-0.5.0uildvs71debuglib_json中
      (注意编译的时候配置属性中 C/C++-->代码生成-->运行库中-->/MDd(对应的模式,否则会出现冲突))

    jsoncpp静态链接库SDK使用方法

    • 复制jsoncpp中的include文件至需要的项目中
    • 将lib文件放入项目包含的文件目录中(静态库相当于一个cpp文件,程序启动时是不需要的)
    • 在属性设置中导入lib库(相当于#include的操作,可以使用#program comment(lib,"XXX"))

    libcurl的编译

    • 到对应的官网下载curl-x.xx.x.zip文件。
    • 打开文件中的winbuild中的BUILD.WINDOWS.txt,使用vs命令行进行编译。
    • 生成了一个lib和一个dll文件

    libcurl库的使用方法

    • 复制libcurl中的include文件至需要的项目中
    • 将lib文件放入项目包含的文件目录中(静态库相当于一个cpp文件,程序启动时是不需要的),在属性设置中导入lib库(相当于#include的操作,可以使用#program comment(lib,"XXX")),将dll文件放入程序运行的目录(运行时加载dll)

    基本libcurl+jsoncpp测试代码如下

    #include <sstream>
    //json
    #include "json/json.h"
    #include "curl/curl.h"
    using namespace std;
    
    
    //http://blog.csdn.net/wyansai/article/details/50764315
    wstring AsciiToUnicode(const string& str) 
    {
    	// 预算-缓冲区中宽字节的长度  
    	int unicodeLen = MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, nullptr, 0);
    	// 给指向缓冲区的指针变量分配内存  
    	wchar_t *pUnicode = (wchar_t*)malloc(sizeof(wchar_t)*unicodeLen);
    	// 开始向缓冲区转换字节  
    	MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, pUnicode, unicodeLen);
    	wstring ret_str = pUnicode;
    	free(pUnicode);
    	return ret_str;
    }
    
    string UnicodeToUtf8(const wstring& wstr) 
    {
    	// 预算-缓冲区中多字节的长度  
    	int ansiiLen = WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, nullptr, 0, nullptr, nullptr);
    	// 给指向缓冲区的指针变量分配内存  
    	char *pAssii = (char*)malloc(sizeof(char)*ansiiLen);
    	// 开始向缓冲区转换字节  
    	WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, pAssii, ansiiLen, nullptr, nullptr);
    	string ret_str = pAssii;
    	free(pAssii);
    	return ret_str;
    }
    
    
    string AsciiToUtf8(const string& str) 
    {
    	return UnicodeToUtf8(AsciiToUnicode(str));
    }
    
    //回调函数
    size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream) 
    {
    	string data((const char*) ptr, (size_t) size * nmemb);
    
    	*((stringstream*) stream) << data << endl;
    
    	return size * nmemb;
    }
    
    //方式一:用JsonCpp构建Json串
    	//POST json
    int main()
    {
    	CURL *curl;
    	CURLcode res;
    	char tmp_str[256] = { 0 };
    	std::stringstream out;
    
    	//HTTP报文头  
    	struct curl_slist* headers = NULL;
    
    	char *url = "http://192.168.50.52:8082/";
    
    	curl = curl_easy_init();
    
    	if(curl)
    	{
    		//构建json
    		Json::Value item;
    		item["uid"]=Json::Value("chechenluoyang@163.com");
    		item["fileName"]=Json::Value("梅西&内马尔&苏亚雷斯.txt");
    		item["time"]=Json::Value("2017.07.31 9:55:22");
    		item["type"]=Json::Value("Libcurl HTTP POST Json串");
    		item["authList"]=Json::Value("weidong0925@126.com");
    		std::string jsonout = item.toStyledString();
    
    		jsonout = AsciiToUtf8(jsonout);
    
    		//设置url
    		curl_easy_setopt(curl, CURLOPT_URL, url);
    
    		//设置http发送的内容类型为JSON
    		//构建HTTP报文头  
    		sprintf_s(tmp_str, "Content-Length: %s", jsonout.c_str());
    		headers=curl_slist_append(headers, "Content-Type:application/json;charset=UTF-8");
    		//headers=curl_slist_append(headers, tmp_str);//在请求头中设置长度,请求会失败,还没找到原因
    
    		curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
    		//curl_easy_setopt(curl,  CURLOPT_CUSTOMREQUEST, "POST");//自定义请求方式
    		curl_easy_setopt(curl, CURLOPT_POST, 1);//设置为非0表示本次操作为POST
    
    		// 设置要POST的JSON数据
    		curl_easy_setopt(curl, CURLOPT_POSTFIELDS, jsonout.c_str());
    		curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, jsonout.size());//设置上传json串长度,这个设置可以忽略
    
    		// 设置接收数据的处理函数和存放变量
    		curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);//设置回调函数
    		curl_easy_setopt(curl, CURLOPT_WRITEDATA, &out);//设置写数据
    		res = curl_easy_perform(curl);//执行
    		curl_slist_free_all(headers); /* free the list again */
    		string str_json = out.str();//返回请求值 
    		printf("%s",str_json.c_str()); 
    
    		/* always cleanup */ 
    		curl_easy_cleanup(curl);
    	} 
    
    	return 0;
    }
    
    
  • 相关阅读:
    在QT函数中返回一个数组/把一个数组传参给函数
    QT储存内容到指定的文件内
    QT对linux下/sys/class/gpio中的gpio的控制
    QT 线程的暂停和继续
    QT的close和系统的close冲突
    画动态曲线另一种方式方式
    QT关于iCCP警告去除
    ps两张图片合在一起
    ps 做动态图
    解决MFC中因控件类多次Attch造成的销毁窗口过程中CWnd* pWnd = CWnd::FromHandlePermanent(hWnd); ASSERT(pWnd != NULL); 断言失败的问题
  • 原文地址:https://www.cnblogs.com/bookdrip/p/10599622.html
Copyright © 2011-2022 走看看