Rocket - 使用 Rocket 和 okapi 处理未类型 json 主体
Rocket - handle untyped json body with Rocket and okapi
我正在尝试创建一些简单的 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`
使用 Rocket
和 okapi
处理未类型化 JSON 数据的正确方法是什么?
非常感谢任何帮助。
我想我可以回答我自己的问题,以防其他人遇到这个问题。
请求体的数据类型需要是HashMap<&str, serde_json::Value>
所以 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")
我正在尝试创建一些简单的 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`
使用 Rocket
和 okapi
处理未类型化 JSON 数据的正确方法是什么?
非常感谢任何帮助。
我想我可以回答我自己的问题,以防其他人遇到这个问题。
请求体的数据类型需要是HashMap<&str, serde_json::Value>
所以 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")