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

    作者:宛宏南

  • 相关阅读:
    【代码笔记】JTable 、TableModel的使用3
    学习JSP(二)
    Tomcat文件配置
    学习JSP(一)
    配置elipse
    配置Jdk
    定义新运算练习题
    学习JAVA所需的东西
    学习秘籍
    总有那么一个人
  • 原文地址:https://www.cnblogs.com/wanhongnan/p/5744812.html
Copyright © 2020-2023  润新知