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

Sending "application/x-www-form-urlencoded" data in place of JSON over network

我用来通过网络序列化的结构的定义

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)
        ...
}

但是我应该如何组织我的 "data" 以适应这张照片。

您很可能可以像使用 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