I. 개요
현재 기사에서는 Linux(Ubuntu)에서 일기예보를 얻기 위해 C 언어를 사용하여 libcurl 라이브러리를 호출하는 방법을 소개합니다. HTTP GET 요청을 통해 Baidu Weather API에 액세스하고 반환된 JSON 데이터를 구문 분석하면 지정된 도시에 대한 향후 7일 동안의 일기 예보 정보를 얻을 수 있습니다.
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_idx
JSON 개체 및 배열에서 데이터를 가져옵니다 .
참고: 코드의 URL에 있는 YOUR_AK
및 는 YOUR_CITY_CODE
자체 Baidu API 키 및 도시 코드로 대체해야 합니다.
함수를 호출하면 get_weather_forecast
앞으로 7일 동안 지정한 도시의 일기예보를 받아 출력할 수 있습니다.