目錄題目分析代碼結果 題目 利用聚合API平臺的API介面,利用HTTP協議向伺服器發送請求,並接受伺服器的響應,要求利用cJSON庫對伺服器的響應數據進行解析,並輸出到終端 分析 1.需從代碼托管網站GitHub或SourceForge代碼網站下載cJSON庫及閱讀下載的README相關手冊如何使 ...
目錄
題目
利用聚合API平臺的API介面,利用HTTP協議向伺服器發送請求,並接受伺服器的響應,要求利用cJSON庫對伺服器的響應數據進行解析,並輸出到終端
分析
1.需從代碼托管網站GitHub或SourceForge代碼網站下載cJSON庫及閱讀下載的README相關手冊如何使用cJSON庫;
2.使用聚合API平臺的笑話大全的API,URL需使用自己的介面密鑰;
3.伺服器響應回來的包體,需使用strstr()函數查找子串,找到JSON格式的字元串。
代碼
/***********************************************************************************
*
* file name: demo.c
* author : [email protected]
* 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 [email protected] 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;
}