2017-06-08 15 views
1

ファイルにHTTP応答の内容を書き込もうとしています。std :: io :: Bytesを&[u8]に変換する方法

extern crate reqwest; 

use std::io::Write; 
use std::fs::File; 

fn main() { 
    let mut resp = reqwest::get("https://www.rust-lang.org").unwrap(); 
    assert!(resp.status().is_success()); 

    // Write contents to disk. 
    let mut f = File::create("download_file").expect("Unable to create file"); 
    f.write_all(resp.bytes()); 
} 

しかし、私は以下のコンパイルエラーを取得:

error[E0308]: mismatched types 
    --> src/main.rs:12:17 
    | 
12 |  f.write_all(resp.bytes()); 
    |     ^^^^^^^^^^^^ expected &[u8], found struct `std::io::Bytes` 
    | 
    = note: expected type `&[u8]` 
       found type `std::io::Bytes<reqwest::Response>` 

答えて

4

あなたがすることはできません。 the docs for io::Bytesを確認するには、適切な方法はありません。これは、io::Bytesはバイト単位で結果を返すイテレータであるため、でもありません。データの単一のスライスです。

だけio::Bytesを持っていたそれは、あなたがVeccollectにイテレータが必要になります

let data: Result<Vec<_>, _> = resp.bytes().collect(); 
let data = data.expect("Unable to read data"); 
f.write_all(&data).expect("Unable to write data"); 

しかし、ほとんどの場合、あなたはReadを実装する型へのアクセス権を持っているので、あなたの代わりにRead::read_to_endを使用することもできます。この特定のケースで

let mut data = Vec::new(); 
resp.read_to_end(&mut data).expect("Unable to read data"); 
f.write_all(&data).expect("Unable to write data"); 

、あなたは直接ため、ファイルへRequestからコピーするio::copyを使用することができますはio::ReadFileを実装しています。io::Write

extern crate reqwest; 

use std::io; 
use std::fs::File; 

fn main() { 
    let mut resp = reqwest::get("https://www.rust-lang.org").unwrap(); 
    assert!(resp.status().is_success()); 

    // Write contents to disk. 
    let mut f = File::create("download_file").expect("Unable to create file"); 
    io::copy(&mut resp, &mut f).expect("Unable to copy data"); 
} 
関連する問題