【问题标题】:Provide example body for PUT in Swagger for Plumber为 Plumber 的 Swagger 中的 PUT 提供示例正文
【发布时间】:2023-02-04 05:40:58
【问题描述】:

考虑以下使用 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 测试这个例子效果很好:

两个打印语句显示 bodyreq$body$body 的值相同。但是,从其他任何地方(不是 Swagger)发送请求意味着正文仅作为 req$body 访问!

一个超级肮脏的 hack 是在函数的顶部放置如下内容:

if (grepl(pattern = "/__docs__/|/__swagger__/|/openapi.json",x = req$HTTP_REFERER)) {
   req$body <- req$body$body
}

但是,当您有很多端点时,这是不可取的。那么,为了解决这个问题,如何在 Swagger 中使用该示例,同时允许端点与包含正文的真实请求一起使用?

【问题讨论】:

    标签: r swagger plumber


    【解决方案1】:

    我认为您的路线目前的用途令人困惑。如上所述,端点期望要求身体由一个单一的目的命名为“body”(因此需要 req$body$body)。如果重命名函数参数,这可能会更明显:

    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)
    }
    

    水管工自动解析要求body 然后将值作为命名参数传递给函数。因此,如果您真正想要的是(请求)正文中的值 '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()
    

    【讨论】:

      猜你喜欢
      • 2017-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-08
      • 1970-01-01
      • 2019-05-25
      • 2020-02-12
      • 1970-01-01
      相关资源
      最近更新 更多