基于服务器响应的实时天气数据进行JSON解析的详细代码及其框架

cnblogs 2024-06-12 08:15:01 阅读 92

#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 "116.62.81.138"//地址

#define KEY "SNGgI2upxur590NHn" // 私钥

#define LOCAL "beijing" //城市

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); // 服务器地址

//ret用来进行下一步的connect连接是否成功进行判断

int ret = connect(tcp_socket, (struct sockaddr *)&dest_addr, sizeof(dest_addr));

//ret = 0连接成功,ret = -1连接失败

if (ret < 0)

{

fprintf(stderr, "connect error,errno:%d,%s\n", errno, strerror(errno));

exit(1);

}

// 3.用于存储HTTP的请求内容: 请求行(HRI+(空格))+ 请求字段 + \r\n + 请求包体(可选)+\r\n

char reqbuf[1024] = {0};

sprintf(reqbuf, "GET https://api.seniverse.com/v3/weather/now.json?key=%s&location=%s&language=en&unit=c "

"HTTP/1.1"

"\r\n"

"Host:api.seniverse.com\r\n"

"\r\n",

KEY, LOCAL);

// 4.说明双方建立连接,此时可以利用HTTP协议发送请求信息,并等待服务器的响应 基于请求/响应

send(tcp_socket, reqbuf, strlen(reqbuf), 0);

// 5.等待服务器的响应

char recvbuf[1024] = {0};

recv(tcp_socket, recvbuf, sizeof(recvbuf), 0); // 第一次返回的响应参数

printf("%s", recvbuf);

bzero(recvbuf, 1024);

recv(tcp_socket, recvbuf, sizeof(recvbuf), 0); // 第二次返回的响应包体

printf("%s\n", recvbuf);

// 6.对响应包体进行JSON解析

// 1) 先把获取的字符串转换为JSON格式

cJSON *obj = cJSON_Parse(recvbuf);

// 2) 把解析之后的JSON格式进行输出,用于调试

printf("%s\n", cJSON_Print(obj));

// 3) 对JSON格式进行解析

cJSON *results = NULL;

results = cJSON_GetObjectItem(obj, "results");

printf("array size = %d\n", cJSON_GetArraySize(results));

// 4)对城市的实时温度数据进行解析

cJSON *result = NULL;

cJSON_ArrayForEach(result, results)

{

cJSON *now = cJSON_GetObjectItem(result, "now");

cJSON *temperature = cJSON_GetObjectItem(now, "temperature");

printf("temperature : %s\n", temperature->valuestring);

printf("temperature : %d\n", atoi(temperature->valuestring));

}

return 0;

}



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。