RPlumber API-以CSV而不是JSON的形式返回数据-在Mac上本地运行,但不能在ubuntu-16.04上运行 [英] RPlumber API - returning data as CSV instead of JSON - works locally on mac, but not on ubuntu-16.04
本文介绍了RPlumber API-以CSV而不是JSON的形式返回数据-在Mac上本地运行,但不能在ubuntu-16.04上运行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我们使用RPlber来托管API,我们的开发人员要求API端点以CSV格式而不是JSON格式提供数据。要处理此问题,我们有以下几点:
r_endpoints.R
#* @get /test-endpoint-1
testEndpoint <- function(res) {
mydata <- data.frame(a = c(1,2,3), b = c(3,4,5))
print('mydata')
print(mydata)
con <- textConnection("val","w")
print(paste0('con: ', con))
write.csv(x = mydata, con, row.names = FALSE)
close(con)
print('res and res.body')
print(res);
res$body <- paste(val, collapse="
")
print(res$body)
return(res)
}
#* @get /test-endpoint-2
testEndpoint2 <- function() {
mydata <- data.frame(a = c(1,2,3), b = c(3,4,5))
return(mydata)
}
run_api.r
library(plumber)
pr <- plumber::plumb("r_endpoints.R")
pr$run(host = "0.0.0.0", port = 8004)
test-endpoint-2
返回JSON格式的数据,而test-endpoint-1
返回CSV格式的数据。当这些端点在我的Mac上本地运行时,当我访问这些端点时,我收到以下正确的输出:
为了托管API,我们在Linode Ubuntu 16.04服务器上安装了R+库+PM2,并安装了所有(我认为是所有)依赖项。当我们尝试访问托管在服务器上的终结点时,我们收到:
以下是我添加到test-endpoint-1
以帮助调试的打印语句:
[1] "mydata"
a b
1 1 3
2 2 4
3 3 5
[1] "con: 3"
[1] "res and res.body"
<PlumberResponse>
Public:
body: NULL
clone: function (deep = FALSE)
headers: list
initialize: function (serializer = serializer_json())
removeCookie: function (name, path, http = FALSE, secure = FALSE, same_site = FALSE,
serializer: function (val, req, res, errorHandler)
setCookie: function (name, value, path, expiration = FALSE, http = FALSE,
setHeader: function (name, value)
status: 200
toResponse: function ()
[1] ""a","b"
1,3
2,4
3,5"
这些是正确的打印语句-与我们在本地得到的相同。由于某些原因,服务器不允许我们以本地计算机允许的方式以CSV格式返回,我不知道为什么会出现这种情况,也不知道如何修复它。
编辑
在我的本地计算机上更新plumber
库之后,我现在也在本地计算机上收到错误An exception occurred.
。在较新版本的PLUMER中,我用来将API端点输出转换为CSV文件的代码片段似乎是:
...
con <- textConnection("val","w")
write.csv(x = mydata, con, row.names = FALSE)
close(con)
res$body <- paste(val, collapse="
")
return(res)
不再起作用。
编辑%2
这是我近3年前关于如何将数据作为CSV返回的stackoverflow post。似乎不再起作用。编辑%3
使用@SerializeCSV确实有效,但当我到达终结点时,数据将以CSV格式下载到我的本地计算机上,而更好的做法是直接从API以CSV格式返回数据,而不是自动下载到CSV文件中...
推荐答案
或许可以从这里获得灵感,这里我将响应内容类型标头修改为文本/纯文本。我相信浏览器中应该显示文本/纯文本。
#* @get /json
#* @serializer unboxedJSON
function() {
dostuff()
}
#* @get /csv
#* @serializer csv list(type="text/plain; charset=UTF-8")
function() {
dostuff()
}
dostuff <- function() {
mtcars
}
这篇关于RPlumber API-以CSV而不是JSON的形式返回数据-在Mac上本地运行,但不能在ubuntu-16.04上运行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文