首页 > 系统相关 >Linux下C语言调用libcurl库获取天气预报信息

Linux下C语言调用libcurl库获取天气预报信息

时间:2023-08-13 11:01:38浏览次数:42  
标签:get libcurl object C语言 json weather Linux curl ptr

一、概述

当前文章介绍如何在Linux(Ubuntu)下使用C语言调用libcurl库获取天气预报的方法。通过HTTP GET请求访问百度天气API,并解析返回的JSON数据,可以获取指定城市未来7天的天气预报信息。

Linux下C语言调用libcurl库获取天气预报信息_json

Linux下C语言调用libcurl库获取天气预报信息_json_02

二、设计思路

【1】使用libcurl库进行HTTP GET请求

  • 在代码中包含<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()函数打印每一天的天气预报信息

三、关键代码

以下是主要的代码片段:

// 定义回调函数,用于将响应数据存储在内存中
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);
    // ...
}

四、使用说明

【1】替换API密钥和城市代码:在示例代码中,将your_akyour_city_code替换为你自己的百度API密钥和城市代码。

【2】编译代码:使用合适的C编译器,如gcc,编译代码。

gcc -o download_program download_program.c -lcurl

【3】运行代码:在终端中运行生成的可执行文件。

./download_program

【4】查看天气预报:程序会打印出指定城市未来7天的天气预报信息。

五、完整代码

HTTP GET请求访问百度天气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_WRITEFUNCTIONCURLOPT_WRITEDATA选项指定回调函数,将响应数据存储在内存中。

然后,使用json_tokener_parse函数解析返回的JSON数据,并提取其中的天气预报信息。通过json_object_object_getjson_object_array_get_idx等函数获取JSON对象和数组中的数据。

注意:代码中的URL中的YOUR_AKYOUR_CITY_CODE需要使用你自己的百度API密钥和城市代码替换。

通过调用get_weather_forecast函数,可以获取指定城市未来7天的天气预报并打印出来。

标签:get,libcurl,object,C语言,json,weather,Linux,curl,ptr
From: https://blog.51cto.com/u_11822586/7065788

相关文章

  • Linux下Shell脚本中比较大小
    数字比较-eq等于,如:if["$a"-eq"$b"]-ne不等于,如:if["$a"-ne"$b"]-gt大于,如:if["$a"-gt"$b"]-ge大于等于,如:if["$a"-ge"$b"]-lt小于,如:if["$a"-lt"$b......
  • 活字格-Linux部署
    活字格-Linux部署什么是活字格?活字格是一个企业级低代码开发平台,旨在显著提升企业或者软件公司应用系统的开发效率,同时提供前所未有的灵活性和扩展性,开发人员可以使用涵盖整个开发生命周期的集成开发环境(活字格设计器,服务管理器)进行开发、质量检测、部署、监控和管理。什么需......
  • Linux常见面试题,应对面试分享
    操作系统基础1.cpu占⽤率太⾼了怎么办?排查思路是什么,怎么定位这个问题,处理流程其他程序:1.通过top命令按照CPU使⽤率排序找出占⽤资源最⾼的进程2.lsof查看这个进程在使⽤什么⽂件或者有哪些线程3.询问开发或者⽼⼤,是什么业务在使⽤这个进程4.是否可以将这台机器隔离,不影响......
  • Linux上安装Qt Creator
    在Linux系统上安装QtCreator1.在qt官网下载安装包:qt-opensource-linux-x64-5.12.9.run2.wgethttps:://download.qt.io/archive/qt/5.12/5.12.9/qt-opensource-linux-x64-5.12.9.run3.赋予可执行权限,加上sudo权限进入安装,这样会安装在/opt目录下chmod+xqt-opensource-linux-......
  • windws系统上,vscode中怎么把gin项目生产linux可执行文件
    在Windows系统上,您可以通过以下步骤在VSCode中将Gin项目生成Linux可执行文件:1.确保您已经安装了Golang和VSCode。2.打开VSCode并导入您的Gin项目。3.在终端中导航到项目的根目录。4.运行以下命令以生成Linux可执行文件:SETGOOS=linuxSETGOARCH=amd64gobuild-......
  • 萌新学习c语言记录
    这几天学了~等的符号使用还有如1>>2这种移动(二进制)方式(应该可以这么说)这几天学习的东西都是一点新东西和一部分复习之前学习的东西而且新东西有点难还有不用第三个变量来交换另外两个变量的方式(但这种方式运行的时候有些缓慢)如inta=3;intb=5;a=a^b;b=a^b;a=a^b;这样就可以了但......
  • 设置 X11 转发以在 Linux 中访问 GUI
    一、概述X11转发是一种在客户端和服务器之间传输图形界面的协议。它允许远程客户端在本地显示远程服务器上的图形应用程序,使用户可以在本地操作远程服务器上的图形界面。使用场景:远程服务器管理:管理员可以通过X11转发在本地管理远程服务器上的图形化工具和应用程序,而无需直接......
  • Linux 上的 DB2 11.1 GUI 安装
    概述 在这篇文章中,我们将介绍在Linux上安装DB211.1的步骤。在安装任何DB2LUW产品之前,您应该确保您的系统满足操作系统、硬件、软件、存储和内存要求。 注:以下步骤也适用于Linux上的DB211.5安装。解决方案第1步:检查以下链接以了解最新的安装要求 https://......
  • Linux
    Linux我们这个课程基于CentOS7版本的学习。入门概述我们为什么要学习Linuxlinux诞生了这么多年,以前还喊着如何能取代windows系统,现在这个口号已经小多了,任何事物发展都有其局限性都有其天花板。就如同在国内再搞一个社交软件取代腾讯一样,想想而已基本不可能,因为用户已经习惯......
  • Linux 共享内存mmap,进程通信
    @TOC前言进程间通信是操作系统中重要的概念之一,使得不同的进程可以相互交换数据和进行协作。其中,共享内存是一种高效的进程间通信机制,而内存映射(mmap)是实现共享内存的一种常见方法。一、存储映射I/O存储映射I/O是一个磁盘文件与存储空间中的一个缓冲区相映射。于是,当从缓冲......