3
对于缺乏更好的例子,假设我想用Rust编写一个简单的客户端,它可以建立连接并从Twitter's HTTP Streaming API接收数据。这可能吗?我一直在关注Iron和Nickel这看起来很不错的框架,但我不认为他们有这个功能呢?在Rust中HTTP服务器推送(流媒体)的客户端?
对于缺乏更好的例子,假设我想用Rust编写一个简单的客户端,它可以建立连接并从Twitter's HTTP Streaming API接收数据。这可能吗?我一直在关注Iron和Nickel这看起来很不错的框架,但我不认为他们有这个功能呢?在Rust中HTTP服务器推送(流媒体)的客户端?
HTTP客户端hyper支持只读取响应递增(如任何实现生锈的Reader
性状),但我没能找到任何解析响应递增,或实现Twitter的特定协议(与结束objecs \r\n
)。
这么说,我是能够实现概念的quick'n'dirty证明:
编辑:见与它on github玩。
use rustc_serialize::json::Json;
use std::str;
pub trait JsonObjectStreamer {
fn json_objects(&mut self) -> JsonObjects<Self>;
}
impl<T: Buffer> JsonObjectStreamer for T {
fn json_objects(&mut self) -> JsonObjects<T> {
JsonObjects { reader: self }
}
}
pub struct JsonObjects<'a, B> where B: 'a {
reader: &'a mut B
}
impl<'a, B> Iterator for JsonObjects<'a, B> where B: Buffer + 'a {
type Item = Json;
fn next(&mut self) -> Option<Json> {
let mut line_bytes = match self.reader.read_until(b'\r') {
Ok(bytes) => bytes,
Err(_) => return None,
};
if line_bytes.last() == Some(&b'\r') {
// drop the \r
line_bytes.pop();
// skip the \n
match self.reader.read_char() {
Ok(_) =>(),
Err(_) => return None,
}
}
let line = match str::from_utf8(&line_bytes) {
Ok(line) => line,
Err(_) => return None
};
Json::from_str(line).ok()
}
}
用法:(假设你已经把它丢在src/json_streamer.rs
文件,您的项目)
#![feature(io)]
extern crate hyper;
extern crate "rustc-serialize" as rustc_serialize;
mod json_streamer;
use hyper::Client;
use std::old_io::BufferedReader;
use json_streamer::JsonObjectStreamer;
fn main() {
let mut client = Client::new();
let res = client.get("http://localhost:4567/").send().unwrap();
for obj in BufferedReader::new(res).json_objects() {
println!("object arrived: {}", obj);
}
}
我用这个小小的西纳特拉的应用程序进行测试:
require 'sinatra'
require 'json'
class Stream
def each
hash = { index: 0 }
loop do
hash[:index] += 1
yield hash.to_json + "\r\n"
sleep 0.5
end
end
end
get '/' do
Stream.new
end
我可以't似乎无法编译它...获取'未能运行'openssl-sys v0.3.5'的自定义构建命令' 过程未成功退出:'/ home/user/code/hello_rust/target/build/OpenSSL的-SYS-6694e080744fb2e2/BUIL d-script-build'(status = 101) --- stderr 线程''''找不到openssl库',/home/user/.cargo/registry/src/github.com-1ecc6299db9ec823/openssl -sys-0.3.5/build.rs:46' –
Caballero
2015-02-12 15:18:52
@Caballero看来你错过了一些openssl的依赖关系。我建议你看看[rust-openssl's readme](https://github.com/sfackler/rust-openssl/) – 2015-02-12 16:34:37
谢谢,完全错过了'libssl-dev'依赖 – Caballero 2015-02-12 16:53:30