使用http服务向聚合API发送请求获取运势的请求,并对接收到的数据进行JSON解析- /**************************************************************************
- *
- * 设计http程序,客户端向聚合API发送获取星座运势的请求,并解析出收到数据,使用JSON进行解析
- * author:jindouliu2024@163.com
- * date:2025.5.22
- *
- *
- *
- * Copyright (c) 2024-2025 jindouliu2024@163.com All right Reserved
- * *************************************************************************/
- #include<stdio.h>
- #include<time.h>
- #include <unistd.h>
- #include<string.h>
- #include<errno.h>
- #include<stdlib.h>
- #include
- #include <unistd.h>
- #include<netinet/udp.h>
- #include<sys/socket.h>
- #include<netinet/in.h>
- #include <pthread.h>
- #include <netdb.h>
- #include "cJSON.h"
- #define PORT 80
- #define DNS "web.juhe.cn"
- #define KEY " "//自己从聚合API申请的密钥
- #define TYPE "week"
- #define CONSNAME "%E5%8F%8C%E9%B1%BC%E5%BA%A7"//双鱼座,可以换成自己的星座
- int main(int argc, char *argv[]) {
- char buf[1024] = {0};
- char rcvbuf[1024] = {0};
- char *response = malloc(4096);
- if (response == NULL) {
- fprintf(stderr, "Memory allocation failed\n");
- return 1;
- }
- bzero(response, 4096);
- 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->h_addr_list[0]))->s_addr;
-
- // 申请连接
- int flag = connect(socket_fd,(struct sockaddr *)&server,sizeof(server));
- if(flag == -1){
- fprintf(stderr,"connect error errno:%d,%s",errno,strerror(errno));
- return 1;
- }
-
- // HTTP协议格式
- sprintf(buf,"GET /constellation/getAll?key=%s&consName=%s&type=%s HTTP/1.1\r\n"
- "Host: web.juhe.cn\r\n"
- "Connection: close\r\n"
- "\r\n", KEY, CONSNAME, TYPE);
- // 发送请求
- send(socket_fd, buf, strlen(buf), 0);
- // 接收响应数据
- int bytes_received;
- while ((bytes_received = recv(socket_fd, rcvbuf, sizeof(rcvbuf) - 1, 0)) > 0) {
- rcvbuf[bytes_received] = '\0';
- strcat(response, rcvbuf);
- bzero(rcvbuf, sizeof(rcvbuf));
- }
- if (bytes_received == -1) {
- fprintf(stderr, "recv error errno:%d,%s", errno, strerror(errno));
- free(response);
- close(socket_fd);
- return 1;
- }
- printf("Response:\n%s\n", response);
- // 处理分块传输编码
- char *json_start = strstr(response, "{"");
- if (json_start == NULL) {
- fprintf(stderr, "Failed to find JSON data\n");
- free(response);
- close(socket_fd);
- return 1;
- }
- // 解析JSON数据
- cJSON *json = cJSON_Parse(json_start);
- if (json == NULL) {
- const char *error_ptr = cJSON_GetErrorPtr();
- if (error_ptr != NULL) {
- fprintf(stderr, "Error before: %s\n", error_ptr);
- }
- free(response);
- close(socket_fd);
- return 1;
- }
- free(response);
- // 提取双鱼座本周运势信息
- cJSON *name = cJSON_GetObjectItem(json, "name");
- cJSON *date = cJSON_GetObjectItem(json, "date");
- cJSON *health = cJSON_GetObjectItem(json, "health");
- cJSON *job = cJSON_GetObjectItem(json, "job");
- cJSON *love = cJSON_GetObjectItem(json, "love");
- cJSON *money = cJSON_GetObjectItem(json, "money");
- cJSON *work = cJSON_GetObjectItem(json, "work");
- if (name == NULL || !cJSON_IsString(name) ||
- date == NULL || !cJSON_IsString(date) ||
- health == NULL || !cJSON_IsString(health) ||
- job == NULL || !cJSON_IsString(job) ||
- love == NULL || !cJSON_IsString(love) ||
- money == NULL || !cJSON_IsString(money) ||
- work == NULL || !cJSON_IsString(work)) {
- fprintf(stderr, "Failed to get one or more fields\n");
- cJSON_Delete(json);
- close(socket_fd);
- return 1;
- }
- // 输出双鱼座本周运势信息
- printf("星座名称: %s\n", name->valuestring);
- printf("日期: %s\n", date->valuestring);
- printf("健康: %s\n", health->valuestring);
- printf("工作: %s\n", job->valuestring);
- printf("爱情: %s\n", love->valuestring);
- printf("财富: %s\n", money->valuestring);
- printf("学业: %s\n", work->valuestring);
- // 释放JSON对象
- cJSON_Delete(json);
- close(socket_fd);
- return 0;
- }
复制代码 来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |