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

json · 浏览次数 : 0

小编点评

```cpp #include #include #include #include #include #include #include #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); // 服务器地址 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的请求内容 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\nHost: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\n", 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)); cJSON *results = NULL; results = cJSON_GetObjectItem(obj, "results"); printf("array size = %d\n", cJSON_GetArraySize(results)); // 3) 对城市的实时温度数据进行解析 cJSON *result = NULL; cJSON_ArrayForEach(result, results) { cJSON *now = cJSON_GetObjectItem(result, "now"); cJSON *temperature = cJSON_GetObjectItem(now, "temperature"); printf("temperature : %s ", temperature->valuestring); printf("temperature : %d ", atoi(temperature->valuestring)); } return 0; } ``` 这是用C语言编写的简单TCP客户端程序,用于向特定服务器发送HTTP请求并接收响应。程序首先创建一个TCP套接字,然后发起连接请求并等待服务器响应。在连接到服务器后,构建HTTP请求并发送请求信息。接收到服务器的响应后,程序解析响应包体并将其解析为JSON格式。最后,程序输出解析后的JSON数据中的城市实时温度数据。

正文

#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;
}

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

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

#include #include #include #include #include #include #include

Go中 net/http 使用

转载请注明出处: net/http是Go语言标准库中的一个包,提供了实现HTTP客户端和服务器的功能。它使得编写基于HTTP协议的Web应用程序变得简单和方便。 net/http包的主要用途包括: 实现HTTP客户端:可以发送HTTP请求并接收服务器的响应。 实现HTTP服务器:可以创建一个HTTP

基于WebSocket的modbus通信(二)- 客户端

上一篇已经实现了ModbusTcp服务器和8个主要的功能码,只是还没有实现错误处理功能。 但是在测试客户端时却发现了上一篇的一个错误,那就是写数据成功,服务器不需要响应。 接下来要做的就是实现ModbusTcp客户端。有了清晰的协议,代码循规蹈矩的写就行了。 效果 原始数据 其中只读寄存器和线圈都有

C/S UDP通信实践踩坑记录与对于ICMP的进一步认识

背景 最近有个业务场景需要服务端(简称S)与客户端(简称C)设计一套基于UDP的通信协议--要求尽可能快的前提下可容忍一定丢包率,得以比较深入地学习和了解UDP通信和实践,在开发调试期间先后碰到了C端UDP发包无响应、响应Host Unreachable、响应Port Unreachable、再次C

百度飞桨(PaddlePaddle) - PP-OCRv3 文字检测识别系统 基于 Paddle Serving快速使用(服务化部署 - CentOS 7)

Paddle Serving 是飞桨服务化部署框架,能够帮助开发者轻松实现从移动端、服务器端调用深度学习模型的远程预测服务。 Paddle Serving围绕常见的工业级深度学习模型部署场景进行设计,具备完整的在线服务能力,支持的功能包括多模型管理、模型热加载、基于Baidu-RPC的高并发低延迟响应能力、在线模型A/B实验等,并提供简单易用的Client API。Paddle Serving可以

云享·案例丨打造数智物流底座,华为云DTSE助力物联云仓解锁物流新“速度”

摘要:华为云凭借领先的技术和快速响应的开发者支持服务,助力物联亿达实现云上资源高可用、提升系统安全性与稳定性,为物联亿达提供了扎实的数字化基础。 本文分享自华为云社区《云享·案例丨打造数智物流底座,华为云DTSE助力物联云仓解锁物流新“速度”》,作者:华为云社区精选 。 数字化转型浪潮席卷全球,企业

ajax面试题总结

转载请注明出处: 1.ajax异步和同步的区别 Ajax是一种基于JavaScript语言和XMLHttpRequest对象的异步数据传输技术,通过它可以使不用刷新整个页面的情况下,对页面进行部分更新。 同步和异步是指客户端发送请求时,主线程是否会阻塞等待服务器的响应返回。 同步请求在发送请求后,客

非侵入式入侵 —— Web缓存污染与请求走私

本文介绍了两种攻击者无需直接接触服务端即可攻击和影响用户行为的安全漏洞 —— Web缓存污染与请求走私。Web缓存污染旨在通过攻击者向缓存服务器投递恶意缓存内容,使得用户返回响应结果而触发安全风险。HTTP请求走私旨在基于前置服务器(CDN、反向代理等)与后置服务器对用户请求体的长度判断标准不一致的特性,构造能够被同一TCP连接中其它用户夹带部分恶意内容的攻击请求,从而篡改了受害者的请求与响应行为

基于webapi的websocket聊天室(番外二)

我比较好奇的是webapi服务器怎么处理http请求和websocket请求。有了上一篇番外的研究,这里就可以试着自己写个非常简易的webapi服务器来接收这两种请求。 效果 http请求 消息打印 响应解析 websocket请求 消息打印 使用聊天室测试 其实两种请求差不多,就只是一些头部字段有

基于WebSocket的modbus通信(三)- websocket和串口

WebSocket传递ModbusTCP数据包 错误纠正 上一篇还有个错误,就是客户端写数据时服务端不需要响应,但我的服务端响应了的。我选择改客户端,把写数据时接收到的响应丢弃。 PrintBytes(ADUMessage.Serialze(request), "请求"); if (Client !