[英]Provide example body for PUT in Swagger for Plumber
考慮以下使用 Plumber (R API) 的 PUT 請求示例:
example_body <- list(
a=1,
b=2,
c=3
)
#* Example PUT endpoint
#* @serializer unboxedJSON list(na = NULL)
#* @param body:object
#* @put /my_example
function(req, body = example_body) {
print(body)
print(req$body$body)
result <- body$a + body$b + body$c
return(result)
}
兩個打印語句表明body
和req$body$body
的值相同。 但是,從其他任何地方(不是 Swagger)發送請求意味着正文僅作為req$body
訪問!
一個超級骯臟的 hack 是在 function 的頂部放置如下內容:
if (grepl(pattern = "/__docs__/|/__swagger__/|/openapi.json",x = req$HTTP_REFERER)) {
req$body <- req$body$body
}
但是,當您有很多端點時,這是不可取的。 那么,為了解決這個問題,如何在 Swagger 中使用該示例,同時還允許端點與包含正文的真實請求一起使用?
我認為您的路線目前的用途令人困惑。 如上所述,端點期望REQUEST主體由一個名為“body”的OBJECT組成(因此需要req$body$body
)。 如果您重命名了 function 參數,這可能會更明顯:
example_data <- list(
a=1,
b=2,
c=3
)
#* Example PUT endpoint
#* @serializer unboxedJSON list(na = NULL)
#* @param body:object
#* @put /my_example
function(req, data = example_data) {
print(body)
print(req$body$data)
result <- data$a + data$b + data$c
return(result)
}
Plumber 自動解析REQUEST主體,然后將名為 arguments 的值傳遞給 function。因此,如果您真正想要的是值 'a'、'b'、'c' 出現在(請求)主體中,您可以定義它如下:
#* Example PUT endpoint
#* @serializer unboxedJSON list(na = NULL)
#* @param a
#* @param b
#* @param c
#* @put /my_example
function(req, a = 1, b = 2, c = 3) {
print(list(a = a, b = b, c = c))
print(req$body)
result <- a + b + c
return(result)
}
否則,當您以非 Swagger 方式組成主體時,只需復制 Swagger 顯示的內容以確保它是相同的。
或者在 R
library(httr2)
example_body <- list(
data = list(
a=1,
b=2,
c=3
)
)
request("http://127.0.0.1:4280/my_example") |>
req_method("PUT") |>
req_body_json(
data = example_body
) |>
req_perform() |>
resp_body_json()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.