D语言中使用Curl读取网页

      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;
}

image

      在包中有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来做字符串的处理,好像性能并不是很好。下次需要做一下详细的测试。

作者:宛宏南

原文地址:https://www.cnblogs.com/wanhongnan/p/5744812.html