http get请求获取server返回的应答数据
libcurl库中的參数CURLOPT_WRITEFUNCTION所设置的回调函数应该是这种:
size_t fun_cb( char *ptr, size_t size, size_t nmemb, void *userdata)
这个回调函数被调用的时机是有响应数据到达,这些数据由ptr指向,大小是size*nmemb.到这里为止还是文档上的说法.从socket的角度考虑,响应数据自然不一定会是以0结尾的字符串,而应当被觉得是流数据.仅仅要服务端没有关闭连接,仅仅要服务端还在发送响应数据,这个函数就会被调用,而被调用的次数不一定仅仅是一次,或许会是很多次,每一次被调用所接收到的数据大小是size*nmemb,这些文档上似乎没有提到,由于这是理当如此的事情.所以在处理响应数据的时候不能想当然,必需要考虑到这个函数会被多次调用.
这个回调函数被调用的时机是有响应数据到达,这些数据由ptr指向,大小是size*nmemb.到这里为止还是文档上的说法.从socket的角度考虑,响应数据自然不一定会是以0结尾的字符串,而应当被觉得是流数据.仅仅要服务端没有关闭连接,仅仅要服务端还在发送响应数据,这个函数就会被调用,而被调用的次数不一定仅仅是一次,或许会是很多次,每一次被调用所接收到的数据大小是size*nmemb,这些文档上似乎没有提到,由于这是理当如此的事情.所以在处理响应数据的时候不能想当然,必需要考虑到这个函数会被多次调用.
再说说userdata,这是一个FILE *的指针,这个參数跟CURLOPT_WRITEDATA相关,假设已经自己写了回调函数,而不是用缺省的回调函数把接收到的数据写到用CURLOPT_WRITEDATA所设置的userdata所指向的文件其中去,那么就能够把这个指针设为NULL.
样例一:
- char *res_buf = NULL;
- int shift;
- size_t copy_data(void *ptr, size_t size, size_t
nmemb, void *stream) - {
- int res_size;
- res_size = size * nmemb;
- res_buf = realloc(res_buf, shift+res_size + 1);
- memcpy(res_buf + shift, ptr, res_size);
- shift += res_size;
- return size * nmemb;
- }
对于以下的这样的情况,我不知道是什么意思:
样例二:
CURL* curl;
CURLcode res;
char buffer[10] ={0};
curl = curl_easy_init();//curl初始化
std::string _version;
if (curl)
{
curl_easy_setopt(curl, CURLOPT_URL, "https://raw.github.com/minggo/AssetsManagerTest/master/version");
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);//设为不验证证书
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, getVersionCode);//设置处理数据的函数
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &_version);//数据存储的对象指针
res = curl_easy_perform(curl);//curl链接
curl_easy_cleanup(curl);//清除curl
}
我想问一下,CURLOPT_WRITEDATA指定的不应该是个文件指针么。为什么是个string型的?
对于样例一涉及到全局变量,因此在多线程环境中是不适合的。以下的样例三是不涉及全局变量的。
样例三:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <curl/curl.h>
struct MemoryStruct {
char *memory;
size_t size;
};
static size_t
WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp)
{
size_t realsize = size * nmemb;
struct MemoryStruct *mem = (struct MemoryStruct *)userp;
mem->memory = realloc(mem->memory, mem->size + realsize + 1);
if(mem->memory == NULL) {
/* out of memory! */
printf("not enough memory (realloc returned NULL)\n");
return 0;
}
memcpy(&(mem->memory[mem->size]), contents, realsize);
mem->size += realsize;
mem->memory[mem->size] = 0;
return realsize;
}
int main(void)
{
CURL *curl_handle;
CURLcode res;
struct MemoryStruct chunk;
chunk.memory = malloc(1);
chunk.size = 0;
curl_global_init(CURL_GLOBAL_ALL);
curl_handle = curl_easy_init();
curl_easy_setopt(curl_handle, CURLOPT_URL, "http://www.example.com/");
curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&chunk); curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "libcurl-agent/1.0");
res = curl_easy_perform(curl_handle);
if(res != CURLE_OK) {
fprintf(stderr, "curl_easy_perform() failed: %s\n",
curl_easy_strerror(res));
}
else {
printf("%lu bytes retrieved\n", (long)chunk.size);
}
curl_easy_cleanup(curl_handle);
free(chunk.memory);
curl_global_cleanup();
return 0;
}
http get请求获取server返回的应答数据的更多相关文章
- ajax 请求 对json传的处理 Jquery 使用Ajax获取后台返回的Json数据后,页面处理
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- ajax请求后台,返回json格式数据,模板!
添加一个用户的时候,需要找出公司下所有的部门,和相应部门下的角色,利用ajax请求,实现联动技术.将返回的json格式数据,添加到select标签下. <script type="te ...
- ajax请求解析springmvc返回的json数据
需要使用的框架 spring3.0 jquery1.9.0(简化ajax开发的js库) Jackson(json处理器):jackson-core-asl-1.9.2.jar,jackson-mapp ...
- Jquery 使用Ajax获取后台返回的Json数据后,页面处理
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- JS获取后台返回的JSON数据
问题:通过$.get从后台获取了一段json串{"id":"1","name":"ww"},然后要拿到这里面的id和na ...
- 【转】Jquery 使用Ajax获取后台返回的Json数据后,页面处理
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 使用URLConnection获取页面返回的xml数据
public static void main(String[] args) throws Exception { String path="http://flash.weather.com ...
- ASP.NET MVC获取微信返回的json数据分页
View @model JiaYe.WeiXin.Models.ViewModels.UserViewModel <div class="pull-left pagination&qu ...
- 微信接口开发1--向微信发送请求--获取access_token
//随便放置一个php文件在服务器上.执行该方法--调用模拟get提交---到微信-->获得微信返回的access_token 不建议自己编写模拟get提交方法. 建议直接导入微信框架LaneW ...
随机推荐
- ansible基础知识
安装ansible epel源 第一步: 下载epel源 wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel- ...
- [ Nowcoder Contest 165 #D ] 合法括号序列
\(\\\) \(Description\) 键盘上有三个键,敲击效果分别是: 在输出序列尾部添加一个左括号 在输出序列尾部添加一个右括号 删除输出序列尾部的第一个元素,若输出序列为空,则什么都不发生 ...
- SAS学习笔记之《SAS编程与数据挖掘商业案例》(2)数据获取与数据集操作
SAS学习笔记之<SAS编程与数据挖掘商业案例>(2)数据获取与数据集操作 1. SET/SET效率高,建立的主表和建表索引的查询表一般不排序, 2. BY语句,DATA步中,BY语句规定 ...
- BFS小结
其实bfs本身不难,甚至不需要去学习,只要知道它的特性就可以写出来了.往往,bfs都是用递归做的.递归比循环更容易timeout.所以这次遇到一题bfs,卡时间的就悲剧了. PAT1076 #incl ...
- jQuery——属相操作
属性获取:attr(属性名), 属性设置:attr(属性名,具体值) 移除属性:removeAttr(属性名) 特殊情况:prop(属性名).prop(属性名,具体值):表单中状态属性checked. ...
- [Windows Server 2008] 手工创建安全网站
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:手工创建安全站 ...
- VC使用CryptoAPI计算MD5
// md5.h #include <tchar.h> #include <wincrypt.h> // 计算Hash,成功返回0,失败返回GetLastError() // ...
- @RequestMapping参数value和params的区别
value的值可以是一个url地址的形式或者正则表达式或者rest风格的形式,而params正如其名是参数,访问的时候params的值只能作为参数,不能作为访问的地址,请看下例> value的使 ...
- rrdtool 实践
rrdtool 实践 rrdtool 参数比较多,如果直接看文档,不知从何入手,直接从例子入手这样容易理解,模拟网卡流量 1. 创建数据库 rrdtool create Flow.rrd --star ...
- jboss-eap-6.2修改端口号
最近要改版一个项目,用来配合日常工作使用,需要在服务器上放多个jboss,那么就需要修改jboss的端口,如果服务器上配置了JBOSS_HOME,需要先删除,否则配置修改不会生效,会依然用老的jbos ...