当前位置:   article > 正文

【Linux使用libcurl库进行Http请求】_linux libcurl get请求

linux libcurl get请求

Linux使用libcurl库进行Http请求


前言

这种技术主要用于网络编程,特别是用于进行HTTP请求。在这个具体的例子中,使用的是C语言与libcurl库。libcurl是一个开放源码的客户端URL传输库,它支持多种协议,如HTTP、FTP、SMTP等。

libcurl提供了一组API函数,使得程序能够与服务器进行各种类型的数据交换和通信。在这个程序中,libcurl用于执行HTTP GET和POST请求,获取或发送数据。

总结一下,这种技术通常被称为HTTP客户端编程,或更具体地,使用C语言和libcurl进行HTTP客户端编程。

sudo apt install libcurl4 libcurl4-openssl-dev//安装libcurl库和Openssl
  • 1

一、函数原型及参数解释

  1. CURL *curl_easy_init(void);

    • 初始化一个CURL类型的指针,用于后续的设置和操作。
    • 无参数。
  2. CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter);

    • 设置CURL请求的各种选项。
    • handle: CURL类型的指针。
    • option: 指定要设置哪种选项。
    • parameter: 设置选项的具体参数值。
  3. CURLcode curl_easy_perform(CURL *handle);

    • 根据先前设置的选项执行CURL请求。
    • handle: CURL类型的指针。
  4. void curl_easy_cleanup(CURL *handle);

    • 清理CURL资源。
    • handle: CURL类型的指针。
  5. struct curl_slist *curl_slist_append(struct curl_slist *list, const char *string);

    • 向curl_slist列表添加一个字符串。
    • list: 已存在的curl_slist列表。
    • string: 要添加的字符串。
  6. void curl_slist_free_all(struct curl_slist *list);

    • 释放curl_slist列表。
    • list: 要释放的curl_slist列表。
  7. readData 函数

    这个函数作为回调函数,用于处理CURL库收到的HTTP响应数据。

    size_t readData(void *ptr, size_t size, size_t nmemb, void *stream)
    {
        size_t totalSize = size * nmemb;  // 计算总数据大小
        
        char *buf = (char *)malloc(totalSize + 1);  // 动态分配内存,+1用于存放'\0'
        if (buf == NULL)
        {
            fprintf(stderr, "Memory allocation failed.\n");  // 内存分配失败
            return 0;
        }
        
        memcpy(buf, ptr, totalSize);  // 拷贝数据到buf中
        
        buf[totalSize] = '\0';  // 添加字符串结束符
        
        printf("%s\n", buf);  // 输出接收到的数据
        
        free(buf);  // 释放内存
        
        return totalSize;  // 返回处理的数据大小
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
  8. getUrl 函数

    该函数用于执行一个HTTP GET请求。

    bool getUrl(char *filename)
    {
        CURL *curl;  // CURL指针
        CURLcode res;  // CURL执行结果
        FILE *fp;  // 文件指针
        
        if ((fp = fopen(filename, "w")) == NULL)  // 打开文件,用于存储HTTP响应
            return false;
        
        curl = curl_easy_init();  // 初始化CURL
        if (curl)
        {
            curl_easy_setopt(curl, CURLOPT_URL,"http://www.baidu.com");  // 设置请求的URL
            curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, readData);  // 设置回调函数
            
            res = curl_easy_perform(curl);  // 执行CURL操作
            if (res != 0)
            {
                curl_easy_cleanup(curl);  // 清理CURL
                return false;
            }
        }
        fclose(fp);  // 关闭文件
        return true;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
  9. postUrl 函数

    该函数用于执行一个HTTP POST请求。

    bool postUrl(char *filename)
    {
        CURL *curl;  // CURL指针
        CURLcode res;  // CURL执行结果
        FILE *fp;  // 文件指针
        
        if ((fp = fopen(filename, "w")) == NULL)  // 打开文件,用于存储HTTP响应
            return false;
        
        curl = curl_easy_init();  // 初始化CURL
        if (curl)
        {
            curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "&logintype=uid&u=xieyan&psw=xxx86");  // 设置POST数据
            curl_easy_setopt(curl, CURLOPT_URL, "http://mail.sina.com.cn/cgi-bin/login.cgi");  // 设置请求的URL
            
            res = curl_easy_perform(curl);  // 执行CURL操作
            if (res != 0)
            {
                curl_easy_cleanup(curl);  // 清理CURL
                return false;
            }
        }
        fclose(fp);  // 关闭文件
        return true;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

二、使用步骤

1.引入库

代码如下(示例):向百度发起请求

#include <stdio.h>
#include <curl/curl.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
/*
size_t readData( void *ptr, size_t size, size_t nmemb, void *stream)
{
	char buf[1024] = {0};
	strncpy(buf,ptr,1024);
	printf("=========================get Data======================================\n");
	printf("%s\n",buf);
}
*/

size_t readData(void *ptr, size_t size, size_t nmemb, void *stream)
{
    size_t totalSize = size * nmemb;
    
    // 动态分配内存
    char *buf = (char *)malloc(totalSize + 1);  // +1 是为了最后的'\0'字符
    if (buf == NULL)
    {
        // 内存分配失败
        fprintf(stderr, "Memory allocation failed.\n");
        return 0;
    }
    
    // 拷贝数据
    memcpy(buf, ptr, totalSize);
    
    // 添加字符串结束标志
    buf[totalSize] = '\0';
    
//    printf("=========================get Data======================================\n");
    printf("%s\n", buf);
    
    // 释放内存
    free(buf);
    
    return totalSize;
}

bool getUrl(char *filename)
{
	CURL *curl;
	CURLcode res;
	FILE *fp;
	if ((fp = fopen(filename, "w")) == NULL)  // 返回结果用文件存储
		return false;
	struct curl_slist *headers = NULL;
	headers = curl_slist_append(headers, "Accept: Agent-007");
	curl = curl_easy_init();    // 初始化
	if (curl)
	{
		//curl_easy_setopt(curl, CURLOPT_PROXY, "10.99.60.201:8080");// 代理
		curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);// 改协议头
		curl_easy_setopt(curl, CURLOPT_URL,"http://www.baidu.com");
		curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, readData); //将返回的http头输出到fp指向的文件
//		curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); //将返回的http头输出到fp指向的文件
//		curl_easy_setopt(curl, CURLOPT_HEADERDATA, fp); //将返回的html主体数据输出到fp指向的文件
		res = curl_easy_perform(curl);   // 执行
		if (res != 0) {

			curl_slist_free_all(headers);
			curl_easy_cleanup(curl);
		}
		fclose(fp);
		return true;
	}
}
bool postUrl(char *filename)
{
	CURL *curl;
	CURLcode res;
	FILE *fp;
	if ((fp = fopen(filename, "w")) == NULL)
		return false;
	curl = curl_easy_init();
	if (curl)
	{
		curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "/tmp/cookie.txt"); // 指定cookie文件
		curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "&logintype=uid&u=xieyan&psw=xxx86");    // 指定post内容
												    //curl_easy_setopt(curl, CURLOPT_PROXY, "10.99.60.201:8080");
		curl_easy_setopt(curl, CURLOPT_URL, " http://mail.sina.com.cn/cgi-bin/login.cgi ");   // 指定url
		curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
		res = curl_easy_perform(curl);
		curl_easy_cleanup(curl);
	}
	fclose(fp);
	return true;
}
int main(void)
{
	getUrl("/tmp/get.html");
	postUrl("/tmp/post.html");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97

总结

使用C语言和libcurl进行HTTP客户端编程

概述
在网络编程领域,特别是当涉及到HTTP请求时,C语言配合libcurl库是一种强大的工具组合。libcurl是一个开放源码的多协议客户端URL传输库,支持如HTTP、FTP、SMTP等多种网络协议。本技术总结旨在介绍如何使用C语言和libcurl库进行HTTP客户端编程。

核心组件:
libcurl

  • 多协议支持:除了HTTP和HTTPS,还支持FTP, SMTP, LDAP等。
  • 跨平台:适用于多种操作系统,包括Windows、Linux和macOS。
  • 高度可定制:提供大量的设置选项,以满足各种需求。

主要函数与用法

  • curl_easy_init(): 初始化CURL会话。
  • curl_easy_setopt(): 设置CURL选项,如目标URL、请求头、POST数据等。
  • curl_easy_perform(): 执行配置好的CURL请求。
  • curl_easy_cleanup(): 清理CURL资源。

实践应用:

数据获取(HTTP GET)

  • 初始化CURL,设置目标URL和数据接收回调函数。
  • 执行HTTP GET请求并处理返回的数据。

数据提交(HTTP POST)

  • 初始化CURL,设置目标URL。
  • 使用curl_easy_setopt()设置POST数据。
  • 执行HTTP POST请求。

错误处理:
在实际应用中,需要添加完善的错误和异常处理机制,包括但不限于网络错误、内存分配失败等。

总结:
使用C语言和libcurl进行HTTP客户端编程提供了一种高效、灵活和强大的方式来进行网络通信。通过这种技术,开发人员可以更容易地集成HTTP请求功能,获取或提交数据,从而实现复杂的网络交互需求。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/685411
推荐阅读
相关标签
  

闽ICP备14008679号