簡體   English   中英

為管道工提供 Swagger 中 PUT 的示例正文

[英]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)
}

從 Swagger 測試這個例子效果很好: 使用給定示例在 Swagger 中測試 PUT 端點

兩個打印語句表明bodyreq$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 顯示的內容以確保它是相同的。

招搖輸入

使用 Postman: 郵遞員輸入

或者在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM