Отправка данных application/x-www-form-urlencoded вместо JSON по сети

Определение структуры, которую я использую для сериализации по сети

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

Но как мне организовать свои «данные», чтобы вписаться в эту картину.


person ravi    schedule 10.09.2019    source источник


Ответы (1)


Скорее всего, вы можете использовать ящик serde_urlencoded точно так же, как и JSON.

Я понятия не имею, как выглядит ваш <Data Structure>, поскольку вы его не предоставили, но крейт serde_urlencoded поддерживает только примитивные типы, поэтому, если у вас есть более причудливые вещи, вам придется придумать собственное преобразование; 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);
}

игровая площадка

person Alex    schedule 10.09.2019
comment
Не могли бы вы привести простой пример... онлайн очень мало. - person ravi; 10.09.2019
comment
Я понятия не имею, как выглядит ваш <Data Structure>, поскольку вы его не предоставили, но ящик serde_urlencoded поддерживает только примитивные типы, поэтому, если у вас есть более причудливые вещи, вам придется придумать собственное преобразование; x-www-form-urlencoded — это просто набор из key=value пар. В любом случае, вот рабочий пример: play.rust-lang.org/ - person Alex; 10.09.2019