C 언어는 Linux에서 libcurl 라이브러리를 호출하여 일기 예보 정보를 얻습니다.

I. 개요

현재 기사에서는 Linux(Ubuntu)에서 일기예보를 얻기 위해 C 언어를 사용하여 libcurl 라이브러리를 호출하는 방법을 소개합니다. HTTP GET 요청을 통해 Baidu Weather API에 액세스하고 반환된 JSON 데이터를 구문 분석하면 지정된 도시에 대한 향후 7일 동안의 일기 예보 정보를 얻을 수 있습니다.

이미지-20230626103811318

이미지-20230626103835548

2. 디자인 아이디어

[1] HTTP GET 요청에 libcurl 라이브러리 사용

  • <curl/curl.h>libcurl 라이브러리를 사용하려면 코드에 헤더 파일을 포함하십시오.
  • 함수 로 curl_easy_init()curl 초기화
  • URL, 쓰기 콜백 함수 및 쓰기 데이터 매개변수를 포함한 요청 옵션 설정
  • 함수를 사용하여 curl_easy_perform()요청 실행

[2] 응답 데이터를 메모리에 저장하는 콜백 함수 작성

  • 응답 데이터를 저장하기 위한 포인터와 길이를 포함하는 구조 정의
  • 콜백 함수에서 응답 데이터를 메모리에 복사하고 메모리 크기를 동적으로 조정
  • 복사된 데이터의 크기를 반환합니다.

[3] JSON 데이터 파싱

  • json_tokener_parse()함수를 사용하여 반환된 JSON 데이터를 구문 분석합니다.
  • 함수를 사용하여 json_object_object_get_ex()지정된 필드의 값을 가져옵니다.
  • 함수를 사용하여 json_object_array_length()배열의 길이 얻기
  • 함수를 사용하여 json_object_array_get_idx()배열의 요소 가져오기
  • 함수를 사용하여 json_object_get_string()문자열 값 가져오기

【4】날씨 예보 정보 인쇄

  • 획득한 일기예보 데이터를 순회하여 날짜, 날씨, 기온을 순차적으로 획득
  • printf()요일별 일기예보 정보를 출력하는 기능을 이용하세요 .

3. 키 코드

주요 코드 스니펫은 다음과 같습니다.

// 定义回调函数,用于将响应数据存储在内存中
size_t write_callback(void *ptr, size_t size, size_t nmemb, void *stream) {
    
    
    // ...
}

// 子函数,用于获取指定城市未来7天的天气预报
int get_weather_forecast(const char *city) {
    
    
    // ...
}

int main() {
    
    
    const char *city = "your_city_code";
    int ret = get_weather_forecast(city);
    // ...
}

4. 사용방법

[1] API 키 및 도시 코드 바꾸기: 샘플 코드에서 your_ak및을 your_city_code자신의 Baidu API 키 및 도시 코드로 바꿉니다.

[2] 코드 컴파일: gcc와 같은 적절한 C 컴파일러를 사용하여 코드를 컴파일합니다.

gcc -o download_program download_program.c -lcurl

[3] 코드 실행: 생성된 실행 파일을 터미널에서 실행합니다.

./download_program

【4】일기 예보 확인: 프로그램이 지정된 도시의 다음 7일 동안의 일기 예보 정보를 인쇄합니다.

다섯, 완전한 코드

HTTP GET은 Baidu Weather API에 대한 액세스를 요청하고 반환된 JSON 데이터를 구문 분석하여 필요한 날씨 정보를 얻습니다.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <curl/curl.h>
#include <json-c/json.h>

// 定义回调函数,用于将响应数据存储在内存中
size_t write_callback(void *ptr, size_t size, size_t nmemb, void *stream) {
    
    
    size_t realsize = size * nmemb;
    struct string *mem = (struct string *)stream;

    mem->ptr = realloc(mem->ptr, mem->len + realsize + 1);
    if (mem->ptr == NULL) {
    
    
        fprintf(stderr, "内存分配失败\n");
        return 0;
    }

    memcpy(&(mem->ptr[mem->len]), ptr, realsize);
    mem->len += realsize;
    mem->ptr[mem->len] = '\0';

    return realsize;
}

// 子函数,用于获取指定城市未来7天的天气预报
int get_weather_forecast(const char *city) {
    
    
    char url[256];
    sprintf(url, "https://api.map.baidu.com/weather/v1/?district_id=%s&ak=your_ak", city);

    CURL *curl = curl_easy_init();
    struct string response;
    response.ptr = malloc(1);
    response.len = 0;

    if (curl && response.ptr) {
    
    
        // 设置请求选项
        curl_easy_setopt(curl, CURLOPT_URL, url);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);

        // 执行请求
        CURLcode res = curl_easy_perform(curl);
        if (res != CURLE_OK) {
    
    
            fprintf(stderr, "请求失败: %s\n", curl_easy_strerror(res));
            free(response.ptr);
            curl_easy_cleanup(curl);
            return -1;
        }

        // 解析JSON数据
        struct json_object *json = json_tokener_parse(response.ptr);
        if (json == NULL) {
    
    
            fprintf(stderr, "JSON解析失败\n");
            free(response.ptr);
            curl_easy_cleanup(curl);
            return -1;
        }

        // 解析天气预报
        struct json_object *result, *weather_data;
        json_object_object_get_ex(json, "result", &result);
        json_object_object_get_ex(result, "weather_data", &weather_data);

        int i;
        int num_days = json_object_array_length(weather_data);
        for (i = 0; i < num_days; i++) {
    
    
            struct json_object *day = json_object_array_get_idx(weather_data, i);
            const char *date, *weather, *temperature;
            date = json_object_get_string(json_object_object_get(day, "date"));
            weather = json_object_get_string(json_object_object_get(day, "weather"));
            temperature = json_object_get_string(json_object_object_get(day, "temperature"));

            printf("日期:%s\n天气:%s\n温度:%s\n\n", date, weather, temperature);
        }

        free(response.ptr);
        json_object_put(json);
    } else {
    
    
        fprintf(stderr, "初始化失败\n");
        if (response.ptr) {
    
    
            free(response.ptr);
        }
        if (curl) {
    
    
            curl_easy_cleanup(curl);
        }
        return -1;
    }

    curl_easy_cleanup(curl);
    return 0;
}

int main() {
    
    
    const char *city = "your_city_code";
    int ret = get_weather_forecast(city);
    if (ret == 0) {
    
    
        printf("天气预报获取成功!\n");
    } else {
    
    
        printf("天气预报获取失败!\n");
    }

    return 0;
}

샘플 코드에서 curl_easy_setopt함수를 사용하여 HTTP GET 요청의 URL을 설정하고, 응답 데이터를 메모리에 저장하는 옵션 CURLOPT_WRITEFUNCTION과 콜백 함수를 지정합니다.CURLOPT_WRITEDATA

그런 다음 json_tokener_parse함수를 사용하여 반환된 JSON 데이터를 구문 분석하고 일기 예보 정보를 추출합니다. json_object_object_get및 와 같은 함수를 통해 json_object_array_get_idxJSON 개체 및 배열에서 데이터를 가져옵니다 .

참고: 코드의 URL에 있는 YOUR_AK및 는 YOUR_CITY_CODE자체 Baidu API 키 및 도시 코드로 대체해야 합니다.

함수를 호출하면 get_weather_forecast앞으로 7일 동안 지정한 도시의 일기예보를 받아 출력할 수 있습니다.

Supongo que te gusta

Origin blog.csdn.net/xiaolong1126626497/article/details/132145077
Recomendado
Clasificación