在MFC中使用第三方库libcurb实现向服务器发送Json数据。
1.下载libcurl源代码,下载地址:http://curl.haxx.se/download
可以使用7.26.0的版本,使用dsw的工程。
2.用VS2010打开工程curl-7.26.0\vc6curl.dsw,默认转换,可以直接编译成功,可以调整多字节或unicode字符集,debug或release编译成libcurl.lib静态库和libcurld.lib静态库
3.在自己的MFC项目文件夹中curl7.26\include和上一步编译的静态库,如下图所示。
4.配置项目
(1).配置静态库、引用库和包含库目录,如下图所示:
(2)在工程中加上CURL_STATICLIB宏,然后依次重新构建
(3)在stdAfx.h中加入隐式链接
#define CURL_STATICLIB
#ifdef _DEBUG
#pragma comment(lib,"libcurld.lib")
#else
#pragma comment(lib,"libcurl.lib")
#endif
#pragma comment (lib, "ws2_32.lib")
#pragma comment (lib, "winmm.lib")
#pragma comment (lib, "wldap32.lib")
#pragma comment (lib, "Shell32.lib")
#pragma comment (lib, "Shlwapi.lib")
(4)在项目的头文件中加入#include "curllib\include\curl\curl.h"
5.具体应用实现。
void CXXXDlg::SendJsonData()
{
COleDateTime timeMy = COleDateTime::GetCurrentTime();
CString timeNow = timeMy.Format("%Y%m%dS%H%M%S%W");
srand((unsigned)time(NULL));
int x = 10000 + rand() % (99999 - 10000 + 1);//[a,b]的随机整数,使用(rand() % (b-a+1))+ a;
CString idNow;
idNow.Format("%s%d",timeNow,x)
CURL *curl;
CURLcode res;
char szJsonData[1024];
//HTTP报文头
struct curl_slist* headers = NULL;
char *url = (char*)(LPCTSTR)m_serverAddress;
curl = curl_easy_init();
if(curl)
{
//string类型的json串
memset(szJsonData, 0, sizeof(szJsonData));
std::string strJson = "{";
strJson += "\"test1\" : 302,";
strJson += "\"test2\" : \""+idNow+"\",";
strJson += "\"test3\" : \"\"";
strJson += "}";
strcpy(szJsonData, strJson.c_str());
strJson = AsciiToUtf8(strJson);//如果json串中包含有中文,必须进行转码
std::stringstream out;
//设置url
curl_easy_setopt(curl, CURLOPT_URL, url);
// 设置http发送的内容类型为JSON
//构建HTTP报文头
headers=curl_slist_append(headers, "Content-Type:application/json;charset=UTF-8");
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, strJson.c_str());//以多字节上传
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, strJson.c_str());//以Unicode编码上传
// 设置接收数据的处理函数和存放变量
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();//返回值 例如:{"status":"ok"}
str_json = UTF8ToGB(str_json);
/* always cleanup */
curl_easy_cleanup(curl);
}
}
//字符转换
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));
}
string UTF8ToGB(const string& str)
{
string result;
WCHAR *strSrc;
LPSTR szRes;
//获得临时变量的大小
int i = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, NULL, 0);
strSrc = new WCHAR[i + 1];
MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, strSrc, i);
//获得临时变量的大小
i = WideCharToMultiByte(CP_ACP, 0, strSrc, -1, NULL, 0, NULL, NULL);
szRes = new CHAR[i + 1];
WideCharToMultiByte(CP_ACP, 0, strSrc, -1, szRes, i, NULL, NULL);
result = szRes;
delete[]strSrc;
delete[]szRes;
return result;
}
参考地址:https://blog.csdn.net/z550449054/article/details/78683795
https://blog.csdn.net/z550449054/article/details/78621180
https://blog.csdn.net/z550449054/article/details/78683976
https://blog.csdn.net/z550449054/article/details/78621263