"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 您指定的错误。
您可以通过以下任一方法解决此问题:
- 使用 Postman 的 POST 方法调用 API,或
- 将
@get /predict/values
添加到您的预测函数。
我正在使用 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 您指定的错误。
您可以通过以下任一方法解决此问题:
- 使用 Postman 的 POST 方法调用 API,或
- 将
@get /predict/values
添加到您的预测函数。