postman Serde和Reqwest给出了怪异的身体[关闭]

jdg4fx2g  于 2023-10-18  发布在  Postman
关注(0)|答案(1)|浏览(172)

已关闭此问题为not reproducible or was caused by typos。它目前不接受回答。

此问题是由打印错误或无法再重现的问题引起的。虽然类似的问题可能是on-topic在这里,这一个是解决的方式不太可能帮助未来的读者。
上个月关门了。
Improve this question
我正在尝试用serde把一个对象转换成json,这样我就可以把它发布到reqwest了。然而,当我做我认为我必须做的事情时,它似乎并没有变成正确的json。
我有一个结构Order:

#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct Order {
    #[serde(rename = "Uic")]
    uic: i64,
    #[serde(rename = "BuySell")]
    buy_sell: String,
    #[serde(rename = "AssetType")]
    asset_type: String,
    #[serde(rename = "Amount")]
    amount: i64,
    #[serde(rename = "OrderType")]
    order_type: String,
    #[serde(rename = "OrderRelation")]
    order_relation: String,
    #[serde(rename = "ManualOrder")]
    manual_order: bool,
    #[serde(rename = "AccountKey")]
    account_key: String,
}

我序列化并尝试发布到一个API。当我尝试将其发送到API时,我可以在API上看到(实时API返回无效的主体,因此我使用Postman Mock Server来测试API调用)正在发送的主体

{
  {
key: "{"Uic":16,"BuySell":"Buy","AssetType":"FxSpot","Amount":1000,"OrderType":"Market","OrderRelation":"StandAlone","ManualOrder":false,"AccountKey":"GfCSX|cXT0uDkDakbet8NQ" 
value: "="}"
  }
}

我是这样发送的:

let body = serde_json::to_string(&order).unwrap();
let order_id = client
        .post(url)
        .headers(headers)
        .bearer_auth(access_token)
        .body(body)
        .send()
        .await?
        .text()
        //.json::<OrderPlacementResponse>()
        .await?
        ;  

    let mut file = std::fs::File::create("order.json")?;
    serde_json::to_writer_pretty(&mut file, &order)?;

最后,我保存它到一个文件,它看起来像:

{
  "Uic": 16,
  "BuySell": "Buy",
  "AssetType": "FxSpot",
  "Amount": 1000,
  "OrderType": "Market",
  "OrderRelation": "StandAlone",
  "ManualOrder": false,
  "AccountKey": "GfCSX|cXT0uDkDakbet8NQ=="
}

看上去就应该是这样。如果我使用Postman将这个body发送到URL,我会得到正确的响应。所以错误肯定是在我如何制作身体上。我就是不知道怎么补救。

k2arahey

k2arahey1#

order变量真的是Order吗?content-type: application/json是你使用的头文件的一部分吗?
我的第一个猜测是,你实际上正确地序列化了主体,但你没有告诉另一端它是json,所以Postman把整个主体放在它自己发明的外部json中。
尝试在代码中的一些有趣的地方添加dbg!(...),以了解它的更多功能,如下所示:

let body = serde_json::to_string(dbg!(&order)).unwrap();
let order_id = client
        .post(url)
        .headers(dbg!(headers))
        .bearer_auth(access_token)
        .body(dbg!(body))
        .send()
        .await?
        .text()
        //.json::<OrderPlacementResponse>()
        .await?
        ;

现在你可以看到body是否看起来像它应该的那样,以及header是否包含正确的内容类型。

相关问题