rust 通过网络发送“application/x-www-form-urlencoded”数据代替JSON

koaltpgm  于 2023-03-30  发布在  其他
关注(0)|答案(2)|浏览(172)

我用来在网络上序列化的结构的定义

pub struct NetworkData {
    id: String,
    status: String,
    details: <Data Structure>,
}

现在有一个函数接受这个结构,序列化它并通过网络发送。

fn send_data(data: NetworkData ...) -> ... {
    let data = serde_json::to_string(&data).expect("serialize issue");

    let mut request = Request::new(reqwest::Method::POST, url);
    *request.body_mut() = Some(data.into());

    self.inner
        .execute(request)
        ...
}

现在我想通过网络发送“x-www-form-urlencoded”数据,这应该改变这个函数如下:

fn send_data(data: NetworkData ...) -> ... {
    // How should I change this?????
    //let data = serde_json::to_string(&data).expect("serialize issue");

    let mut request = Request::new(reqwest::Method::POST, url);
    let content_type = HeaderValue::from_str(&format!("{}", "application/x-www-form-urlencoded",))
            .expect("Header value creation bug");
    request
        .headers_mut()
        .insert(header::CONTENT_TYPE, content_type);        
    *request.body_mut() = Some(data.into());

    self.inner
        .execute(request)
        ...
}

但是我应该如何组织我的“数据”来适应这幅图。

6rqinv9w

6rqinv9w1#

您很有可能以与JSON完全相同的方式使用serde_urlencoded crate。
我不知道你的<Data Structure>是什么样子的,因为你没有提供它,但是serde_urlencoded crate只支持原始类型,所以如果你有更花哨的东西,你必须提出自己的转换;x-www-form-urlencoded只是一组key=value对。无论如何,这里有一个工作示例:

use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize, Debug)]
pub struct NetworkData {
    id: String,
    status: String,
    data: u32,
}

fn main() {
    let data = NetworkData {
        id: "ID".into(),
        status: "Status".into(),
        data: 42,
    };
    let data = serde_urlencoded::to_string(&data).expect("serialize issue");

    println!("{}", data);
}

playground

jexiocij

jexiocij2#

如文档中所述,这已大大简化:

// This will POST a body of `foo=bar&baz=quux`
let params = [("foo", "bar"), ("baz", "quux")];
let client = reqwest::Client::new();
let res = client.post("http://httpbin.org/post")
    .form(&params)
    .send()
    .await?;

相关问题