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

    作者:宛宏南

  • 相关阅读:
    【转载】中文分词整理
    【转载】浅谈事件冒泡与事件捕获
    【转载】SpringCloud-Eurek 心跳阈值说明
    【转载】Linux下查看CPU、内存占用率
    Linux内存、性能诊断中vmstat命令的详解
    【转载】springboot四 全局异常处理
    【转载】linux系统时间自动同步:ntp
    springboot整合三 共享session,集成springsession
    git把一个分支上的某个提交合并到另一个分支
    VS Code打开新的文件会覆盖窗口中的,怎么改
  • 原文地址:https://www.cnblogs.com/wanhongnan/p/5744812.html
Copyright © 2011-2022 走看看