JSON的R httr POST返回状态400
我正在开发一些函数,从丹麦获取数据,以及它们的数据。他们对JSON调用进行了测试,我知道我在函数dst_get_data works中解析为JSON的基本_请求,正如我在控制台中测试的那样 我得到一个“status 400”错误和一条错误消息,上面说我应该“在发布时提供对象” 下面的代码应该是可复制的示例。这是我遇到的第三个功能(dst_get_data)JSON的R httr POST返回状态400,json,r,httr,rjsonio,jsonlite,Json,R,Httr,Rjsonio,Jsonlite,我正在开发一些函数,从丹麦获取数据,以及它们的数据。他们对JSON调用进行了测试,我知道我在函数dst_get_data works中解析为JSON的基本_请求,正如我在控制台中测试的那样 我得到一个“status 400”错误和一条错误消息,上面说我应该“在发布时提供对象” 下面的代码应该是可复制的示例。这是我遇到的第三个功能(dst_get_data) dst_meta <- function(table, ..., lang = "en"){ require(jsonlite)
dst_meta <- function(table, ..., lang = "en"){
require(jsonlite)
require(httr)
dkstat_url <- "http://api.statbank.dk/v1/tableinfo"
params <- list("lang" = lang,
"table" = table,
"format" = "JSON")
meta <- POST(url=dkstat_url, body=params, multipart=FALSE)
meta <- jsonlite::fromJSON(txt=content(meta, as="text"),simplifyDataFrame=TRUE)
#meta <- RJSONIO::fromJSON(content=content(meta),asText=TRUE, simplify=TRUE, simplifyWithNames=TRUE)
return(meta)
}
dst_meta_parse <- function(meta, lang){
basics_names <- c("id", "text", "description",
"unit", "updated", "footnote")
basics <- meta[names(meta) %in% basics_names]
variables <- meta[["variables"]][,c("id", "text")]
values <- meta[["variables"]][,"values"]
names(values) <- variables$id
if(lang == "en"){
test <- grepl(pattern="Tid", names(values))
if(sum(test) > 0){
values$Tid$id <- sub(pattern="Q", replacement="K", x=values$Tid$id)
}
}
## Create basic_request for the data_post file
basic_request <- vector(mode="list", length=length(variables$id))
for(variable in 1:length(variables$id)){
var_name <- variables$id[variable]
if(var_name == "Tid"){
basic_request[[variable]] <- list("code" = var_name,
"values" = as.character(values[[var_name]]$id[length(values[[var_name]]$id)]))
} else {
basic_request[[variable]] <- list("code" = var_name,
"values" = as.character(values[[var_name]]$id[1]))
}
}
return(list("basics" = basics, "variables" = variables, "values" = values, "basic_request" = basic_request))
}
dst_get_data <- function(request, table,..., lang = "en", format = "CSV", value_presentation = "Default"){
require(httr)
require(jsonlite)
dst_url <- "http://api.statbank.dk/v1/data"
final_request <- list("table" = table,
"lang" = lang,
"format" = format,
"valuePresentation" = value_presentation,
"variables" = request)
final_request <- jsonlite::toJSON(x=final_request, .escapeEscapes=TRUE, asIs=TRUE)
print(validate(final_request))
data <- POST(url=dst_url, body=final_request, multipart=FALSE)
return(data)
}
test <- dst_meta(table="folk1")
test2 <- dst_meta_parse(meta = test, lang = "en")
test3 <- dst_get_data(request = test2$basic_request, table = "folk1", format="JSON")
#test3 <- dst_get_data(request = test2$basic_request, table = "folk1", format="JSON")
dst_meta当我将dst_get_data
更改为:
dst_get_data <- function(request, table, ..., lang = "en",
format = "CSV", value_presentation = "Default") {
require(httr)
require(jsonlite)
dst_url <- "http://api.statbank.dk/v1/data"
final_request <- list("table" = table,
"lang" = lang,
"format" = format,
"valuePresentation" = value_presentation)
data <- POST(url=dst_url, body=final_request, multipart=FALSE)
return(data)
}
我认为这既是对JSONSTAT
的需要,也是POST
将为您自动执行JSON
转换的事实。您需要JSONSTAT
的原因是,当您从弹出窗口(控制台中)选择数据时可用的“格式”是:
PX
CSV
XLSX
HTML
JSONSTAT
DSTML
巴布亚新几内亚
大部分
阿雷莫斯
SDMXCOMPACT
SDMX通用
简单的ol'JSON
不是选项之一。您是否有计划将此代码作为一个包公开?@Thomas是的,我已经考虑过了。但我昨天才开始,所以不是现在的形式。这是我的第一个软件包,所以最初只是在github上(我只需要赶上一些介绍材料)。很酷。如果您需要帮助,请告诉我(我作为leeper在Github上)。我想可能会有人对这样的包裹感兴趣。谢谢!我会让你不断更新。我想知道为什么我的帖子不能使用JSON?!在我看来,@hadley正在这里做这件事。谢谢你的指点!我用JSONSTAT
的原因更新了答案。自动转换为JSON可能是最近添加的(因此与Hadley的示例不同)。
test3 <- dst_get_data(request = test2$basic_request,
table = "folk1", format="JSONSTAT")
Response [http://api.statbank.dk/v1/data]
Status: 200
Content-type: text/json
{"dataset":{"dimension":{"Tid":{"label":"time","category":{"index":{"2014K2":0},"label":{"2014K2":"2014Q2"}}},"id":["Tid"],"size":[1],"role":{"time":["Tid"]}},"label":"Population at the first day of the quarter by time","source":"Statistics Denmark","updated":"2014-05-17T04:10:00Z","value":[5634437],"status":["a"]}}
<select id="format" name="format"><option value="PX">PX</option>
<option selected="selected" value="CSV">CSV</option>
<option value="XLSX">XLSX</option>
<option value="HTML">HTML</option>
<option value="JSONSTAT">JSONSTAT</option>
<option value="DSTML">DSTML</option>
<option value="PNG">PNG</option>
<option value="BULK">BULK</option>
<option value="AREMOS">AREMOS</option>
<option value="SDMXCOMPACT">SDMXCOMPACT</option>
<option value="SDMXGENERIC">SDMXGENERIC</option>
</select>