利用聚合API平台的API接口,利用HTTP协议向服务器发送请求,并接受服务器的响应,要求利用cJSON库对服务器的响应数据进行解析,并输出到终端

news/2024/10/5 3:28:29

目录
  • 题目
  • 分析
  • 代码
  • 结果

题目


利用聚合API平台的API接口,利用HTTP协议向服务器发送请求,并接受服务器的响应,要求利用cJSON库对服务器的响应数据进行解析,并输出到终端

分析


1.需从源代码网站GitHub或SourceForge代码网站下载cJSON库及阅读下载的README相关手册如何使用cJSON库;

2.使用聚合API平台的笑话大全的API,URL需使用自己的接口密钥;

3.服务器响应回来的包体,需使用strstr()函数查找子串,找到JSON格式的字符串。

代码


/***********************************************************************************
*
*	file name:	demo.c
*	author	 :  cnzycwp@126.com 
*	date	 :  2024/06/11
*	function :  该案例是利用聚合API平台的API接口,利用HTTP协议向服务器发送请求,并接受
*               服务器的响应,要求利用cJSON库对服务器的响应数据进行解析,并输出到终端
* 	note	 :  该函数使用了cJSON库,需要先下载cJSON库,并将其包含到工程中
*               编译时需要添加cJSON.c文件,即gcc demo.c cJSON.c -o demo
*   version  :
*
*	CopyRight (c)  2023-2024   cnzycwp@126.com   All Right Reseverd 
*
* **********************************************************************************/
/************************************头文件*****************************************/
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/udp.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include "cJSON.h"
/***********************************************************************************/
/************************************宏定义*****************************************/
#define  PORT  	80
#define  IPADDR "203.107.54.210"
#define  APPKEY "xxx"  //聚合API平台的API接口密钥
/***********************************************************************************/
int main(int argc, char const *argv[])
{//1.创建TCP套接字int tcp_socket = socket(AF_INET, SOCK_STREAM, 0);if (tcp_socket == -1){fprintf(stderr, "tcp socket error,errno:%d,%s\n",errno,strerror(errno));exit(1);}//2.发起连接请求,等待接受服务器接受连接struct sockaddr_in  dest_addr;dest_addr.sin_family 		= AF_INET; 						//协议族,是固定的dest_addr.sin_port   		= htons(PORT);					//服务器端口,必须转换为网络字节序dest_addr.sin_addr.s_addr   = inet_addr(IPADDR);			//服务器地址   int ret = connect(tcp_socket,(struct sockaddr *)&dest_addr,sizeof(dest_addr));if (ret < 0){fprintf(stderr, "connect error,errno:%d,%s\n",errno,strerror(errno));exit(1);}//3.用于存储HTTP的请求内容: 请求行 + 请求字段 + \r\n + 请求包体(可选)  char reqbuf[1024] = {0};sprintf(reqbuf,"GET http://v.juhe.cn/joke/content/list.php?key=%s&sort=desc&page=1&pagesize=1&time=1418816972 ""HTTP/1.1""\r\n""Host:v.juhe.cn\r\n""Content-Type:application/x-www-form-urlencoded\r\n""\r\n",APPKEY);//4.说明双方建立连接,此时可以利用HTTP协议发送请求信息,并等待服务器的响应  基于请求/响应send(tcp_socket,reqbuf,strlen(reqbuf),0);//5.等待服务器的响应char recvbuf[1024] = {0};recv(tcp_socket,recvbuf,sizeof(recvbuf),0);  //第一次返回的响应参数//6.查找子串char *recv_body = strstr(recvbuf,"{");//7.对响应包体进行JSON解析//1) 先把获取的字符串转换为JSON格式cJSON * obj = cJSON_Parse(recv_body);//2) 把解析之后的JSON格式进行输出,用于调试// printf("%s\n",cJSON_Print(obj));//3) 对JSON格式进行解析cJSON * result = NULL;result = cJSON_GetObjectItem(obj, "result");cJSON * data = NULL;data = cJSON_GetObjectItem(result, "data");cJSON * obj1 = NULL;obj1 = cJSON_GetArrayItem(data, 0);cJSON * content = NULL;content = cJSON_GetObjectItem(obj1, "content");//8.显示笑话内容printf("content : %s\n",content->valuestring);//9.关闭套接字close(tcp_socket);return 0;
}

结果


image

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hjln.cn/news/44242.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

[DP] [倍增优化] Luogu P1081 [NOIP2012 提高组] 开车旅行

[NOIP2012 提高组] 开车旅行 题目描述 小 \(\text{A}\) 和小 \(\text{B}\) 决定利用假期外出旅行,他们将想去的城市从 $1 $ 到 \(n\) 编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 \(i\) 的海拔高度为\(h_i\),城市 \(i\) 和城市 \…

【esp32 学习笔记】让SD卡发光发热~

原理图:图 SD卡部分图 MCU中与SD卡相关的接口 连接关系如下:[ESP32 IO26 – CS MICROSD] [ESP32 IO23 – MOSI(DI) MICROSD] [ESP32 IO19 – MISO(DO) MICROSD] [ESP32 IO18 – SCK MICROSD] [ESP32 GND – GND MICROSD] [3.3V – VCC MICROSD] 软件: 我们将使用SD卡库…

网络编程练习题---利用cJSON库对服务器返回的JSON格式数据完成解析

利用HTTP协议向聚合数据API发送请求,并利用cJSON库对服务器返回的JSON格式数据完成解析目录题目注意事项实现代码结果展示相关接口指引 题目利用某些平台(聚合API、百度AI、科大讯飞API)的API接口,利用HTTP协议向服务器发送请求,并接受服务器的响应,要求利用cJSON库对服务…

嵌入式Linux中的LED驱动控制(续)

前面的实例实现了在野火STM32MP157开发板上对三个LED灯的控制,这里来讨论一下该驱动程序的具体实现方式。由于实例使用的是STM32MP157这款芯片,所以先来看一下与该芯片端口操作相关的寄存器。 先看端口模式寄存器MODER,该类型的寄存器在STM32MP157中有11个,即x的值从A到K。…

通讯协议转换Modbus转Profinet网关

Modbus转Profinet网关是工业通信转换设备,能够实现Modbus协议与Profinet协议之间的有效转换和稳定传输。通过该网关,工业设备之间可以实现数据交换和通信,提高生产效率和智能化程度。支持Modbus RTU主从站。此外,Modbus转 Profinet网关自带网络和串口,支持485/232接口Modb…

python栈帧沙箱逃逸

python栈帧沙箱逃逸 一、生成器 生成器(Generator)是 Python 中一种特殊的迭代器,它可以通过简单的函数和表达式来创建。生成器的主要特点是能够逐个产生值,并且在每次生成值后保留当前的状态,以便下次调用时可以继续生成值。这使得生成器非常适合处理大型数据集或需要延迟…

spring-1-IOC、创建bean的方式、创建bean的过程

1.背景 IOC(Inversion of Control,控制反转) 控制反转是一种设计原则,它将对象的创建和管理责任从应用代码中移交给容器。 在Spring中,IOC容器负责管理应用中的所有对象,包括它们的生命周期和相互之间的依赖关系。 IOC的主要目的是为了减少代码之间的耦合,使代码更加模块…

11-CSS定位

CSS定位01 CSS定位概念理解 01 标准流布局概念的理解02 position属性02 相对定位 依然在标准流中 应用场景: 在不影响其它元素的情况下,对当前元素进行微调 <!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8"><met…