如何转换std :: io :: Bytes到&[u8]

pho*_*nix 3 rust

我试图将HTTP响应的内容写入文件.

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());
}
Run Code Online (Sandbox Code Playgroud)

但是我得到以下编译错误:

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>`
Run Code Online (Sandbox Code Playgroud)

She*_*ter 5

你不能.检查文档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");
Run Code Online (Sandbox Code Playgroud)

但是,在大多数情况下,您可以访问实现的类型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");
Run Code Online (Sandbox Code Playgroud)

在这种特定情况下,您可以使用io::copy直接从Request文件复制到文件,因为Request实现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");
}
Run Code Online (Sandbox Code Playgroud)