首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rust JSON API请求格式

Rust JSON API请求格式
EN

Stack Overflow用户
提问于 2019-12-25 03:55:37
回答 2查看 717关注 0票数 0

我正在尝试执行一个给定的API结构的搜索请求:https://api.wigle.net/swagger#/

目前,我已经尝试通过执行以下操作在给定的结构中执行/api/v2/network/search (对不起,url太长了!):

代码语言:javascript
复制
#[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(())
}

我得到的输出是:

代码语言:javascript
复制
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输出?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-25 04:52:34

此机箱不支持将其类型Response转换为serde_json::Value类型的可能性。但是你可以自己实现它。

您应该定义您的结构并对其进行操作。对于instanse,它可能在某种程度上类似于:

代码语言:javascript
复制
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,使其每次都不那么描述性。

票数 0
EN

Stack Overflow用户

发布于 2019-12-25 07:48:44

我发现我需要为这个特定的API使用Authorization标头

代码语言:javascript
复制
#[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 client = reqwest::Client::new();
    let response = client.get(&request_url).header("Authorization","Basic *****").send()?.text()?;

    println!("{:?}", response);
    //let result: Vec<Output> = response.json()?;
    //println!("{}", result[0].trilat);
    Ok(())
}

这将返回实际数据,而不是给我401访问拒绝代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59472965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档