rust - Rust JSON API 请求格式
问题描述
我正在尝试通过以下方式执行给定 API 结构的搜索请求: https ://api.wigle.net/swagger#/
目前,我试图通过这样做来通过给定的结构执行 /api/v2/network/search (对不起,长网址!):
#[macro_use]
extern crate serde;
extern crate serde_derive;
extern crate reqwest;
use reqwest::Error;
use serde_json;
#[derive(Deserialize, Debug)]
struct Output {
trilat: f64,
trilong: f64,
}
fn main() -> Result<(), Error> {
let request_url = format!("https://api.wigle.net/api/v2/network/search?first=0&latrange1={lat_range_min}&latrange2={lat_range_max}&longrange1={long_range_min}&longrange2={long_range_max}&freenet=false&paynet=false&ssid={ssid}",
lat_range_min = "41.159",
lat_range_max = "42.889",
long_range_min = "-73.5081",
long_range_max = "-69.7398",
ssid= "XFINITY"
);
let mut response = reqwest::get(&request_url)?;
println!("{:?}", response);
//let result: Vec<Output> = response.json()?;
//println!("{}", result[0].trilat);
Ok(())
}
我得到的输出是:
Response { url: "https://api.wigle.net/api/v2/network/search?first=0&latrange1=41.159&latrange2=42.889&longrange1=-73.5081&longrange2=-69.7398&freenet=false&paynet=false&ssid=xfinity", status: 401, headers:
{"server": "nginx/1.16.1", "date": "Tue, 24 Dec 2019 19:51:14 GMT", "content-type": "application/json", "content-length": "14", "connection": "keep-alive"} }
但是,如果您要执行实际请求,您将从 WiGLE 获得详细的 api 输出。
我该怎么做才能获得正确的输出,以便将其解析为 json 输出?
谢谢!
解决方案
此 crate 不支持将其类型转换为类型的这种Response
可能性serde_json::Value
。但是你可以自己实现它。
您应该定义您的结构并对其进行操作。例如,它可能类似于以下内容:
use serde::{Serialize, Deserialize};
use std::collections::HashMap;
use serde_json;
use reqwest;
use reqwest::Error;
#[derive(Serialize, Deserialize, Debug)]
struct Req {
url: String,
status: u16,
headers: HashMap<String, String>,
body: Option<serde_json::Value>
}
fn main() -> Result<(), Error> {
let request_url = format!("https://api.wigle.net/api/v2/network/search?first=0&latrange1={lat_range_min}&latrange2={lat_range_max}&longrange1={long_range_min}&longrange2={long_range_max}&freenet=false&paynet=false&ssid={ssid}",
lat_range_min = "41.159",
lat_range_max = "42.889",
long_range_min = "-73.5081",
long_range_max = "-69.7398",
ssid= "xfinity"
);
let mut response = reqwest::get(&request_url)?;
let mut hm = HashMap::new();
for (key, val) in response.headers().into_iter() {
hm.insert(key.as_str().to_owned(), val.to_str().ok().unwrap_or("").to_owned());
}
let req = Req {status: response.status().as_u16(), url: request_url, body: response.json().ok(), headers: hm};
println!("{}", serde_json::to_string(&req).unwrap_or("".to_owned()));
Ok(())
}
要改进这样的解决方案,您可以实现特征From
,而不是每次都如此描述。
推荐阅读
- tosca - 如何修复托斯卡脚本?Loginfo 说找不到名为“WaitTime_S”的缓冲区。可能是什么问题以及如何解决?
- sql-server - 如何在sql中使用pivot将两行转换为一列
- django - 优化django sql查询
- java - JavaFX8 在 jdk 1.7.85 中无缝?
- javascript - 离开/关闭标签前的确认?
- python - Django 身份验证登录不返回任何内容
- swift - `MTLTextureDescriptor has invalid pixelFormat (0) 我该怎么办?
- android - java.lang.RuntimeException:无法实例化应用程序android.app.Application:java.lang.IllegalStateException:(应用程序不断崩溃)
- python - 在使用 ElementTree 解析之前,如何检查 XML 中是否存在标签?
- python - Django:在 runserver 之后立即运行脚本