找回密码
 立即注册
首页 资源区 代码 HTTP协议-获取天气-使用JSON

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

当贵 2025-6-4 21:48:13
在使用http获取到天气信息之后,使用JSON对获取到的天气信息进行解析,解析出温度数据
  1. /**************************************************************************
  2. *
  3. * 设计http程序,客户端向心知天气发送获取天气的请求,并解析出收到的温度数据,使用JSON进行解析
  4. * author:jindouliu2024@163.com
  5. * date:2025.5.21
  6. *notice:KEY需要使用自己在心知天气注册之后得到的秘钥
  7. *      :如果获得的JSON格式不完整,程序在运行的时候会出现段错误
  8. *
  9. * Copyright (c)  2024-2025   jindouliu2024@163.com   All right Reserved
  10. * *************************************************************************/
  11. #include<stdio.h>
  12. #include<time.h>
  13. #include <unistd.h>
  14. #include<string.h>
  15. #include<errno.h>
  16. #include<stdlib.h>
  17. #include
  18. #include <unistd.h>
  19. #include<netinet/udp.h>
  20. #include<sys/socket.h>
  21. #include<netinet/in.h>
  22. #include <pthread.h>
  23. #include <netdb.h>
  24. #include"cJSON.h"
  25. #define PORT  80
  26. #define DNS  "api.seniverse.com"
  27. #define KEY ""
  28. #define LOCAL "tianjin"
  29. int main(int argc,char *argv[])
  30. {
  31.         char buf[512] = {0};
  32.         char rcvbuf[512] = {0};
  33.         char *p = NULL;
  34.         int temp = 0;
  35.         struct hostent *host;
  36.         //创建套接字文件
  37.         int socket_fd = socket(AF_INET, SOCK_STREAM, 0);
  38.         if(socket_fd == -1){
  39.                 fprintf(stderr,"socket error errno:%d,%s",errno,strerror(errno));
  40.                 return 1;
  41.         }
  42.         host = gethostbyname(DNS);
  43.         if(host == NULL){
  44.                 fprintf(stderr,"gethostbyname error errno:%d,%s",errno,strerror(errno));
  45.                 return 2;
  46.         }
  47.         //绑定服务器的端口和地址
  48.         struct sockaddr_in server;
  49.         server.sin_family = AF_INET;
  50.         server.sin_port = htons(PORT);
  51.         server.sin_addr.s_addr =  ((struct in_addr *)(host->h_addr_list[0]))->s_addr;
  52.        
  53.         //申请连接
  54.         int flag = connect(socket_fd,(struct sockaddr *)&server,sizeof(server));
  55.         if(flag == -1){
  56.                 fprintf(stderr,"connect error errno:%d,%s",errno,strerror(errno));
  57.                 return 1;
  58.         }
  59.        
  60.         //HTTP协议格式
  61.         sprintf(buf,"GET https://api.seniverse.com/v3/weather/now.json?key=%s&location=%s&language=en&unit=c "
  62.                 "HTTP/1.1\r\n"
  63.                 "Host:api.seniverse.com\r\n"
  64.                 "\r\n",KEY,LOCAL);
  65.         //双方建立连接
  66.         send(socket_fd,buf,strlen(buf),0);
  67.         //等待服务器响应
  68.        
  69.        
  70.         //接收到响应行和相应字段
  71.         recv(socket_fd,rcvbuf,sizeof(rcvbuf),0);
  72.         printf("%s",rcvbuf);
  73.         bzero(rcvbuf,sizeof(rcvbuf));
  74.         //接受到的响应包体
  75.         recv(socket_fd,rcvbuf,sizeof(rcvbuf),0);
  76.         printf("%s\n",rcvbuf);
  77.         //使用JSON进行解析
  78.         //得到JSON格式
  79.         cJSON *json = NULL;
  80.         json = cJSON_Parse(rcvbuf);
  81.         //调试,输出JSON格式
  82.         printf("%s\n",cJSON_Print(json));
  83.        
  84.         //对温度进行解析
  85.         cJSON *results = cJSON_GetObjectItem(json,"results");
  86.        
  87.         cJSON *result = NULL;
  88.         cJSON_ArrayForEach(result, results)
  89.     {
  90.         cJSON * now = cJSON_GetObjectItem(result, "now");
  91.       
  92.         cJSON * temperature = cJSON_GetObjectItem(now,"temperature");
  93.         printf("temperature : %s\n", temperature->valuestring);
  94.         printf("temperature : %d\n", atoi(temperature->valuestring));
  95.     }
  96.         return 0;
  97.        
  98. }
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册