首页 > 其他分享 >由心知天气服务器响应的实时天气数据并进行JSON解析

由心知天气服务器响应的实时天气数据并进行JSON解析

时间:2024-06-17 23:32:28浏览次数:13  
标签:recvbuf addr cJSON 天气 JSON 由心知 include socket

由心知天气服务器响应的实时天气数据并进行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 "你注册的心知天气的私钥" // 私钥
#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;
}

所需文件
image

编译

gcc JSON.c cJSON.c -o JSON

运行指令(在当前路径)

./JSON

运行结果
image

标签:recvbuf,addr,cJSON,天气,JSON,由心知,include,socket
From: https://www.cnblogs.com/CamelliaWY/p/18253440

相关文章

  • 基于html,css,js,jQuery,ajax实时天气的网页
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><linkrel="stylesheet"hr......
  • Java JSON组成和解析
    本框架JSON元素组成和分析,JsonElement分三大类型JsonArray,JsonObject,JsonString。JsonArray:数组和Collection子类,指定数组的话,使用ArrayList来add元素,遍历ArrayList再使用Array.newInstance生成数组并添加元素即可.JsonObject:带有泛型的封装类,给带有泛型的字段赋......
  • 要将URL参数转换为JSON对象,可以使用以下函数:
    要将URL参数转换为JSON对象,可以使用以下函数:javascriptfunctiongetQueryParams(url){//使用正则表达式提取URL参数constparamsString=url.split('?')[1];if(!paramsString){return{};}//将参数字符串分割成数组,并解析键值对constparams=......
  • 支付宝spi接口设计验签和返回结果加签注意点,支付宝使用JSONObject对象
    支付宝spi接口设计验签和返回结果加签注意点,支付宝使用JSONObject对象SPI三方服务接入指南https://opendocs.alipay.com/isv/spiforisv服务端实现Demo以下Demo是通过Java实现的SPI服务样例,包括验签支付宝请求报文、业务逻辑处理、商家加签以及响应报文构造的逻辑。......
  • 支付宝签名和验签使用JSONObject是最优解。json字符串顺序和==符号都一致演示代码
    支付宝签名和验签使用JSONObject是最优解。json字符串顺序和==符号都一致演示代码支付宝spi接口设计验签和返回结果加签注意点,支付宝使用JSONObject对象https://www.cnblogs.com/oktokeep/p/18249346packagecom.example.core.mydemo;importcom.alibaba.fastjson.JSON;imp......
  • 基于cJSON及心知天气模块化实现获取城市气象信息(现在、未来)
    V1.02024年6月14日发布于博客园目录序言功能描述运行结果示范注意!代码weather_api.hweather_api.cdemo.ccJSON.hcJSON.c参考链接序言功能描述用于请求心知天气的信息,现在的信息,未来n天的气象信息(免费版仅能3天).使用域名通过TCP连接到心知天气服务器,采用cJSON进......
  • 利用某些平台(聚合API、百度AI、科大讯飞API)的API接口,利用HTTP协议向服务器发送请求,并
    要使用C语言通过HTTP协议向服务器发送请求并接收响应,你可以使用如libcurl这样的库来发送HTTP请求。libcurl是一个免费且易于使用的客户端URL传输库,支持多种协议,包括HTTP。同时,为了解析服务器响应中的JSON数据,你可以使用cJSON库,这是一个轻量级的JSON解析库。以下是一个简单的示例......
  • fastjson(版本<=1.2.24)复现
    文章目录1.啥是JSON介绍:2.啥是fastjson?3.fastjson序列化/反序列化原理4.fastjson反序列化漏洞原理$复现流程:漏洞影响范围:fastjson<=1.2.24一、漏洞环境搭建二、漏洞验证方法一三、漏洞验证方法二1.啥是JSON介绍:JSON,全称:JavaScriptObjectNotation,作为一个常见的......
  • fastjson2自动转型
    新版本fastjson2auto-type的写法。自定义Cache,或者写RedisSerializer估计会用到这个知识,importcn.seaboot.commons.lang.Warning;importcom.alibaba.fastjson2.JSON;importcom.alibaba.fastjson2.JSONReader;importcom.alibaba.fastjson2.JSONWriter;/***fas......
  • 低代码dsl 可视化 json schema
     低代码=可视化编辑器+组件库+JSON Schema+后端业务+DSL个人理解:JSONSchema是真正的核心,低代码平台实际上是生产和消费JSON数据的平台可视化编辑器一般会包括组件列表(初始化JSON),画布(消费JSON),组件属性配置列表(修改JSON)......