Rust翻译计划——网络编程curl库(上)

本文目录:

  1. 简介
  2. 快速通道
  3. 翻译--curl库
    • easy模块
    • multi模块

1. 简介

虽然这个系列是属于Rust使用库翻译计划的系列之一,但是由于该库官网提供的使用文档几乎等于没有,所以本文实际上是简单翻译一下api文档后小生自己写的使用文档,Orz。

2. 快速通道

所有的翻译文章将集中导航于:Rust常用库翻译计划

3.翻译——curl库

curl库github快速通道
配套翻译之curl中文api

该库主要实现了网络通信中作为客户端会使用到的几乎所有的函数,其中常用的遇到的需求,几乎都可以使用easy模块来实现。在easy模块中总共定义了八个Struct,十个枚举以及数不清的函数,其中函数按照功能大概可以分为以下几类:

  • 配置类函数
  • 构建类函数
  • 信息获取类
  • 纯粹操作类
  • 回调类函数

其中配置类函数占了绝大多数,这类函数主要用于设置发送请求时的请求头、验证信息等等一系列的配置选项,几乎全部是返回 Result<(), Error>,所以几乎等于没有返回值,直接每个函数调用后unwrap一下就可以了。构建类函数主要就是new和transfer,返回一个结构体实例。信息获取类函数即调用后获取头信息之类的相关信息的函数.纯粹操作类的函数即类似于perform这类,调用后会直接将请求发出,返回无意义的Result<(), Error>,也不需要传入参数,只是单纯的提示系统该执行某个操作了。最后回调类函数即使类似write_function这类,接受一个闭包作为参数,在执行固定操作完成后便会调用该闭包函数。

示例一:简单入门

extern crate curl;
use curl::easy::Easy;
use std::io::{
   Write,
   stdout
};
fn main() {
    let mut easy = Easy::new();
    easy.url("http://juejin.im").unwrap();
    easy.write_function(|data| {
        Ok(stdout().write(data).unwrap())
    }).unwrap();
    easy.perform().unwrap();
}

这个例子中使用了curl库,并且使用了easy模块的命名空间,首先使用new函数新建了一个easy实例,然后通过url函数设置了访问的主机地址,然后继续设置了拉取到数据后的回调函数write_function,传入一个闭包函数,参数data即为服务器返回的数据,该闭包返回一个Result<usize, WriteError> + Send + 'static,所以直接一条语句顺便输出了服务器返回的data,然后调用perform函数,让请求正式发出。结果如下:


upload successful

可以看出确实获取到了服务器的返回的数据,不过由于服务器做了3xx重定向,导致拉取到了一个无意义的重定向以前的页面,所以要设置让系统跟随头文件的设置一起跳转

示例二:跟随重定向

extern crate curl;
use curl::easy::Easy;
use std::io::{
   Write,
   stdout
};
fn main() {
    let mut easy = Easy::new();
    easy.nobody(true).unwrap();
    easy.url("http://juejin.im").unwrap();
    easy.follow_location(true).unwrap();
    easy.write_function(|data| {
        Ok(stdout().write(data).unwrap())
    }).unwrap();
    easy.perform().unwrap();
    println!("last_Url:{:?}",easy.effective_url().unwrap().unwrap());
    println!("response_code:{:?}",easy.response_code().unwrap());
    println!("http_connectcode:{:?}",easy.http_connectcode().unwrap());
    println!("filetime:{:?}",easy.filetime().unwrap());
    println!("total_time:{:?}",easy.total_time().unwrap());
}

这个例子中,通过follow_location配置设置了跟随重定向跳转,所以可以获取到掘金首页的html,不过由于内容过大,影响观看,所以这里调用了nobody函数,配置不返回body体,然后顺便在结束后打印出一部分相关的信息。

upload successful

示例三:关于回调函数

fn main() {
    let mut easy = Easy::new();
    easy.url("http://www.yzyxw.online/api/round/getQuestion").unwrap();
    easy.post(true).unwrap();
    //easy.nobody(true).unwrap();
    easy.header_function(|data| {
        print!("header: {}", str::from_utf8(data).unwrap());
        true
    }).unwrap();
    easy.write_function(|data| {
        Ok(stdout().write(data).unwrap())
    }).unwrap();
    easy.read_function(|into| {
        Ok(stdin().read(into).unwrap())
    }).unwrap();
    easy.perform().unwrap();
    
}

这里分别实现了读写和头三个回调,其中头回调函数会在获得http头的是后将头信息作为参数传入闭包中,这里打印出了头信息,write回调会在获得服务器返回数据后调用闭包,将服务器返回数据传入闭包参数中。特别说明:如果设置了show_header(true),那么返回信息中会同时包含头信息。。关于读回调,主要是用于设置访问服务器时携带数据的方式之一,将标准输入数据拷贝仅回调的参数中,该数据将会被携带至服务器,为了能携带数据,这里将访问模式这是成了post。

当然,由于这里的操作都是从标准输入输出中读取的,在回调闭包中,对外部变量的借用是不被允许的,在回调外定义一个数据,在读回调中使用时不允许的,就像这样:
{% codeblock lang:rust %}
let mut info = &b"tasdasdadad"[..];
easy.read_function(|data| {
Ok(info.read(data).unwrap())
}).unwrap();
easy.perform().unwrap();
{% endcodeblock %}
结果:


upload successful

对于这种情况,该库引入了Transfer,使用transfer()会返回一个transfer实例,该实例拥有着对easy实例的一个可变借用,所以在调用该函数后一直到transfer生命周期结束前都不可以再使用easy句柄来进行一些操作,所以可以选择用大括弧将对应语句段包括起来,人为控制其生命周期。transfer同样实现了easy中所有的回调函数,用transfer可以实现上述不能实现的功能:

关于Transfer:

fn main() {
    let mut easy = Easy::new();
    easy.url("http://www.yzyxw.online/api/round/getQuestion").unwrap();
    easy.post(true).unwrap();
    //easy.nobody(true).unwrap();
    easy.header_function(|data| {
        print!("header: {}", str::from_utf8(data).unwrap());
        true
    }).unwrap();
    easy.write_function(|data| {
        Ok(stdout().write(data).unwrap())
    }).unwrap();
   let mut info = &b"tasdasdadad"[..];
    let mut tran=easy.transfer();
    tran.read_function(|data| {
        Ok(info.read(data).unwrap())
    }).unwrap();
    tran.perform().unwrap();
    
}

这时便可以在闭包内获取外部上下文引用

伪结语

在easy模块中共定义了七个回调设置函数,使用方式大同小异,剩下便是相关ssl验证,代理设置等等一系列的操作,基本全是通过一系列的设置函数实现的,就不一一赘述了。感兴趣的pong友们可以参考我简单翻译的api传送门,也可以参考官网比较详尽的英文api传送门.
对于该库另一个模块multi将在本文的下篇部分详细解释,同时也将整合各个api制作一份综合实例给喜欢Rust这门目前比较小众的语言的pong友们。
另外,更多Rust库翻译请关注Rust实用库翻译计划

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容

  • 本文目录 简介 api简介easy模块multi模块 简介 api中文化系列是为了辅助Rust常用库翻译计划而做的...
    被叫做逸轩的可儿阅读 1,627评论 0 2
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,462评论 25 707
  • 思绪万千,和刚回国的一个朋友,热聊了一天。 刚相聚,又要分离。这种感觉不是很好。 就像我的朋友所说:有些人,见一面...
    瑾兰阅读 178评论 1 0
  • 《史记·刺客列传》中讲述了五个侠义之人的故事。他们所奉守的信念是明确的,为国家、为恩情、为诚信去实现个人的志向,虽...
    陶陶爸比阅读 810评论 0 50
  • 沙地望秋/大漠 绿野秋风浓塞上,晚来瑟瑟沁肤凉。 南飞栖雁声声近,落日孤影渐渐长。 斜月沉沉漠上去,浮云淡淡下山岗...
    大漠qxy阅读 242评论 0 1