HTTP-获取星座运势

使用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<arpa/inet.h>
#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;
}
posted @ 2025-05-22 17:15  LRadian  阅读(25)  评论(0)    收藏  举报