如何从C中的CURL请求接收JSON对象?

如何从C中的CURL请求接收JSON对象?,c,curl,libcurl,C,Curl,Libcurl,我用PHP实现了这一点,它相对简单。然而,它在C中更复杂,主要是因为cURL库更复杂,而且C不是面向对象的。以下是我迄今为止的代码片段: #include <curl/curl.h> /* Make first curl call */ curl_global_init(); //initialize first curl instance CURL *handle; CURLcode response; handle = curl_easy_init(); //craft

我用PHP实现了这一点,它相对简单。然而,它在C中更复杂,主要是因为cURL库更复杂,而且C不是面向对象的。以下是我迄今为止的代码片段:

#include <curl/curl.h>

/* Make first curl call */

curl_global_init();

//initialize first curl instance
CURL *handle;
CURLcode response;
handle = curl_easy_init();

//craft url
char *url = "https://example.com/";

//set url
curl_easy_setopt(handle, CURLOPT_URL, url);

//get resonse
response = curl_easy_perform(handle);

//clean up
curl_easy_cleanup(handle);
#包括
/*打第一个电话*/
curl_global_init();
//初始化第一个curl实例
卷曲*手柄;
编码响应;
handle=curl\u easy\u init();
//工艺网址
char*url=”https://example.com/";
//设置url
curl_easy_setopt(句柄、CURLOPT_URL、URL);
//得到响应
响应=卷曲,易于操作(手柄);
//清理
卷曲便于清洁(手柄);
curl应该使用get,而且我不应该在其中一个curlopts中指定
Accept:application/json
#include <curl/curl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
    size_t len;
    void*  buf;
} Body;

typedef size_t (*WriteFunction)(void*, size_t, size_t, void*);

static size_t write_body(const void* ptr, size_t size, size_t nmemb, Body* body_ptr) {
    size_t new_len = body_ptr->len + ( size * nmemb );
    if (new_len == 0)
       return 0;

    char* new_buf = realloc(body_ptr->buf, new_len);
    if (new_buf == NULL)
       return 0;

    memcpy(((char*)body_ptr) + new_len, ptr, ( size * nmemb ));

    body_ptr->len = new_len;
    body_ptr->buf = new_buf;
}

static int write_all(int fd, void* buf, size_t remaining) {
    while (remaining > 0) {
        ssize_t written = write(STDOUT, buf, remaining);
        if (written == -1)
            return 0;

        remaning -= written;
        buf = ((char*)buf) + written;
    }

    return 1;
}

int main(void) {
    CURL* curl = NULL;
    struct curl_slist* header_list = NULL;
    Body body = { 0, NULL };
    int error = 1;

    curl = curl_easy_init();
    if (curl != NULL) {
        fprintf(stderr, "curl_easy_init() failed\n");
        goto ERROR;
    }

    curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
    curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L);
    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);

    header_list = curl_slist_append(header_list, "Accept: application/json");
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, header_list);

    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, (WriteFunction)write_body);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &body);

    CURLcode res = curl_easy_perform(curl);
    if (res != CURLE_OK)
        fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
        goto ERROR;
    }

    long http_code;
    curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code);
    if (http_code < 200 || http_code >= 300) {
        fprintf(stderr, "Request not successful: HTTP error code %ld\n", http_code);
        goto ERROR;
    }

    if (body.len == 0) {
        printf("Empty response\n");
    } else {
        printf("Received %zu bytes\n", body.len);
        fflush(stdout);
        if (!write_all(STDOUT, body->buf, body->len)) {
            perror("write");
            goto ERROR;
        }
    }

    error = 0;
ERROR:
    if ( body.buf != NULL    ) free(body.buf);
    if ( header_list != NULL ) curl_slist_free_all(header_list);
    if ( curl != NULL        ) curl_easy_cleanup(curl);
    return error;
}
#包括 #包括 #包括 类型定义结构{ 尺寸透镜; 无效*buf; }身体; typedef size\u t(*WriteFunction)(void*,size\u t,size\u t,void*); 静态大小写入正文(常量无效*ptr、大小大小、大小nmemb、正文*body ptr){ 大小新长度=车身长度->长度+(大小*nmemb); 如果(新长度==0) 返回0; char*new\u buf=realloc(body\u ptr->buf,new\u len); if(new_buf==NULL) 返回0; memcpy(((char*)body_ptr)+新的_len,ptr,(size*nmemb)); body_ptr->len=新的_len; body_ptr->buf=新建_buf; } 静态int-write_-all(int-fd,void*buf,剩余大小){ 而(剩余>0){ ssize_t writed=写入(标准输出、基本输出、剩余); 如果(写入==-1) 返回0; 还押-=书面; buf=((char*)buf)+书面形式; } 返回1; } 内部主(空){ CURL*CURL=NULL; struct curl\u slist*header\u list=NULL; 正文={0,NULL}; 整数误差=1; curl=curl_easy_init(); if(curl!=NULL){ fprintf(stderr,“curl\u easy\u init()失败\n”); 转到错误; } curl\u easy\u setopt(curl,CURLOPT\u URL,“https://example.com/"); curl_easy_setopt(curl,CURLOPT_HTTPGET,1L); 卷曲位置(卷曲,卷曲位置,1L); header\u list=curl\u slist\u append(header\u list,“Accept:application/json”); curl\u easy\u setopt(curl、CURLOPT\u HTTPHEADER、header\u列表); curl\u easy\u setopt(curl,CURLOPT\u WRITEFUNCTION,(WRITEFUNCTION)write\u body); curl_easy_setopt(curl、CURLOPT_WRITEDATA和body); CURLcode res=curl\u easy\u perform(curl); 如果(res!=卷曲(OK) fprintf(stderr,“curl\u easy\u perform()失败:%s\n”,curl\u easy\u strerror(res)); 转到错误; } 长http_代码; curl\u easy\u getinfo(curl、CURLINFO\u RESPONSE\u代码和http\u代码); 如果(http|U代码<200|http|U代码>=300){ fprintf(stderr,“请求未成功:HTTP错误代码%ld\n”,HTTP\u代码); 转到错误; } 如果(body.len==0){ printf(“空响应\n”); }否则{ printf(“已接收%zu字节\n”,body.len); fflush(stdout); 如果(!全部写入(标准输出,正文->基本单位,正文->长度)){ 佩罗(“书面”); 转到错误; } } 误差=0; 错误: 如果(body.buf!=NULL)自由(body.buf); 如果(header\u list!=NULL)curl\u slist\u free\u all(header\u list); 如果(curl!=NULL)curl\u easy\u cleanu(curl); 返回误差; }
未测试。

一旦获得json响应,我将如何解析它并获得值?需要一个单独的json库;CURL不会帮你处理的哪个图书馆?你介意给我写个例子吗