洛锋 發表於 2025-5-21 17:06:00

HTTP协议-获取天气-使用JSON

<p>在使用http获取到天气信息之后,使用JSON对获取到的天气信息进行解析,解析出温度数据</p>
<pre><code>/**************************************************************************
*
* 设计http程序,客户端向心知天气发送获取天气的请求,并解析出收到的温度数据,使用JSON进行解析
* author:jindouliu2024@163.com
* date:2025.5.21
*notice:KEY需要使用自己在心知天气注册之后得到的秘钥
*      :如果获得的JSON格式不完整,程序在运行的时候会出现段错误
*
* Copyright (c)2024-2025   jindouliu2024@163.com   All right Reserved
* *************************************************************************/

#include&lt;stdio.h&gt;
#include&lt;time.h&gt;
#include &lt;unistd.h&gt;
#include&lt;string.h&gt;
#include&lt;errno.h&gt;
#include&lt;stdlib.h&gt;
#include&lt;arpa/inet.h&gt;
#include &lt;unistd.h&gt;
#include&lt;netinet/udp.h&gt;
#include&lt;sys/socket.h&gt;
#include&lt;netinet/in.h&gt;
#include &lt;pthread.h&gt;
#include &lt;netdb.h&gt;
#include"cJSON.h"

#define PORT80
#define DNS"api.seniverse.com"
#define KEY ""
#define LOCAL "tianjin"

int main(int argc,char *argv[])
{
        char buf = {0};
        char rcvbuf = {0};
        char *p = NULL;
        int temp = 0;
        struct hostent *host;
        //创建套接字文件
        int socket_fd = socket(AF_INET, SOCK_STREAM, 0);
        if(socket_fd == -1){
                fprintf(stderr,"socket error errno:%d,%s",errno,strerror(errno));
                return 1;
        }
        host = gethostbyname(DNS);
        if(host == NULL){
                fprintf(stderr,"gethostbyname error errno:%d,%s",errno,strerror(errno));
                return 2;
        }

        //绑定服务器的端口和地址
        struct sockaddr_in server;
        server.sin_family = AF_INET;
        server.sin_port = htons(PORT);
        server.sin_addr.s_addr =((struct in_addr *)(host-&gt;h_addr_list))-&gt;s_addr;
       
        //申请连接
        int flag = connect(socket_fd,(struct sockaddr *)&amp;server,sizeof(server));
        if(flag == -1){
                fprintf(stderr,"connect error errno:%d,%s",errno,strerror(errno));
                return 1;
        }
       
        //HTTP协议格式
        sprintf(buf,"GET https://api.seniverse.com/v3/weather/now.json?key=%s&amp;location=%s&amp;language=en&amp;unit=c "
                "HTTP/1.1\r\n"
                "Host:api.seniverse.com\r\n"
                "\r\n",KEY,LOCAL);
        //双方建立连接
        send(socket_fd,buf,strlen(buf),0);
        //等待服务器响应
       
       
        //接收到响应行和相应字段
        recv(socket_fd,rcvbuf,sizeof(rcvbuf),0);
        printf("%s",rcvbuf);
        bzero(rcvbuf,sizeof(rcvbuf));
        //接受到的响应包体
        recv(socket_fd,rcvbuf,sizeof(rcvbuf),0);
        printf("%s\n",rcvbuf);
        //使用JSON进行解析
        //得到JSON格式
        cJSON *json = NULL;
        json = cJSON_Parse(rcvbuf);
        //调试,输出JSON格式
        printf("%s\n",cJSON_Print(json));
       
        //对温度进行解析
        cJSON *results = cJSON_GetObjectItem(json,"results");
       
        cJSON *result = NULL;
        cJSON_ArrayForEach(result, results)
    {
      cJSON * now = cJSON_GetObjectItem(result, "now");
      
      cJSON * temperature = cJSON_GetObjectItem(now,"temperature");


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

      printf("temperature : %d\n", atoi(temperature-&gt;valuestring));
    }


        return 0;
       
}
</code></pre><br><br>
来源:https://www.cnblogs.com/lradian/p/18889370
頁: [1]
查看完整版本: HTTP协议-获取天气-使用JSON