curl封装

一。由于工作的原因,需要对curl做一些封装,附加上我们的证书,提供给第三个C++和jAVA使用。

二。头文件封闭四个函数,get,post,download,upload

#ifndef CURLHTTP_H
#define CURLHTTP_H

#include <iostream>
#include <string>
#include <curl/curl.h>

class CurlHttp {
public:
CurlHttp();
~CurlHttp();

CURLcode get(const std::string& url, std::string& response);
CURLcode post(const std::string& url, const std::string& data, std::string& response);
CURLcode download(const std::string& url, const std::string& savePath);
CURLcode upload(const std::string& url, const std::string& filePath, std::string& response);
private:
CURL* curl;

static size_t WriteCallback(void* contents, size_t size, size_t nmemb, std::string* response);
void setSSLSettings();
};

#endif // CURLHTTP_H

三。实现Cpp,返回一个CURLcode方便出错时追踪错误

#include "CurlHttp.h"

CurlHttp::CurlHttp() {
    curl = curl_easy_init();
    if (!curl) {
        std::cerr << "Failed to initialize cURL" << std::endl;
    }
}

CurlHttp::~CurlHttp() {
    if (curl) {
        curl_easy_cleanup(curl);
    }
}

CURLcode CurlHttp::get(const std::string& url, std::string& response) {
    CURLcode res = CURLE_FAILED_INIT;
    if (curl) {
        curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
        setSSLSettings();
        res = curl_easy_perform(curl);
        if (res != CURLE_OK) {
            std::cerr << "cURL GET request failed: " << curl_easy_strerror(res) << std::endl;
        }
    }
    return res;
}

CURLcode CurlHttp::post(const std::string& url, const std::string& data, std::string& response) {
    CURLcode res = CURLE_FAILED_INIT;
    if (curl) {
        curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data.c_str());
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
        setSSLSettings();
        // 设置请求头为JSON类型
        struct curl_slist* headers = nullptr;
        headers = curl_slist_append(headers, "Content-Type: application/json");
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
        res = curl_easy_perform(curl);
        if (res != CURLE_OK) {
            std::cerr << "cURL POST request failed: " << curl_easy_strerror(res) << std::endl;
        }
    }
    return res;
}

CURLcode CurlHttp::download(const std::string& url, const std::string& savePath) {
    CURLcode res = CURLE_FAILED_INIT;
    if (curl) {
        FILE* file = fopen(savePath.c_str(), "wb");
        if (file) {
            curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
            curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, NULL);
            curl_easy_setopt(curl, CURLOPT_WRITEDATA, file);
            setSSLSettings();
            res = curl_easy_perform(curl);
            if (res != CURLE_OK) {
                std::cerr << "cURL download failed: " << curl_easy_strerror(res) << std::endl;
            }
            fclose(file);
        } else {
            std::cerr << "Failed to open file for writing: " << savePath << std::endl;
            res = CURLE_FAILED_INIT;
        }
    }
    return res;
}

CURLcode CurlHttp::upload(const std::string& url, const std::string& filePath, std::string& response) {
    CURLcode res = CURLE_FAILED_INIT;
    if (curl) {
        FILE* file = fopen(filePath.c_str(), "rb");
        if (file) {
            curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
            curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
            curl_easy_setopt(curl, CURLOPT_READDATA, file);
            curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
            curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
            setSSLSettings();
            res = curl_easy_perform(curl);
            if (res != CURLE_OK) {
                std::cerr << "cURL upload failed: " << curl_easy_strerror(res) << std::endl;
            }
            fclose(file);
        } else {
            std::cerr << "Failed to open file for reading: " << filePath << std::endl;
            res = CURLE_FAILED_INIT;
        }
    }
    return res;
}

size_t CurlHttp::WriteCallback(void* contents, size_t size, size_t nmemb, std::string* response) {
    size_t total_size = size * nmemb;
    //response->append((char*)contents, total_size);
    response->append(static_cast<char*>(contents), totalSize);
    return total_size;
}

void CurlHttp::setSSLSettings() {
    // 设置证书路径
    curl_easy_setopt(curl, CURLOPT_CAINFO, "/path/to/certificate.pem");

    // 设置私钥路径
    curl_easy_setopt(curl, CURLOPT_SSLKEY, "/path/to/private.key");

    // 设置私钥密码(如果有的话)
    curl_easy_setopt(curl, CURLOPT_KEYPASSWD, "password");
}

四。测试函数:

#include <iostream>
#include "CurlHttp.h"

int main() {
    CurlHttp curlHttp;

    // 发起 GET 请求
    std::string url = "https://api.example.com/data";
    std::string response;
    CURLcode res = curlHttp.get(url, response);
    if (res == CURLE_OK) {
        std::cout << "GET request successful. Response: " << response << std::endl;
    } else {
        std::cerr << "GET request failed. Error: " << curl_easy_strerror(res) << std::endl;
    }

    // 发起 POST 请求
    url = "https://api.example.com/post";
    std::string data = "key1=value1&key2=value2";
    response.clear();
    res = curlHttp.post(url, data, response);
    if (res == CURLE_OK) {
        std::cout << "POST request successful. Response: " << response << std::endl;
    } else {
        std::cerr << "POST request failed. Error: " << curl_easy_strerror(res) << std::endl;
    }

    // 下载文件
    url = "https://example.com/file.jpg";
    std::string savePath = "/path/to/save/file.jpg";
    res = curlHttp.download(url, savePath);
    if (res == CURLE_OK) {
        std::cout << "File downloaded successfully and saved at: " << savePath << std::endl;
    } else {
        std::cerr << "File download failed. Error: " << curl_easy_strerror(res) << std::endl;
    }

    // 上传文件
    url = "https://api.example.com/upload";
    std::string filePath = "/path/to/upload/file.txt";
    response.clear();
    res = curlHttp.upload(url, filePath, response);
    if (res == CURLE_OK) {
        std::cout << "File uploaded successfully. Response: " << response << std::endl;
    } else {
        std::cerr << "File upload failed. Error: " << curl_easy_strerror(res) << std::endl;
    }

    return 0;
}

六。创建一个aidl文件

package com.example.yourpackage; // 替换为您的包名

interface ICurlHttpService {
    int get(in String url, out String response);
    int post(in String url, in String data, out String response);
    int download(in String url, in String savePath);
    int upload(in String url, in String filePath, out String response);
}