MFC中使用第三方库libcurb实现向服务器发送Json数据

在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和上一步编译的静态库,如下图所示。

MFC中使用第三方库libcurb实现向服务器发送Json数据_第1张图片

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

你可能感兴趣的:(linux,大数据)