【问题标题】:R How to make a POST request to MongoDBR如何向MongoDB发出POST请求
【发布时间】:2018-11-23 11:35:31
【问题描述】:

我目前正在处理来自在线数据库的数据。我通过 API 访问数据,这在我一次检索所有数据时起作用。但这会使我的系统变慢,所以我只想对过滤后的数据发出请求(直到现在我才提出)。这是获取整个数据集的方法:

#-------------------------------#
#          packages             #
#-------------------------------#
library(httr)
library(jsonlite)

#-------------------------------#
#         API requests          #
#-------------------------------#

##  get all data at once  ##
url <- "https://www.eter-project.com/api/3.0/HEIs/full"
raw_result <- GET(url)

#-------------------------------#
#       data processing         #
#-------------------------------#

# 'status_code' (if request worked) and 'content' (APIs answer) important
names(raw_result) 

# '200' tells us that server received request
raw_result$status_code 

# translate Unicode into text
this.raw.content <- rawToChar(raw_result$content) 

# transform json into workable format for R
mydata <- fromJSON(this.raw.content, flatten = TRUE) 

class(mydata)
dim(mydata)

根据文档 (https://www.eter-project.com/api/doc/#/),我需要使用 url https://www.eter-project.com/api/3.0/HEIs/query 的 POST 请求和嵌入在以下结构中的过滤器:

{
 "filter": {},
  "fieldIds": {}
}

我想过滤年份和国家/地区,以便仅获取我当前想要使用的数据。过滤器的结构是 { "BAS.REFYEAR.v": 2011, "BAS.COUNTRY.v": "AT"}.

有谁知道如何将其实现到 POST 请求中?

到目前为止,我做了一些绝望的尝试,将过滤器包含在 POST 请求中(例如raw_result <- POST(url, body = list({ "filter": {"BAS.REFYEAR.v" = 2011}}), encode = "json") 并玩弄了mongolitepackage,它甚至没有接近。

更新:过滤问题已解决。我使用了以下解决方案:

myquery <- '{
  "filter": {"BAS.REFYEAR.v": 2015, "BAS.COUNTRY.v": "LV"},
  "fieldIds": {},
  "searchTerms": []
  }'

url <- "https://www.eter-project.com/api/3.0/HEIs/query"

raw_result <- POST(url, body = myquery, content_type_json())

现在,我面临另一个问题:数据包含许多特殊字符,在 R 中无法正确显示(例如,数据集中的Alberta koledža 显示为Alberta koledžain R)。有没有办法解决这个问题,例如在请求调用中使用 UTF-8?

【问题讨论】:

  • 你试过httr::POST()吗?顺便说一句,CRAN 上有用于与 MongoDB 接口的特殊包。
  • 是的,我试过POST(url, _something_),还检查了很多讨论、博客文章、文档等。但我的问题是在技术上将过滤器实现到通话中。
  • edit您的问题包括您尝试过的内容以及您尝试的相关结果。顺便说一句,你读过这个吗:eter-project.com/#/info/api

标签: r json mongodb api post


【解决方案1】:

您可以尝试将所需的 JSON 构建为列表列表。但是,我发现显式提供 JSON 并手动添加内容类型更容易:

query <- '{
  "filter": { "BAS.REFYEAR.v": 2011,  "BAS.COUNTRY.v": "AT"},
  "fieldIds": {},
  "searchTerms": []
}'
url <- "https://www.eter-project.com/api/3.0/HEIs/query"
raw_result <- httr::POST(url = url, body = query, content_type_json())

在此之后,您可以像以前一样应用您的处理。

【讨论】:

  • 太棒了,这很好用。我仍然对名称有疑问,因为其中有许多特殊字符(例如,数据集中的 Alberta koledža 在 R 中显示为 Alberta koledža)。有没有办法解决这个问题,例如通过使用 UTF-8?
  • @huan 这看起来像是用 8 位编码解释的 koledža 的 UTF-8 表示,如 Latin-1。但请不要在已解决的问题中添加其他问题。
猜你喜欢
  • 1970-01-01
  • 2015-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多