linux c http请求,程序员罗杰-Linux C HTTP CRUL POST GET 请求

/*

* File:   main.c

* Author: luojie

*

* Created on March 10, 2015, 5:51 AM

*/

#include 

#include 

#include 

#include 

#include 

#include 

#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 

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  strlen(src))

return 0;

while (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);

int index = indexOf(ct, "=");

char* arr[3];

if (index > 0) {

split(arr, ct, "=");

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) {

test_post("http://192.168.1.6:8080/TestServer/index.html","wd=hava&hehe=123456");

test_get("http://xxxx.xx.cn/webst/webSocket/callPop.json?seatId=xxx&UID=xxxx-7612-11e5-9e61-xxx&caller=123&called=18820946097&hotNumberId=18820946097&callType=2&aaa=4&ffff=SEAT(101130100001081)&createTime=2015-09-19%2013:13:41");

printf("\nok");

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值