2017-06-08 101 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,你需要collect迭代器爲Vec

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"); 

在這種特殊情況下,可以使用io::copy直接從Request複製到該文件,因爲Request implements io::Read and File implements 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"); 
}