如何从C中的CURL请求接收JSON对象?
我用PHP实现了这一点,它相对简单。然而,它在C中更复杂,主要是因为cURL库更复杂,而且C不是面向对象的。以下是我迄今为止的代码片段:如何从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
#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不会帮你处理的哪个图书馆?你介意给我写个例子吗