【问题标题】:JSON Body in POST Using the Rust reqwest CratePOST 中的 JSON 正文使用 Rust reqwest Crate
【发布时间】:2021-03-11 16:26:28
【问题描述】:

我正在尝试使用 Rust crate reqwest 来实现这个 curl 调用:

curl -u [USERNAME]:[PASSWORD] -H "Content-Type: application/json" -d @content.json [WEBSITE]

文件content.json顾名思义编码一个JSON对象。

我的代码如下所示:

fn get_response() -> Result<String, Box<dyn Error>> {
    let content = std::fs::read_to_string("content.json").unwrap();
    let client = reqwest::blocking::Client::new();
    client
        .post([WEBSITE])
        .basic_auth([USERNAME], Some([PASSWORD]))
        .json(&content)
        .send()?
        .text()?

虽然curl 命令有效,但在运行 Rust 代码时,我在响应中收到“格式错误的请求负载”错误消息。不幸的是,我无法控制该网站,因此无法在那里进行调试。

我的问题是:我做错了什么吗?如果没有明显的问题,我应该尝试哪些选项(例如,附加标题)? (当然,我已经尝试了一些东西,但没有任何效果)

【问题讨论】:

    标签: json rust http-post reqwest


    【解决方案1】:

    the documentation for .json() 我们可以看到它需要一个任意的 serde 可序列化类型。这表明它正在根据给定值创建 JSON 文本。因此,您正在向服务器发送一个包含 JSON 的引用 JSON 的字符串,这可能不是它所期望的。

    我没有使用过reqwest,但是对于您使用 JSON 字符串的用例,您可以使用 .body() 来提供字符串,并使用 .header() 来指定 JSON 内容类型。

    【讨论】:

    • 谢谢!你说的对!我刚刚自己找到了答案(我未能及时重新加载页面以查看您的答案)。但是,我确实尝试使用.body() 并将内容类型标头设置为application/json,但它仍然不起作用。因此,提供 serde 可序列化类型是唯一对我有用的解决方案。
    • 注意.json()会自动插入Content-Type: application/json标头
    【解决方案2】:

    事实证明,当 json 参数只是 JSON 形式的字符串(切片)时,函数 fn json&lt;T: Serialize&gt;(&amp;mut self, json: &amp;T) -&gt; &amp;mut RequestBuilder 无法按预期工作。 当传入包含与 JSON 字符串完全相同的信息的 struct 时,代码可以正常工作。

    【讨论】:

      猜你喜欢
      • 2020-08-02
      • 1970-01-01
      • 1970-01-01
      • 2020-12-31
      • 1970-01-01
      • 2017-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多