使用curl库post数据,不加ssl证书验证的话,只需要加两行参数即可

Http.h

#ifndef _HTTP_H_
#define _HTTP_H_

#include <curl/curl.h>
#include <string>
#include <iostream>
//#include "CJsonObject.hpp"


using namespace std;
//using namespace neb;


struct MemoryStruct {
    char *memory;
    size_t size;
};

class Http{
public:
    Http();
    ~Http();
    static string post(string url,const string data);
//    static CJsonObject post(string url,const CJsonObject& cjson_obj);

    void set_server_ip(string ip);

private:
    static int get_full_data(void *buffer,size_t size, size_t nmemb, void *userp);
    static size_t data_callback(void *buffer,size_t size, size_t nmemb, void *userp);

private:
    string server_ip;
};

#endif

Http.cpp

#include <string.h>

#include "Http.h"
//#include "zlog.h"
//#include "Global.h"



Http::Http()
{

}

Http::~Http()
{

}

int Http::get_full_data(void *buffer,size_t size, size_t nmemb, void *userp)
{
    size_t realsize = size * nmemb;
    if ((0 != realsize) && ((char*)userp != NULL)){
        struct MemoryStruct *mem = (struct MemoryStruct *)userp;
        char *ptr = (char*)realloc(mem->memory, mem->size + realsize + 1);
        if(ptr == NULL) {
            /* out of memory! */
            return 0;
        }
        mem->memory = ptr;
        memcpy(&(mem->memory[mem->size]), buffer, realsize);
        mem->size += realsize;
        mem->memory[mem->size] = 0;
    }
}

size_t Http::data_callback(void *buffer,size_t size, size_t nmemb, void *userp)
{
    size_t realsize = size * nmemb;
    get_full_data(buffer,size, nmemb, userp);
    return realsize;
}

string Http::post(string url,const string data)
{
    string recv;
    struct MemoryStruct chunk;
    chunk.memory = (char*)malloc(sizeof(char*));
    chunk.size = 0;
    CURL * curl = curl_easy_init();
    CURLcode res;
//    zlog_info(global_zlog_t,"post:%s",data.c_str());
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false);
    curl_easy_setopt(curl,CURLOPT_URL,url.c_str());
    curl_easy_setopt(curl,CURLOPT_POST,1L);
    curl_easy_setopt(curl,CURLOPT_POSTFIELDS,data.c_str());
    curl_easy_setopt(curl,CURLOPT_POSTFIELDSIZE,data.length());
    curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,data_callback);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)(&chunk));
    res = curl_easy_perform(curl);

    if (res != CURLE_OK) {
        fprintf(stderr, "curl_easy_perform() failed: %s\n",
                curl_easy_strerror(res));
    }
    if (res == CURLE_OK) {
        recv = string(chunk.memory);
    }

    curl_easy_cleanup(curl);
    free(chunk.memory);
    return recv;
}

/*
CJsonObject Http::post(string url,const CJsonObject& cjson_obj)
{
    CJsonObject recv;
    struct MemoryStruct chunk;
    chunk.memory = (char*)malloc(sizeof(char*));
    chunk.size = 0;
    CURL * curl = curl_easy_init();
    CURLcode res;
        struct curl_slist* header = NULL;
        string datastr = cjson_obj.ToString();
    zlog_info(global_zlog_t,"post:%s",datastr.c_str());
    //cout << "url:" << url.c_str() << endl;
        //cout << "send data:\n" << datastr.c_str() << endl;
        header = curl_slist_append(header,"Content-Type:application/json");

//    curl_easy_setopt(curl,CURLOPT_VERBOSE,1);
        curl_easy_setopt(curl,CURLOPT_HTTPHEADER,header);
    curl_easy_setopt(curl,CURLOPT_URL,url.c_str());
    curl_easy_setopt(curl,CURLOPT_POST,1L);
    curl_easy_setopt(curl,CURLOPT_POSTFIELDS,datastr.c_str());
    curl_easy_setopt(curl,CURLOPT_POSTFIELDSIZE,datastr.length());
    curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,data_callback);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)(&chunk));
    res = curl_easy_perform(curl);

    if (res != CURLE_OK) {
        fprintf(stderr, "curl_easy_perform() failed: %s\n",
                curl_easy_strerror(res));
    }
    if (res == CURLE_OK) {
                //cout << "chunk.memory:\n" << chunk.memory << endl;
        CJsonObject recv_tmp(string(chunk.memory));
                recv = recv_tmp;
    }

    curl_easy_cleanup(curl);
    free(chunk.memory);
    return recv;
}
*/
void Http::set_server_ip(string ip)
{

}

调用

QVariantMap param;
param["mod"] = "getsyscfg";
_log(MLogPath,param);
QString url = getHosturl();
string resultstr = Http::post(url.toStdString(),QJsonDocument::fromVariant(param).toJson().toStdString());
std::cout << "getsys:" << resultstr << std::endl;
QString result = QString::fromStdString(resultstr);

实现https发送数据重点是下面两行的配置

curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false);

CURLOPT_SSL_VERFYPEER :

设置这个选项,将会决定curl是否会验证证书的有效性,0 表示不会验证,1 表示会验证。默认值为1。

CURLOPT_SSL_VERIFYHOST :

当建立 TLS 和 SSL 连接的时候,服务器会发一个证书来表明它的身份。

    值为0时,不管证书的上的名称,也不验证证书是否正确。

    值为1时,检查证书中是否包含名称。

    值为2的时候,就表示要求服务器返回的证书中包含的服务器名称,必须和curl请求Url上的域名是一样的,否则连接会失败。(有可能弹出上述错误: “SSL peer certificate or SSH remote key was not OK”)

参考:

  • “SSL peer certificate or SSH remote key was not OK”的分析和解决
  • c++使用curl库发送https请求
  • c++ 使用curl发送https POST请求并获取返回数据(包含appKey与appSecret)