Как получить данные, которые сервер отправил обратно из HTTP-вызова reqwest? - PullRequest
1 голос
/ 29 мая 2020

У меня есть простой HTTP-сервер, который ожидает POST данных json. Он отправит обратно те же самые json данные, но с дополнительным полем '' ''.

Я могу продемонстрировать это с помощью curl:

$ curl -X POST -H "Content-Type: application/json" -d '{"id":1,"jsonrpc":"2.0","method":"getNext","params":[{"flavour":"apples"}]}' http://127.0.0.1:8008
{"params": [{"flavour": "apples"}], "received": "ok", "jsonrpc": "2.0", "id": 1, "method": "getNext"}

HTTP-сервер отправил некоторые json, и он ответил так же json, но с дополнительным полем 'Receive'.

Я пытаюсь сделать то же самое в ржавчине с помощью reqwest.

use serde_json::{Value};

#[tokio::main]
async fn main() {

    let url = "http://127.0.0.1:8008";

    let data = r#"
        {
            "id": 1,
            "jsonrpc": "2.0",
            "method": "getNext",
            "params": [ {
                "flavour": "apple"
            } ]
        }"#;

    let v: Value = match serde_json::from_str(data) {
        Err(_) => panic!("this is a terrible mistake!"),
        Ok(y) => y,
    };

    let client = reqwest::Client::new();

    let res = client.post(url)
        .json(&v)
        .send()
        .await;

    println!("{:?}",res);
}

Пока это действительно делает вызов, и я вижу отправленное json в журнале сервера, и я вижу, что сервер отправляет обратно json, как и в случае с curl ... Я не знаю, кому на самом деле добраться до данные в Rust. Кажется, все, что есть, это нормально, что вызов сработал ... но как получить json сервер, отправленный обратно?

$ cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.06s
     Running `/Users/x/RUST/projects/monitor/target/debug/monitor`
Ok(Response { url: "http://127.0.0.1:8008/", status: 200, headers: {"server": "BaseHTTP/0.3 Python/2.7.16", "date": "Fri, 29 May 2020 13:54:39 GMT", "content-type": "application/json"} })

1 Ответ

1 голос
/ 29 мая 2020

Это работает.

use serde_json::{Value};

#[tokio::main]
async fn main() {

    let url = "http://127.0.0.1:8008";

    let data = r#"
        {
            "id": 1,
            "jsonrpc": "2.0",
            "method": "getNext",
            "params": [ {
                "flavour": "apple"
            } ]
        }"#;

    let v: Value = match serde_json::from_str(data) {
        Err(_) => panic!("this is a terrible mistake!"),
        Ok(y) => y,
    };

    let client = reqwest::Client::new();

    let result = client.post(url)
        .json(&v)
        .send()
        .await;

    if let Ok(response) = result {
        if let Ok(text) = response.text().await {
            let result: serde_json::Result<Value> = serde_json::from_str(&text);
            if let Ok(j) = result {
                println!("received: {}, flavour still: {}", j["received"], j["params"][0]["flavour"]);
            } else {
                panic!("Could not convert text to json");
            }
        } else {
            panic!("Could not extract text from response");
        }
    } else {
        panic!("No response from server");
    }
}
    Finished dev [unoptimized + debuginfo] target(s) in 1.93s
     Running `target/debug/monitor`
received: "ok", flavour still: "apple"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...