标签:
D语言中对Curl库有两个包, 一个是etc.c.curl,一个是std.net.curl,其中etc.c.curl是原始的libcurl库的c语言接口转化为D语言的接口,使用这个包里的函数,可以更原始的方法使用libcurl库。而std.net.curl包则是在etc.c.curl基础上对libcurl库的调用做了一个封装,让使用者使用起来更加方便。使用etc.c.curl与c语言里使用curl基本上完全一样,没什么大的区别,这里不讨论。下面只是简单介绍一下使用std.net.curl来编写一个完整的http请求。
std.net.curl中对libcurl的封装主要在struct HTTP这个结构里完成,必须要处理的函数有
1) onReceive回调函数,用于处理接收到的数据。
2) perform 函数,用于同步处理请求。 curl是可以做异步处理的,这里不详解。
3) method属性,设置请求协议类型get,post。其它不介绍。
4) setPostData 设置post的数据
5) responseHeaders属性, 获取返回数据的头。
6) addRequestHeader函数,添加自定义的头,也可以先使用clearRequestHeaders清空默认的请求头
7) setCookie设置自己的cookie项,应该说是添加。
import std.stdio; import std.traits; import std.format; import core.thread; private import std.net.curl; private import std.conv; private import excode; int main(string[] argv) { try { HTTP http = HTTP("http://www.baidu.com/"); ubyte[] res; http.onReceive = (data) { res ~= data; return data.length; }; http.method = HTTP.Method.get; http.perform(); auto str = cast(string)(res); auto tmp = GBK2UNI(str); writeln(tmp); } catch(Throwable e) { writeln("err:",e); } readln(); return 0; }
在包中有get方法与post方法,可以更简单的使用。
下面的例子直接使用get方法取网页。
import std.stdio; import std.traits; import std.format; import core.thread; private import std.net.curl; private import std.conv; private import excode; int main(string[] argv) { try { auto text = get("http://www.baidu.com/"); auto tmp = GBK2UNI(text); writeln(tmp); } catch(Throwable e) { writeln("err:",e); } readln(); return 0; }
当然直接使用post方法也是一样的简单。
excode使用appender来做字符串的处理,好像性能并不是很好。下次需要做一下详细的测试。
作者:宛宏南
标签:
原文地址:http://www.cnblogs.com/wanhongnan/p/5744812.html