libcurl向WEB发送WEBSERVICE命令

//使用方法:webservice_sdk_submit(URL, 2000,待发数据,FALSE,返回值注意外部删除);

#include "curl/curl.h"
#pragma comment(lib,"lib/libcurl.lib")
//curl opper

// 接收数据结构体。
typedef struct _BufData {
char *buf;
int pos;
int size;
} BufData;

//curl访问webservice的回调函数

static int 
on_curl_recv_data(void *ptr, int size, int nmemb, void *stream)
{
if (ptr == NULL){
log("ptr == NULL");
return 0;
}


if (stream == NULL){
log("stream == NULL");
return 0;
}
BufData *recv_data = (BufData*)stream;
if (recv_data == NULL) 
{
log("recv_data == NULL");
return 0;
}
if (recv_data->size - recv_data->pos <= size*nmemb) 
{
int size = recv_data->size * 2;
char* buf = (char*)realloc(recv_data->buf, size);
if (!buf) 
{
log("error");
return 0;
}
recv_data->buf = buf;
recv_data->size = size;
}


memcpy(recv_data->buf + recv_data->pos, ptr, size*nmemb);
recv_data->pos += size*nmemb;
recv_data->buf[recv_data->pos] = '\0';


return size*nmemb;
}


void release_webservice()
{
curl_global_cleanup();
}


void init_webservice_apply()
{
curl_global_init(CURL_GLOBAL_ALL);
}


int 
webservice_sdk_submit(char* url, int timeout, char* content, BOOL prevent_cache, char** ret_buf)
{
if(url == NULL){
log("url == NULL");
return -1;
}

if (timeout < 0) {
log("timeout < 0");
return -1;
}

if(content == NULL){
log("content == NULL");
return -1;
}

if(ret_buf == NULL){
log("ret_buf == NULL");
return -1;
}

//初始化返回信息的结构体
BufData *recv_data = NULL;
recv_data = (BufData*)malloc(sizeof(BufData));
if (recv_data == NULL) {
log_msg("recv_data == NULL");
}
memset(recv_data, 0, sizeof(BufData));


recv_data->buf = (char*)malloc(1024*1000); 
if (recv_data->buf == NULL) {
log_msg("recv_data->buf == NULL");
}
memset(recv_data->buf, 0, 1024*1000);

recv_data->size = 1024*1000;
recv_data->pos = 0;

CURL *curl = NULL;
int blret = -1;
curl = curl_easy_init();
if (curl == NULL) {
free(recv_data->buf);
free(recv_data);
return -1;
}
//https://blog.csdn.net/z550449054/article/details/78683976  可借鉴的参考
curl_easy_setopt(curl, CURLOPT_URL, url);

curl_easy_setopt(curl, CURLOPT_POSTFIELDS, content); //提交post字符串
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, strlen(content));
curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeout);   //函数执行时间(on_curl_recv_data)
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, prevent_cache); //重要!!!多线程下禁用控制域名解析的alarm 超时
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 5L);  //连接超时时间
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, on_curl_recv_data);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, recv_data);


//curl_easy_setopt(curl, CURLOPT_POST, 1);//设置为非0表示本次操作为POST

struct curl_slist *http_headers = NULL;
// http_headers = curl_slist_append(http_headers, "Accept-Charset: utf-8");//WEB暂不识别
// http_headers = curl_slist_append(http_headers, "Accept-Encoding: utf-8");//WEB暂不识别
http_headers=curl_slist_append(http_headers, "Content-Type:application/json;charset=UTF-8");//返回为JSON时使用。
//http_headers = curl_slist_append(http_headers, "Content-Type: application/x-www-form-urlencoded; charset=UTF-8");//WEB暂不识别
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, http_headers);
CURLcode ret = curl_easy_perform(curl);
if (ret != CURLE_OK) {
log("error: curl_easy_perform(curl)[%d] != CURLE_OK, %s, %s", ret, url, content);

else {
if (memcmp(recv_data->buf, "<html>", 6) == 0) {
log("memcmp(recv_data->buf, <html>, 6) == 0");

else if(strstr(recv_data->buf,"\"status\":") > 0)
{//WEB失败一般会返回:"status":400之类,  定义返回字段时不要与此值重复,就可以此判断WEB是否成功。
log("\ndfb json error l=%d, =%s",strlen(content),recv_data->buf);
}
else
{
log("\ndfb send ok %d",strlen(content));
blret = 0;
}
}

curl_slist_free_all(http_headers);
curl_easy_cleanup(curl);
*ret_buf = recv_data->buf;

free(recv_data);
recv_data = NULL;
return blret;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值