在R Plumber序列化器之间切换

问题描述

#* @get /json
#* @serializer unBoxedJSON
function() {
  return(iris)
}

#* @get /csv
#* @serializer csv list(type="text/plain; charset=UTF-8")
function() {
  return(iris)
}

#* @param type csv or json
#* @get /data
function(type = 'csv') {
  if (type == 'cvs') {
    #* @serializer csv list(type="text/plain; charset=UTF-8")
    return(iris)
  } else {
    #* @serializer unBoxedJSON
    return(iris)
  }
}

每个端点上方的前2个端点都可以正常工作,但是第3个端点无法正常工作,因为#* @serializer unBoxedJSON不能出现在功能范围之内。但是,如果我能以某种方式在返回之前处理序列化的单个端点,那就太好了。 plumber具有plumber::serializer_csvplumber::serializer_unBoxed_json()及其所有序列化器作为函数,但是我不确定如何在端点函数中使用它们(或者甚至可以)

谢谢!

解决方法

您可以创建自定义序列化程序,根据响应对象更改序列化格式。这是一个例子。在这种情况下,我将一个属性附加到我的响应中,该属性提供了我想要的格式:

library(plumber)

#* @apiTitle Example Plumber API with Serializer to switch formats using object
#* attributes

serializer_switch <- function() {
  function(val,req,res,errorHandler) {
    tryCatch({
      format <- attr(val,"serialize_format")
      if (is.null(format) || format  == "json") {
        type <- "application/json"
        sfn <- jsonlite::toJSON
      } else if (format == "csv") {
        type <- "text/csv; charset=UTF-8"
        sfn <- readr::format_csv
      } else if (format == "rds") {
        type <- "application/rds"
        sfn <- function(x) base::serialize(x,NULL)
      }
      val <- sfn(val)
      res$setHeader("Content-Type",type)
      res$body <- val
      res$toResponse()
    },error = function(err) {
      errorHandler(req,err)
    })
  }
}

register_serializer("switch",serializer_switch)

#* Return a data frame of random values
#* @param n size of data frame
#* @param format one of "json","csv",or "rds"
#* @serializer switch
#* @get /random_df
function(n = 10,format = "json") {
  out <- data.frame(value = rnorm(n))
  attr(out,"serialize_format") <- format
  out
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...