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

查看:18
本文介绍了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屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆