我认为这是R的水管工库的一个很好的快速演示,但主要是我很难以csv格式提供数据
我正在使用R的水管工包来托管我的一些体育数据的API端点。目前,我有一些数据,抓取总冠军的MLB棒球队,我试图发球。使用水管工,我设置了以下两个脚本:
setupAPI.R:使用两个GET端点设置API:
library(plumber)
library(jsonlite)
# load in some test sports data to host
mydata = structure(list(Team = structure(c(8L, 20L, 7L, 28L, 2L, 30L,
23L, 1L, 6L, 19L), .Label = c("Angels", "Astros", "Athletics",
"Blue Jays", "Braves", "Brewers", "Cardinals", "Cubs", "Diamondbacks",
"Dodgers", "Giants", "Indians", "Mariners", "Marlins", "Mets",
"Nationals", "Orioles", "Padres", "Phillies", "Pirates", "Rangers",
"Rays", "Red Sox", "Reds", "Rockies", "Royals", "Tigers", "Twins",
"White Sox", "Yankees"), class = "factor"), GamesPlayed = c(162L,
162L, 162L, 162L, 162L, 162L, 162L, 162L, 162L, 162L), CurrentWins = c(92L,
75L, 83L, 85L, 101L, 91L, 93L, 80L, 86L, 66L)), .Names = c("Team",
"GamesPlayed", "CurrentWins"), row.names = c(NA, 10L), class = "data.frame")
# create a GET request for shareprices (in JSON format)
#* @get /shareprices_json
getSPs <- function(){
return(toJSON(mydata))
}
# create a GET request for MLB shareprices (in CSV format)
#* @get /shareprices_csv
csvSPs <- function(){
return(mydata)
}
# run both functions (i think needed for the endpoints to work)
getSPs()
csvSPs()RunAPI.R:plumbssetupAPI.R,获取本地托管的端点
library(plumber)
r <- plumb("setupAPI.R")
r$run(port=8000)。。。
在我的控制台中运行RunAPI.R代码之后,当我到达端点时,我的csv端点显然是返回一个JSON对象,而我的json端点似乎奇怪地返回了一个长度为1的JSON,其中一个字符串中的JSON作为返回的JSON中的唯一元素。
简而言之,我现在可以看到,我应该只返回dataframe,而不是toJSON( dataframe),才能让端点主机JSON格式化数据,但是我仍然不知道如何以CSV格式提供这些数据。这在水管工中有可能吗?在setupAPI.R中的函数中,返回语句应该是什么样的呢?任何帮助都将不胜感激!
发布于 2018-03-07 15:27:17
在这里你需要两个技巧:
res$body来指定响应的主体。可以将这两种想法结合起来创建一个端点,如下所示:
#' @get /data.csv
function(res) {
con <- textConnection("val","w")
write.csv(iris, con)
close(con)
res$body <- paste(val, collapse="\n")
res
}请注意,水管工免费为您做一些好事,比如为您的JSON响应设置适当的HTTP头。如果您是自己发送响应,那么您就需要自己完成所有这些任务,因此您需要确保设置适当的头来指导API客户端如何解释这个响应。
发布于 2018-04-11 11:37:12
只要张贴这个答案,如果帮助任何人!
Jeff的响应非常好,但是当您必须返回一个大CSV文件时,它会变得非常慢。我被一个22 MB的文件卡住了。
如果您以前在磁盘上编写CSV,一个更快的解决方案是使用include_file函数(docs 这里):
例如:
#* @get /iris_csv
getIrisCsv <- function(req, res) {
filename <- file.path(tempdir(), "iris.csv")
write.csv(iris, filename, row.names = FALSE)
include_file(filename, res, "text/csv")
}因此,这取决于您的用例:
include_file解决方案希望能帮上忙!
https://stackoverflow.com/questions/49141217
复制相似问题