"Method Not Allowed" R 管道工错误 API

"Method Not Allowed" Error in R Plumber API

我正在使用 plumber 包为随机森林模型部署创建 API。

但是,我总是得到以下错误,这可能是关于数据加载的:

"error": "405 - Method Not Allowed"

下面,我附上了一个可重现的代码示例和一个更简单的模型。错误是一样的。

library(plumber)
library(tidyverse)
library(jsonlite)
library(plumber)

set.seed(1234)
df <- tibble(x1 = rnorm(10),
             x2 = rnorm(10),
             epsilon = rnorm(10, mean = 0, sd = 1)) %>% 
  mutate(y = x1 + 3*x2 + epsilon)%>% 
  select(y, x1, x2)

lm_model <- caret::train(y ~.,
                         data = df,
                         method = "lm")

#* Health Check - Is the API running?
#* @get /health-check
status <- function() {
  list(status = "All Good!",
       time = Sys.time())
}

#* Log some information about the incoming request
#* @filter logger
function(req){
  cat(as.character(Sys.time()), "-",
      req$REQUEST_METHOD, req$PATH_INFO, "-",
      req$HTTP_USER_AGENT, "@", req$REMOTE_ADDR, "\n")
  
  forward()
}
#> function(req){
#>   cat(as.character(Sys.time()), "-",
#>       req$REQUEST_METHOD, req$PATH_INFO, "-",
#>       req$HTTP_USER_AGENT, "@", req$REMOTE_ADDR, "\n")
#>   
#>   forward()
#> }

#* Predict y
#* @filter /predict
function(req, res){
  if(grepl("predict", req$PATH_INFO)){
    req$predict_data <- tryCatch(jsonlite::fromJSON(req$postBody) %>% 
                                   as.data.frame(), 
                                 error = function(x){
                                   return(NULL)
                                 })
    
    if(is.null(req$predict_data)){
      res$status <- 400
      return(
        list(error = "No JSON file is found in the request")
      )
    }
    req$predicted_values <- predict(lm_model, req$predict_data)
  }
  forward()
}
#> function(req, res){
#>   if(grepl("predict", req$PATH_INFO)){
#>     req$predict_data <- tryCatch(jsonlite::fromJSON(req$postBody) %>% 
#>                                    as.data.frame(), 
#>                                  error = function(x){
#>                                    return(NULL)
#>                                  })
#>     
#>     if(is.null(req$predict_data)){
#>       res$status <- 400
#>       return(
#>         list(error = "No JSON file is found in the request")
#>       )
#>     }
#>     req$predicted_values <- predict(lm_model, req$predict_data)
#>   }
#>   forward()
#> }


#* Predict y for given data
#* @post /predict/values
function(req){
  y <- as.numeric(req$predicted_values)
  return(y)
  
}
#> function(req){
#>   y <- as.numeric(req$predicted_values)
#>   return(y)
#>   
#> }

我通过 Postman 使用 API。我以 JSON 格式发送我的请求,您可以在下面找到一个示例。我尝试更改格式,但没有用。 API 在我不提交任何数据时有效。健康检查 API 也有效。

[
    {
        "x1" : 3,
        "x2" : 5
    }
]

可能是什么问题?我该如何解决?

非常感谢。

根据 Plumber’s changelog,从 Plumber 1.1.0 开始:

[the] experimental option plumber.methodNotAllowed […] (which is enabled by default) allows for a status of 405 to be returned if an invalid method is used when requesting a valid route.

我看到您刚刚将 @post 方法添加到 /predict/value 端点。您很可能正在使用 Postmann 的 GET 方法调用 API。这将 return 您指定的错误。

您可以通过以下任一方法解决此问题:

  1. 使用 Postman 的 POST 方法调用 API,或
  2. @get /predict/values 添加到您的预测函数。