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  "v.juhe.cn"
#define KEY "   "//自己从聚合API申请的密钥
#define DATA "2025-5-21"

int main(int argc,char *argv[])
{
	char buf[512] = {0};
	char rcvbuf[1024] = {0};
	char *databuf = calloc(1,4096);
	if(databuf == NULL){
		printf("calloc error\n");
		return 1;
	}
	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->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 http://v.juhe.cn/calendar/day?key=%s&date=%s "
		"HTTP/1.1\r\n"
		"Host:v.juhe.cn\r\n"
		"Connection: close\r\n"
		"Content-Type:application/x-www-form-urlencoded\r\n"
		"\r\n",KEY,DATA);
	//双方建立连接
	send(socket_fd,buf,strlen(buf),0);
	//等待服务器响应
	int bytes_received;

 	printf("start recv\n");

    while ((bytes_received = recv(socket_fd, rcvbuf, sizeof(rcvbuf) - 1, 0)) > 0) {
        rcvbuf[bytes_received] = '\0';
        strcat(databuf, rcvbuf);
        bzero(rcvbuf, sizeof(rcvbuf));
    }
    if (bytes_received == -1) {
        fprintf(stderr, "recv error errno:%d,%s", errno, strerror(errno));
        free(databuf);
        close(socket_fd);
        return 1;
    }
    printf("Response:\n%s\n", databuf);
    printf("Received data:\n%s\n", databuf);

    // 处理分块传输编码
    char *json_start = strstr(databuf, "{\"");
   
    if (json_start == NULL) {
        fprintf(stderr, "Failed to find JSON data\n");
        free(databuf);
        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(databuf);
        close(socket_fd);
        return 1;
    }

    printf("Parsed JSON:\n%s\n", cJSON_Print(json));

    // 释放资源
    cJSON_Delete(json);
    free(databuf);
    close(socket_fd);

    return 0;
	
	
}

posted @ 2025-05-22 17:06  LRadian  阅读(21)  评论(0)    收藏  举报