我目前正在使用在线数据库中的数据。我通过API访问数据,该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")
并尝试使用mongolite
软件包,该软件包甚至还没有结束。
更新:过滤问题已解决。我使用以下解决方案:
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?
答案 0 :(得分: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())
此后,您可以像以前一样应用处理。