使用RCurl postForm收集JSON数据

时间:2014-08-18 15:32:29

标签: r curl rcurl

我正在尝试使用RCurlBLS API中提取时间序列数据。

BLS提供以下用于命令行提取的示例代码:

curl -i -X POST -H 'Content-Type: application/json' 
     -d '{"seriesid":["LEU0254555900", "APU0000701111"],
        "startyear":"2002", "endyear":"2012"}' 
        http://api.bls.gov/publicAPI/v1/timeseries/data/ 

我还确认指定的文件(即系列ID)都存在,因为以下两者都产生一个JSON格式的对象:

require(RCurl)
bls.content_test1 <- getURLContent("http://api.bls.gov/publicAPI/v1/timeseries/data/LEU0254555900")
bls.content_test2 <- getURLContent("http://api.bls.gov/publicAPI/v1/timeseries/data/APU0000701111")

基于具有RCurl标记的各种帖子(特别是此post),我已将命令行脚本移植到以下代码块:

require(RJSONIO)

jsonbody <- toJSON(list("seriesid"=paste('"["CFU0000008000"', '[LEU0254555900"]"')
                        ,"startyear"="2012"
                        ,"endyear"="2013"))

httpheader <- c(Accept="application/json; charset=UTF-8",
                "Content-Type"="application/json")

bls.content <- postForm("http://api.bls.gov/publicAPI/v1/timeseries/data/"
                        ,.opts=list(httpheader=httpheader
                                    ,postfields=jsonbody))

哪个收益率:

[1] "{\"status\":\"REQUEST_FAILED\",\"responseTime\":0,\"message\":[\"Your request has failed, please check your input parameters and try your request again.\"],\"Results\":null}"
attr(,"Content-Type")
                              charset 
"application/json"            "UTF-8"

这对我的RCurl实施是否有问题,或者这似乎是BLS API的问题?

2 个答案:

答案 0 :(得分:2)

这是httr的一种方法:

library(httr)
library(jsonlite)

# Need unbox() to tell jsonlite() numbers are scalars, not vectors of length 1
body <- list(
  seriesid = c("CFU0000008000", "LEU0254555900"),
  startyear = unbox(2012),
  endyear = unbox(2013)
)

r <- POST("http://api.bls.gov/publicAPI/v1/timeseries/data/", body = body, encode = "json")
stop_for_status(r)

# Need to specify type since site returns incorrect type of text/plain
str(content(r, type = "application/json"))

答案 1 :(得分:1)

实际上,您创建json正文的方式存在问题。如果您执行cat(jsonbody),则使用您的版本

{
 "seriesid": "\"[\"CFU0000008000\" [LEU0254555900\"]\"",
"startyear": "2012",
"endyear": "2013"
}

其中有那些额外的转义和括号。这不正确。而是尝试

jsonbody <- toJSON(list("seriesid"=c("CFU0000008000", "LEU0254555900"),
                        startyear="2012",
                        endyear="2013"))

给出了

{
 "seriesid": [ "CFU0000008000", "LEU0254555900" ],
"startyear": "2012",
"endyear": "2013" 
}

这是有效的JSON。只需更改该部分并使用其余代码就可以获得REQUEST_SUCCEEDED消息。