我试图使用httr包请求数据。遵循这一格式:
args <- list(metrics = c(list(name = "Jobs.2018",as = "Jobs 2018")),
constraints = list(dimensionName ="Area",
map = list("Latah County ID" = c(16057))))
test <- POST(url =
"https://agnitio.emsicloud.com/emsi.us.demographics/2018.3",
add_headers(`authorization` = paste("bearer",token)),
add_headers(`content-type` ="application/json"),
body = toJSON(args,auto_unbox = TRUE),
verbose())我一直得到一个400 Bad Request错误与所有我已经查找和尝试。我是否需要在我找不到的论点中添加一些东西呢?
很抱歉,这不是一个可重复的例子
发布于 2018-10-04 12:57:38
我们将假设(这是一件坏事,但对于一个答案是必需的),您是通过发出一个先前的token请求(如链接的POST页面上所示)获得JSON令牌的,然后正确地将JSON令牌解码为token。
如果您正确地这样做了,那么下一个可能的可能是POST请求中格式错误的POST数据。
当我查看一个示例API调用时:
curl --request POST \
--url https://agnitio.emsicloud.com/emsi.us.industry/2018.3 \
--header 'authorization: bearer <access_token>' \
--header 'content-type: application/json' \
--data '{ "metrics": [ { "name": "Jobs.2017", "as":"2017 Jobs" }, { "name": "Establishments.2017" } ], "constraints": [ { "dimensionName": "Area", "map": { "Latah County, ID": ["16057"] } }, { "dimensionName": "Industry", "map": { "Full Service Restaurant s": ["722511"] } } ] }'该示例JSON看起来像打印得很好的这样:
{
"metrics": [
{
"name": "Jobs.2017",
"as": "2017 Jobs"
},
{
"name": "Establishments.2017"
}
],
"constraints": [
{
"dimensionName": "Area",
"map": {
"Latah County, ID": [
"16057"
]
}
},
{
"dimensionName": "Industry",
"map": {
"Full Service Restaurants": [
"722511"
]
}
}
]
}你的看起来是:
{
"metrics": {
"name": "Jobs.2018",
"as": "Jobs 2018"
},
"constraints": {
"dimensionName": "Area",
"map": {
"Latah County ID": 16057
}
}
}当它看起来更像这样的时候:
{
"metrics": [
{
"name": "Jobs.2018",
"as": "Jobs 2018"
}
],
"constraints": [
{
"dimensionName": "Area",
"map": {
"Latah County ID": [
"16057"
]
}
}
]
}为此,我们需要使用以下list结构:
list(
metrics = list(
list(
name = jsonlite::unbox("Jobs.2018"),
as = jsonlite::unbox("Jobs 2018")
)),
constraints = list(list(
dimensionName = jsonlite::unbox("Area"),
map = list("Latah County ID" = c("16057"))
))
) -> args特别要注意的是,API期望map ID JSON数据元素是字符,而不是整数/数字。
现在,我们可以这样做POST请求(为获得答案的可读性,因为它嵌入了注释):
httr::POST(
url = "https://agnitio.emsicloud.com/emsi.us.demographics/2018.3",
httr::add_headers(
`authorization` = sprintf("bearer %s", token)
),
encode = "json", # this lets' httr do the work for you
httr::content_type_json(), # easier than making a header yourself
body = args,
httr::verbose()
) -> res这应该可以工作,但是b/c --它是一个封闭的API,如果没有免费注册,我就不能测试它。
https://stackoverflow.com/questions/52636986
复制相似问题