【问题标题】:Rocket - handle untyped json body with Rocket and okapiRocket - 使用 Rocket 和 okapi 处理无类型的 json 主体
【发布时间】:2021-09-19 13:06:31
【问题描述】:

我正在尝试创建一些简单的 REST API,它将接收一些无类型的 json 数据以进行进一步处理,但我真的不知道结构。我到目前为止是这样的:

#[openapi]
#[post("/api/json-data", format = "json", data = "<data>")]
fn send_data(data: Json<String>) -> Json<ApiResponse> {

  Json(DataProcessor::process(data.into_inner()))
}

稍后我将使用 serde 来获取无类型的 JSON 值

pub fn process(data: String) {
  let json: Value = serde_json::from_str(data.as_str()).unwrap();
}

问题是,当我使用一些 JSON 数据调用此端点时,我收到以下错误:

Couldn't parse JSON body: Error("invalid type: map, expected a string"

只做fn send_data(data: String) 也行不通,然后#[openapi] 抱怨

the trait `OpenApiFromData<'_>` is not implemented for `std::string::String`

使用Rocketokapi 处理无类型JSON 数据的正确方法是什么?

非常感谢任何帮助。

【问题讨论】:

    标签: json rust serde rust-rocket


    【解决方案1】:

    我想我可以回答我自己的问题,以防万一其他人遇到问题。

    请求正文的数据类型需要为HashMap&lt;&amp;str, serde_json::Value&gt;

    所以 API 定义应该如下所示:

    #[openapi]
    #[post("/api/json-data", format = "json", data = "<data>")]
    fn send_data(data: Json<HashMap<&str, Value>>) -> Json<ApiResponse> {
    
      Json(DataProcessor::process(data.into_inner()))
    }
    

    这对于错误是完全有意义的

    Couldn't parse JSON body: Error("invalid type: map, expected a string")
    

    【讨论】:

      猜你喜欢
      • 2021-06-05
      • 2021-12-26
      • 2018-02-11
      • 2021-02-26
      • 2021-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多