Rust使用reqwest发起GET请求打印结果,impl Future无Debug报错如何解决
问题原因
你的代码存在三处核心问题:
- 你调用的是reqwest默认的异步API,
reqwest::get()返回的是还未执行的Future对象,直接打印就会触发「未实现Debug trait」的报错。异步场景需要搭配运行时使用,简单请求场景更推荐直接用reqwest的阻塞客户端降低复杂度。 - 你把curl的
-u参数直接拼接在请求URL里是错误用法,-u对应的是HTTP Basic Auth认证逻辑,需要单独配置到请求头中,不能直接作为URL的一部分。 #[derive(Debug)]加在main函数上是无效语法,没有任何作用,可以直接删除。
前置依赖配置
先修改你的Cargo.toml引入必要的依赖特性:
[dependencies] serde_json = "1.0" reqwest = { version = "0.11", features = ["blocking", "json"] }
修改后的完整代码
#[macro_use] extern crate serde_json; use reqwest::blocking::Client; use reqwest::Error; fn main() -> Result<(), Error> { //测试JSON美化打印 let obj = json!({"data":{"updated_at":"2021-09-17T17:41:05.677631986Z","items":[{"signed_at":"2015-07-30T03:26:13Z","height":0}],"pagination":null},"error":false,"error_message":null,"error_code":null}); //美化打印上述JSON,该部分运行正常 println!("{}", serde_json::to_string_pretty(&obj).unwrap()); //初始化阻塞HTTP客户端 let client = Client::new(); //API密钥末尾加冒号对应你要的跳过密码校验逻辑 let api_key = "my_private_key:"; let request_url = "https://api.xyz.com/v1/1/"; //发起带Basic Auth认证的GET请求 let response = client .get(request_url) .basic_auth(api_key, None::<String>) .send()?; //打印响应状态码 println!("响应状态:{:?}", response.status()); //解析响应为JSON格式 let resp_json: serde_json::Value = response.json()?; //美化打印返回结果 println!("响应内容:\n{}", serde_json::to_string_pretty(&resp_json).unwrap()); Ok(()) }
补充说明
如果你确实需要使用异步写法,只需要把reqwest的features换回默认配置,给main函数加上#[tokio::main]标记、修改为异步函数,所有请求操作后加.await即可,阻塞写法更适合单接口请求的简单脚本场景。
内容的提问来源于stack exchange,提问作者marrowgari
相关产品推荐
相关产品推荐

