POST 请求使用 Rust reqwest 库时的 JSON Body

8

我正在尝试使用Rust库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代码时,响应中会出现“请求有效载荷格式不正确”的错误消息。不幸的是,我无法对网站进行调试,因此无法解决问题。
我的问题是:我是否做错了明显的事情?如果没有明显的问题,那有哪些选项(例如添加头文件)可以尝试? (当然,我已经尝试了一些东西,但没有任何效果)
2个回答

9
.json()的文档中,我们可以看到它期望一个任意的serde可序列化类型。这表明它正在从给定值创建JSON文本。所以你发送的是包含JSON的JSON-引用字符串到服务器,这可能不是它所期望的。
我没有使用过reqwest,但是看起来对于您这个使用案例,您应该使用.body()提供字符串并使用.header()指定JSON Content-Type。

1
谢谢!你说得对!我刚刚自己找到了答案(我没能及时刷新页面看到你的回答)。 然而,我确实尝试使用.body()并将内容类型标头设置为application/json,但仍然无法正常工作。因此,提供一个可序列化的serde类型是我唯一有效的解决方案。 - THLO
4
请注意,.json() 方法会自动插入 Content-Type:application/json 标头。 - BallpointBen

0
事实证明,当json参数仅为JSON格式的字符串(切片)时,函数fn json<T: Serialize>(&mut self, json: &T) -> &mut RequestBuilder无法按预期工作。当传递一个包含与JSON字符串完全相同信息的struct时,代码可以正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接