欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C语言使用libcurl与json-c方法(代码实例)

程序员文章站 2022-07-09 22:23:36
C语言使用libcurl与json-c方法(代码实例) #include #include #include #include #include #inc...

C语言使用libcurl与json-c方法(代码实例)

#include 
#include 
#include 
#include 
#include 
#include 

struct curl_return_string {
    char *str;
    size_t len;
    size_t size;
}; // 用于存curl返回的结果

size_t _recive_data_from_http_api(void *buffer, size_t size, size_t nmemb, void *user_p)
{
*/
    struct curl_return_string *result_t = (struct curl_return_string *)user_p;

    if (result_t->size < ((size * nmemb) + 1)) {
        result_t->str = (char *)realloc(result_t->str, (size * nmemb) + 1);
        if (result_t->str == NULL) {
            return 0;
        }
        result_t->size = (size * nmemb) + 1;
    }

    result_t->len = size * nmemb;
    memcpy(result_t->str, buffer, result_t->len);
    result_t->str[result_t->len] = '\0';

    return result_t->len;
}

int get_mail_signature_status(char *url, char *subject, char *body)
{
    int ret_mail = 0;
    // 声明保存返回 http 的结果
    struct curl_return_string curl_result_t;

    curl_result_t.len = 0;
    curl_result_t.str = (char *)calloc(1, 1024);
    if (curl_result_t.str == NULL) {
        log_error("calloc fail for curl_result_t.str");
        return 0;
    }
    curl_result_t.size = 1024;

    curl_global_init(CURL_GLOBAL_ALL);

    CURL *curl;
    CURLcode ret;

    // init curl
    curl = curl_easy_init();
    if (!curl) {
        log_error("couldn't init curl");
        return 0;
    }

    curl_easy_setopt(curl, CURLOPT_URL, url);
    curl_easy_setopt(curl, CURLOPT_POST, 1);    // use post 

    // urlencode post data
    char *subject_encode = curl_easy_escape(curl, subject, strlen(subject));
    if (!subject_encode) {
        log_error("urlencode subject fail, so use source data");
        subject_encode = subject;
    }

    char *body_encode = curl_easy_escape(curl, body, strlen(body));
    if (!body_encode) {
        log_error("urlencode body fail, so use source data");
        body_encode = body;
    }

    int request_data_len = 18 + strlen(subject_encode) + strlen(body_encode) + 2;
    char *request_data = (char *)calloc(1, request_data_len) ;
    if (request_data == NULL) {
        log_error("calloc fail for request_data");
        curl_easy_cleanup(curl);
        curl_global_cleanup();

        return 0;
    }

    snprintf(request_data, request_data_len, "subject=%s&content=%s", subject_encode, body_encode);
    log_debug("request data:%s\n", request_data);

    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, request_data);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, _recive_data_from_http_api);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &curl_result_t);  // 传这个参数过去

    ret = curl_easy_perform(curl);
    if(ret != CURLE_OK) {
        log_error("curl_easy_perform() failed:%s, url:%s", curl_easy_strerror(ret), url);
    } else {
        if (curl_result_t.str) {
            log_info("request url:%s response:%s", url, curl_result_t.str);

            // parse result with json
            // {"err_code":200,"err_msg": "this is no error", "sign":11281921309418229, "status": 1}'
            struct array_list *tmp_array;
            struct json_object *tmp_obj;
            struct json_object *result_json;

            result_json = json_tokener_parse(curl_result_t.str);

            tmp_obj = json_object_object_get(result_json, "err_code");
            int err_code = json_object_get_int(tmp_obj);
            if (err_code == 0) {
                tmp_obj = json_object_object_get(result_json, "sign");
                const char *key = json_object_get_string(tmp_obj);

                tmp_obj = json_object_object_get(result_json, "status");
                int status = json_object_get_int(tmp_obj);

                log_info("key[%s] status[%d]\n", key, status);

                // status: 0:非垃圾;1:垃圾邮件; 2: 疑似垃圾
                ret_mail = status;
            } else {
                log_info("call signature api fail:%s", curl_result_t.str);

                ret_mail = 0;
            }
        }
    }

    if (subject_encode != NULL) {
        free(subject_encode);
        subject_encode = NULL;
    }
    if (body_encode != NULL) {
        free(body_encode);
        body_encode = NULL;
    }
    if (request_data != NULL) {
        free(request_data);
        request_data = NULL;
    }
    if (curl_result_t.str != NULL) {
        free(curl_result_t.str);
        curl_result_t.str = NULL;
        curl_result_t.len = 0;
        curl_result_t.size = 0;
    }

    curl_easy_cleanup(curl);
    curl_global_cleanup();

    return ret_mail;
}

int main(int argc, char **argv)
{
    char signature_url[] = "https://10.29.11.110/monitor/curl_test.php";
    
    int ret = get_mail_signature_status(signature_url, argv[1], argv[2]);
    switch (ret) {
        case 0:
            printf("is good mail\n");
            break;
        case 1:
            printf("is bad mail\n");
            break;
        case 2:
            printf("is unknown mail\n");
            break;
        default:
            printf("has error\n");
            break;
    };

    return 0;
}