热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何在C中使用curl和解析json响应

下面的代码编译并打印响应。我的问题是:作为响应,一个字符串表示一个对

下面的代码编译并打印响应。

我的问题是:作为响应,一个字符串表示一个对象,我如何将“ res”转换为字符串或直接转换为json对象?

#include
#include
#include
int main(int argc,char **argv) {
CURL *curl;
CURLcode res;
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl,CURLOPT_CUSTOMREQUEST,"GET");
curl_easy_setopt(curl,CURLOPT_URL,"http://localhost:8080/system/genpass");
curl_easy_setopt(curl,CURLOPT_FOLLOWLOCATION,1L);
curl_easy_setopt(curl,CURLOPT_DEFAULT_PROTOCOL,"https");
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers,"length: 20");
headers = curl_slist_append(headers,"numbers: true");
curl_easy_setopt(curl,CURLOPT_HTTPHEADER,headers);
res = curl_easy_perform(curl);
printf("%u",res);
}
curl_easy_cleanup(curl);
}


您不能简单地将函数的返回代码转换为字符串。
它们没有任何关系。

相反,您需要直接处理接收到的数据。
为此,您需要注册一个可以处理数据的回调函数。
cURL manual中对此进行了说明。

示例:

typedef struct {
unsigned char *buffer;
size_t len;
size_t buflen;
} get_request;
#define CHUNK_SIZE 2048
size_t write_callback(char *ptr,size_t size,size_t nmemb,void *userdata)
{
size_t realsize = size * nmemb;
get_request *req = (get_request *) userdata;
printf("receive chunk of %zu bytes\n",realsize);
while (req->buflen len + realsize + 1)
{
req->buffer = realloc(req->buffer,req->buflen + CHUNK_SIZE);
req->buflen += CHUNK_SIZE;
}
memcpy(&req->buffer[req->len],ptr,realsize);
req->len += realsize;
req->buffer[req->len] = 0;
return realsize;
}
int main(int argc,char **argv) {
CURL *curl;
CURLcode res;
curl = curl_easy_init();
get_request req = {.buffer = NULL,.len = 0,.buflen = 0};
if (curl) {
curl_easy_setopt(curl,CURLOPT_CUSTOMREQUEST,"GET");
curl_easy_setopt(curl,CURLOPT_URL,"https://example.com");
curl_easy_setopt(curl,CURLOPT_FOLLOWLOCATION,1L);
curl_easy_setopt(curl,CURLOPT_DEFAULT_PROTOCOL,"https");
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers,"length: 20");
headers = curl_slist_append(headers,"numbers: true");
curl_easy_setopt(curl,CURLOPT_HTTPHEADER,headers);
req.buffer = malloc(CHUNK_SIZE);
req.buflen = CHUNK_SIZE;
curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,write_callback);
curl_easy_setopt(curl,CURLOPT_WRITEDATA,(void *)&req);
res = curl_easy_perform(curl);
printf("Result = %u\n",res);
printf("Total received bytes: %zu\n",req.len);
printf("Received data:/n%s\n",req.buffer);
free(req.buffer);
}
curl_easy_cleanup(curl);
}

输出:

receive chunk of 1256 bytes
Result = 0
Total received bytes: 1256
Received data:











Example Domain


This domain is for use in illustrative examples in documents. You may use this
domain in literature without prior coordination or asking for permission.


More information...





完成GET请求后,您可以访问req->buffer中的数据并解析JSON对象或任何其他数据。
需要添加错误检查(针对realloc等)。

我使用了一种方法,该方法能够处理任何数量的接收到的块中的任何长度的内容。
如果知道所需内容的长度,则可以使用固定大小的缓冲区。

在我的示例中可以看到,下载完成后用户数据结构仍然存在,并且可以在curl_easy_perform返回之后派生内容。


推荐阅读
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • phpcomposer 那个中文镜像是不是凉了 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 如何利用 Myflash 解析 binlog ?
    本文主要介绍了对Myflash的测试,从准备测试环境到利用Myflash解析binl ... [详细]
  • 本文为Codeforces 1294A题目的解析,主要讨论了Collecting Coins整除+不整除问题。文章详细介绍了题目的背景和要求,并给出了解题思路和代码实现。同时提供了在线测评地址和相关参考链接。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了C函数ispunct()的用法及示例代码。ispunct()函数用于检查传递的字符是否是标点符号,如果是标点符号则返回非零值,否则返回零。示例代码演示了如何使用ispunct()函数来判断字符是否为标点符号。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • Postgresql备份和恢复的方法及命令行操作步骤
    本文介绍了使用Postgresql进行备份和恢复的方法及命令行操作步骤。通过使用pg_dump命令进行备份,pg_restore命令进行恢复,并设置-h localhost选项,可以完成数据的备份和恢复操作。此外,本文还提供了参考链接以获取更多详细信息。 ... [详细]
  • 本文介绍了如何使用PHP代码将表格导出为UTF8格式的Excel文件。首先,需要连接到数据库并获取表格的列名。然后,设置文件名和文件指针,并将内容写入文件。最后,设置响应头部,将文件作为附件下载。 ... [详细]
  • Centos7搭建ELK(Elasticsearch、Logstash、Kibana)教程及注意事项
    本文介绍了在Centos7上搭建ELK(Elasticsearch、Logstash、Kibana)的详细步骤,包括下载安装包、安装Elasticsearch、创建用户、修改配置文件等。同时提供了使用华为镜像站下载安装包的方法,并强调了保证版本一致的重要性。 ... [详细]
  • 本文讨论了在使用PHP cURL发送POST请求时,请求体在node.js中没有定义的问题。作者尝试了多种解决方案,但仍然无法解决该问题。同时提供了当前PHP代码示例。 ... [详细]
author-avatar
feng2502863897
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有