c语言libcurl 使用实例get/post方法+c语言字符串处理

#include <stdio.h>
#include <curl/curl.h>
#include <string.h>
#include <ctype.h>
#include <iconv.h>
#define TMP_FILE "tmp.html"
#define HTML_BUFFER_SIZE 1024*800

void split(char **arr, char *str, const char *del) {
    char *s = strtok(str, del);
    while (s != NULL) {
        *arr++ = s;
        s = strtok(NULL, del);
    }
}

/*将str1字符串中第一次出现的str2字符串替换成str3*/
void replaceFirst(char *str1, char *str2, char *str3) {
    char str4[strlen(str1) + 1];
    char *p;
    strcpy(str4, str1);
    if ((p = strstr(str1, str2)) != NULL)/*p指向str2在str1中第一次出现的位置*/ {
        while (str1 != p && str1 != NULL)/*将str1指针移动到p的位置*/ {
            str1++;
        }
        str1[0] = '/0'; /*将str1指针指向的值变成/0,以此来截断str1,舍弃str2及以后的内容,只保留str2以前的内容*/
        strcat(str1, str3); /*在str1后拼接上str3,组成新str1*/
        strcat(str1, strstr(str4, str2) + strlen(str2)); /*strstr(str4,str2)是指向str2及以后的内容(包括str2),strstr(str4,str2)+strlen(str2)就是将指针向前移动strlen(str2)位,跳过str2*/
    }
}

/*将str1出现的所有的str2都替换为str3*/
void replace(char *str1, char *str2, char *str3) {
    while (strstr(str1, str2) != NULL) {
        replaceFirst(str1, str2, str3);
    }
}

/*截取src字符串中,从下标为start开始到end-1(end前面)的字符串保存在dest中(下标从0开始)*/
void substring(char *dest, char *src, int start, int end) {
    char *p = src;
    int i = start;
    if (start > strlen(src))return;
    if (end > strlen(src))
        end = strlen(src);
    while (i < end) {
        dest[i - start] = src[i];
        i++;
    }
    dest[i - start] = '/0';
    return;
}

/*返回src中下标为index的字符*/
char charAt(char *src, int index) {
    char *p = src;
    int i = 0;
    if (index < 0 || index > strlen(src))
        return 0;
    while (i < index)i++;
    return p[i];
}

/*返回str2第一次出现在str1中的位置(下表索引),不存在返回-1*/
int indexOf(char *str1, char *str2) {
    char *p = str1;
    int i = 0;
    p = strstr(str1, str2);
    if (p == NULL)
        return -1;
    else {
        while (str1 != p) {
            str1++;
            i++;
        }
    }
    return i;
}

/*返回str1中最后一次出现str2的位置(下标),不存在返回-1*/
int lastIndexOf(char *str1, char *str2) {
    char *p = str1;
    int i = 0, len = strlen(str2);
    p = strstr(str1, str2);
    if (p == NULL)return -1;
    while (p != NULL) {
        for (; str1 != p; str1++)i++;
        p = p + len;
        p = strstr(p, str2);
    }
    return i;
}

/*删除str左边第一个非空白字符前面的空白字符(空格符和横向制表符)*/
void ltrim(char *str) {
    int i = 0, j, len = strlen(str);
    while (str[i] != '/0') {
        if (str[i] != 32 && str[i] != 9)break; /*32:空格,9:横向制表符*/
        i++;
    }
    if (i != 0)
        for (j = 0; j <= len - i; j++) {
            str[j] = str[j + i]; /*将后面的字符顺势前移,补充删掉的空白位置*/
        }
}

/*删除str最后一个非空白字符后面的所有空白字符(空格符和横向制表符)*/
void rtrim(char *str) {
    char *p = str;
    int i = strlen(str) - 1;
    while (i >= 0) {
        if (p[i] != 32 && p[i] != 9)break;
        i--;
    }
    str[++i] = '/0';
}

/*删除str两端的空白字符*/
void trim(char *str) {
    ltrim(str);
    rtrim(str);
}

//这是libcurl接收数据的回调函数,相当于recv的死循环
//其中stream可以自定义数据类型,这里我传入的是文件保存路径

static size_t write_callback(void *ptr, size_t size, size_t nmemb, void *stream) {
    int len = size * nmemb;
    int written = len;
    FILE *fp = NULL;
    if (access((char*) stream, 0) == -1) {
        fp = fopen((char*) stream, "wb");
    } else {
        fp = fopen((char*) stream, "ab");
    }
    if (fp) {
        fwrite(ptr, size, nmemb, fp);
    }
    // printf("%s\n",ptr);
    fclose(fp);
    return written;
}
//加上-lcurl库

void test_post(char* url,char* data) {
    CURL *curl;
    CURLcode res;
    curl = curl_easy_init();
    if (curl) {
        //www.baidu.com/#wd=java
        curl_easy_setopt(curl, CURLOPT_URL, url);
        curl_easy_setopt(curl, CURLOPT_POST, 1L);
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data);
        res = curl_easy_perform(curl);
        curl_easy_cleanup(curl);
    }
}

int file_exists(char *filename) {
    return (access(filename, 0) == 0);
}
int GetCharset(char *src_html,char *charCode) {
    char tmp_html[HTML_BUFFER_SIZE]={0};
    int pos = indexOf(src_html, "text/html; charset=");
    if (pos > 0) {
        strncpy(tmp_html, src_html + pos + strlen("text/html; charset="), strlen(src_html) - pos);
        pos = indexOf(tmp_html, "\"");
        if (pos > 0) {
            strncpy(charCode, tmp_html, pos);
        }
    }
    return 0;

}

void test_get(char* url) {
    CURL *curl;
    CURLcode res;
    curl = curl_easy_init();
    if (curl) {
        if (file_exists(TMP_FILE))
            remove(TMP_FILE);
        curl_easy_setopt(curl, CURLOPT_URL, url);
        //指定回调函数
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
        //这个变量可作为接收或传递数据的作用
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, TMP_FILE);
        res = curl_easy_perform(curl);
        char tocode[64] = "UTF-8";
        if (CURLE_OK == res) {
            char *ct;
            res = curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, &ct);
            if ((CURLE_OK == res) && ct)
                printf("We received Content-Type: %s\n", ct);
            //printf("====\n");
            //int pos=strcspn(ct,"UTF-8"); 
            int index = indexOf(ct, "=");
            char* arr[3];
            if (index > 0) {
                split(arr, ct, "=");
                //printf("%s\n", arr[1]);
                strcpy(tocode, arr[1]);
            }
            FILE *fp = NULL;
            fp = fopen(TMP_FILE, "r");
            char src_html[HTML_BUFFER_SIZE]={0};
            char output_html[HTML_BUFFER_SIZE]={0};
            char tmp_html[HTML_BUFFER_SIZE]={0};
            if (fp) {
                fread(src_html, HTML_BUFFER_SIZE, 1, fp);   
                strcpy(tmp_html,src_html);
                if(index <0) {
                    GetCharset(tmp_html,tocode);
                    printf("%s\n",tocode);
                }
                int iRet;
                //打开字符集转换  
                iconv_t hIconv = iconv_open(tocode,"iso-8859-1");
                if (-1 == (int) hIconv) {
                    return -1; //打开失败,可能不支持的字符集  
                }     
                printf("%s\n",src_html);
                //开始转换  
                iRet = iconv(hIconv, (char**) (&src_html), strlen(src_html), (char**) (&output_html), strlen(src_html));                
                printf("%s\n", output_html);  
                printf("ok");
                if(strcmp(output_html,"")==0)
                {
                     printf("%s\n",src_html);
                }
                //关闭字符集转换  
                iconv_close(hIconv);
                 
            }

        }
        curl_easy_cleanup(curl);
    }
}

int main(int argc, char* argv) {
    //printf("%s\n",argv[1]);
    //http://192.168.1.6:8080/TestServer/index.html?fdasf=123456&af=89
    test_post("http://192.168.1.6:8080/TestServer/index.html","wd=hava&hehe=123456");
    //test_get("http://www.baidu.com/");
    printf("\nok");
    return 0;
}

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中,可以使用一些库来执行HTTP的GET和POST请求,并下载文件。在这里,我们将使用libcurl库来完成这些操作。 首先,我们需要在代码中引入libcurl库的头文件。 ```c #include <stdio.h> #include <curl/curl.h> ``` 然后,我们可以定义一个回调函数,用于处理下载的数据。 ```c size_t write_callback(void* ptr, size_t size, size_t nmemb, FILE* stream) { return fwrite(ptr, size, nmemb, stream); } ``` 接下来,我们可以编写一个函数来执行HTTP的GET请求,并将返回的数据保存到文件中。 ```c void http_get(const char* url, const char* file_path) { FILE* file = fopen(file_path, "wb"); if (file == NULL) { printf("无法打开文件!\n"); return; } CURL* curl = curl_easy_init(); if (curl) { curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, file); CURLcode res = curl_easy_perform(curl); if (res != CURLE_OK) { printf("请求失败:%s\n", curl_easy_strerror(res)); } curl_easy_cleanup(curl); } fclose(file); } ``` 最后,我们可以编写一个函数来执行HTTP的POST请求,并将返回的数据保存到文件中。 ```c void http_post(const char* url, const char* post_data, const char* file_path) { FILE* file = fopen(file_path, "wb"); if (file == NULL) { printf("无法打开文件!\n"); return; } CURL* curl = curl_easy_init(); if (curl) { curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, file); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post_data); CURLcode res = curl_easy_perform(curl); if (res != CURLE_OK) { printf("请求失败:%s\n", curl_easy_strerror(res)); } curl_easy_cleanup(curl); } fclose(file); } ``` 通过使用以上两个函数,我们可以下载一个文件到指定的路径。例如,假设我们要下载一个名为"test.txt"的文件,可以使用以下代码: ```c http_get("http://example.com/test.txt", "test.txt"); ``` 或者,如果我们需要通过POST请求下载文件,可以使用以下代码: ```c const char* post_data = "param1=value1&param2=value2"; http_post("http://example.com/download", post_data, "test.txt"); ``` 以上就是使用C语言执行HTTP的GET和POST请求,并下载文件的示例代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值