我试图让一个基本的reqwesthttp 请求像这样
extern crate reqwest;
extern crate url;
use url::Url;
fn main() {
let resp = reqwest::get("http://google.com".parse::<Url>().unwrap());
println!("{:?}", resp.unwrap())
}
Run Code Online (Sandbox Code Playgroud)
但是,这会产生错误
找不到 OpenSSL 安装目录,
-sys如果不了解此信息,此板条箱将无法继续。如果安装了 OpenSSL 并且此 crate 无法找到它,则可OPENSSL_DIR以为编译过程设置环境变量。确保您还安装了 openssl 的开发包。例如,
libssl-dev在 Ubuntu 或openssl-develFedora 上。...
嗯,这很容易解决。一个调用sudo apt install libssl-dev和sudo apt install pkg-config它的工作。但我仍然不明白这里到底出了什么问题。我认为cargo应该照顾依赖。为什么我现在要手动狩猎它们apt?
我需要下载一个 60MB 的 ZIP 文件并提取其中的唯一文件。我想下载它并使用流提取它。如何使用 Rust 实现这一点?
fn main () {
let mut res = reqwest::get("myfile.zip").unwrap();
// extract the response body to myfile.txt
}
Run Code Online (Sandbox Code Playgroud)
在 Node.js 中,我会做这样的事情:
http.get('myfile.zip', response => {
response.pipe(unzip.Parse())
.on('entry', entry => {
if (entry.path.endsWith('.txt')) {
entry.pipe(fs.createWriteStream('myfile.txt'))
}
})
})
Run Code Online (Sandbox Code Playgroud) 当我运行以下代码时:
use exitfailure::ExitFailure;
use reqwest::Url;
use serde_derive::{Deserialize, Serialize};
use std::env;
#[derive(Serialize, Deserialize, Debug)]
struct CompanyInfo {
country: String,
currency: String,
exchange: String,
ipo: String,
marketCapitalization: u128,
name: String,
phone: String,
shareOutstanding: f64,
ticker: String,
weburl: String,
logo: String,
finnhubIndustry: String,
}
impl CompanyInfo {
async fn get(symbol: &String, api_key: &String) -> Result<Self, ExitFailure> {
let url = format!(
"https://finnhub.io/api/v1/stock/profile2?symbol={}&token={}",
symbol, api_key
);
let url = Url::parse(&*url)?;
let res = reqwest::get(url).await?.json::<CompanyInfo>().await?;
Ok(res)
}
}
#[tokio::main]
async fn main() -> Result<(), ExitFailure> …Run Code Online (Sandbox Code Playgroud) 我正在尝试泛化函数Result返回的a reqwest::blocking::get。它返回 aResult<reqwest::blocking::Response, reqwest::Error>但调用它的函数返回 a Result<reqwest::blocking::Response, Box<dyn std::error::Error>。
这是第一次尝试:
fn get_example_fails() -> Result<Response, Box<dyn Error>> {
let result = blocking::get("http://example.com");
result.map_err(|error| Box::new(error))
}
Run Code Online (Sandbox Code Playgroud)
它有以下错误,我不知道如何修复,但觉得通过一些小的调整可能会更惯用 - 但我不确定要调整什么:
error[E0308]: mismatched types
--> src/bittrex.rs:143:9
|
141 | fn get_example_fails() -> Result<Response, Box<dyn Error>> {
| -------------------------------- expected `Result<reqwes
t::blocking::Response, Box<(dyn StdError + 'static)>>` because of return type
142 | let result = blocking::get("http://example.com");
143 | result.map_err(|error| Box::new(error))
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected trait object `dyn StdError`,
found …Run Code Online (Sandbox Code Playgroud) 我想使用reqwestcrate 进行异步HTTP请求.我有以下代码:
// see https://docs.rs/reqwest/*/reqwest/async/index.html
use reqwest::async::Client;
Run Code Online (Sandbox Code Playgroud)
当我尝试编译我的代码时,我收到以下错误:
error: expected identifier, found reserved keyword `async`
--> src/main.rs:1:14
|
1 | use reqwest::async::Client;
| ^^^^^ expected identifier, found reserved keyword
Run Code Online (Sandbox Code Playgroud)
如何从async模块导入?
我正在尝试运行基本reqwest 示例:
extern crate reqwest;
extern crate tokio;
#[tokio::main]
async fn main() -> Result<(), reqwest::Error> {
let res = reqwest::Client::new()
.get("https://hyper.rs")
.send()
.await?;
println!("Status: {}", res.status());
let body = res.text().await?;
println!("Body:\n\n{}", body);
Ok(())
}
Run Code Online (Sandbox Code Playgroud)
我得到的错误:
--> src/main.rs:6:15
|
6 | let res = reqwest::Client::new()
| _______________^
7 | | .get("https://hyper.rs")
8 | | .send()
9 | | .await?;
| |______________^ the trait `std::future::Future` is not implemented for `std::result::Result<reqwest::Response, reqwest::Error>`
Run Code Online (Sandbox Code Playgroud)
锈版: rustc 1.39.0 (4560ea788 2019-11-04)
库版本:
reqwest = "0.9.22" …Run Code Online (Sandbox Code Playgroud) 我对 Rust 很陌生,我似乎无法找到这个问题的解决方案。我正在尝试以 json 形式获取 get 请求的响应。
#[macro_use]
extern crate serde;
extern crate serde_derive;
extern crate reqwest;
use reqwest::Error;
fn main(){
#[derive(Deserialize)]
struct Ip {
origin: String,
}
let json: Ip = reqwest::get("http://httpbin.org/ip").json();
//reqwest::get("http://httpbin.org/ip")?.json()?;
}
Run Code Online (Sandbox Code Playgroud)
这是cargo.toml
[dependencies]
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
serde_derive = "1.0"
reqwest = { version = "0.10", features = ["blocking"] }
Run Code Online (Sandbox Code Playgroud)
另外,如果我使用
reqwest::get("http://httpbin.org/ip")?.json()?;
Run Code Online (Sandbox Code Playgroud)
(添加问号)我收到另一个错误说
cannot use the `?` operator in a function that returns `()`
this function …Run Code Online (Sandbox Code Playgroud) 我无法从 a 返回函数的结果Result。每个教程只展示如何使用 Result,而不展示如何从中返回值。
fn main(){
let mut a: Vec<String> = Vec::new();
a = gottem();
println!("{}", a.len().to_string());
//a.push(x.to_string()
}
async fn gottem() -> Result<Vec<String>, reqwest::Error> {
let mut a: Vec<String> = Vec::new();
let res = reqwest::get("https://www.rust-lang.org/en-US/")
.await?
.text()
.await?;
Document::from(res.as_str())
.find(Name("a"))
.filter_map(|n| n.attr("href"))
.for_each(|x| println!("{}", x));
Ok(a)
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
fn main(){
let mut a: Vec<String> = Vec::new();
a = gottem();
println!("{}", a.len().to_string());
//a.push(x.to_string()
}
async fn gottem() -> Result<Vec<String>, reqwest::Error> {
let mut a: Vec<String> = Vec::new();
let …Run Code Online (Sandbox Code Playgroud) 我按照 Rust Cookbook 中提到的代码https://rust-lang-nursery.github.io/rust-cookbook/web/clients/download.html通过 HTTP GET 请求以异步方式下载文件。
我的代码如下:
#[tokio::main]
async fn main() -> Result<()> {
let object_path = "logos/rust-logo-512x512.png";
let target = format!("https://www.rust-lang.org/{}", object_path);
let response = reqwest::get(&target).await?;
let mut dest = {
let fname = response
.url()
.path_segments()
.and_then(|segments| segments.last())
.and_then(|name| if name.is_empty() { None } else { Some(name) })
.unwrap_or("tmp.bin");
println!("file to download: '{}'", fname);
let object_prefix = &object_path[..object_path.rfind('/').unwrap()];
let object_name = &object_path[object_path.rfind('/').unwrap()+1..];
let output_dir = format!("{}/{}", env::current_dir().unwrap().to_str().unwrap().to_string(), object_prefix);
fs::create_dir_all(output_dir.clone())?;
println!("will be located under: '{}'", output_dir.clone()); …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用构建器的 query() 方法为 reqwest 客户端构建查询字符串。但其中一个参数必须是像这样编码的多个值
?dt=t&dt=at&dt=m
Run Code Online (Sandbox Code Playgroud)
我不知道怎么办。
use reqwest::blocking::Client;
use serde_json::{json, Value as JsonValue};
fn main() {
let query = json!({
"client": "gtx",
"ie": "UTF-8", // input encoding
"oe": "UTF-8", // output encoding
"sl": "auto", // source language
"tl": "en", // target language
"dt": ["t", "at", "m"], // <<<<< ERROR
"q": "salut les gars. ca va? on y va!", // text to translate
});
let client = Client::new();
let response = client.get("https://translate.googleapis.com/translate_a/single")
.query(&query)
.send()
.unwrap();
if response.status().is_success() {
let body: …Run Code Online (Sandbox Code Playgroud) reqwest ×10
rust ×10
async-await ×3
rust-result ×2
asynchronous ×1
http-get ×1
json ×1
openssl ×1
rust-2018 ×1
rust-tokio ×1
serde ×1
ssl ×1
syntax ×1
urlencode ×1