首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用HTTR发布请求

使用HTTR发布请求
EN

Stack Overflow用户
提问于 2018-10-03 23:29:21
回答 1查看 2.5K关注 0票数 1

我试图使用httr包请求数据。遵循这一格式:

代码语言:javascript
复制
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错误与所有我已经查找和尝试。我是否需要在我找不到的论点中添加一些东西呢?

很抱歉,这不是一个可重复的例子

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-04 12:57:38

我们将假设(这是一件坏事,但对于一个答案是必需的),您是通过发出一个先前的token请求(如链接的POST页面上所示)获得JSON令牌的,然后正确地将JSON令牌解码为token

如果您正确地这样做了,那么下一个可能的可能是POST请求中格式错误的POST数据。

当我查看一个示例API调用时:

代码语言:javascript
复制
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看起来像打印得很好的这样:

代码语言:javascript
复制
{
  "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"
        ]
      }
    }
  ]
}

你的看起来是:

代码语言:javascript
复制
{
  "metrics": {
    "name": "Jobs.2018",
    "as": "Jobs 2018"
  },
  "constraints": {
    "dimensionName": "Area",
    "map": {
      "Latah County ID": 16057
    }
  }
}

当它看起来更像这样的时候:

代码语言:javascript
复制
{
  "metrics": [
    {
      "name": "Jobs.2018",
      "as": "Jobs 2018"
    }
  ],
  "constraints": [
    {
      "dimensionName": "Area",
      "map": {
        "Latah County ID": [
          "16057"
        ]
      }
    }
  ]
}

为此,我们需要使用以下list结构:

代码语言:javascript
复制
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请求(为获得答案的可读性,因为它嵌入了注释):

代码语言:javascript
复制
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,如果没有免费注册,我就不能测试它。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52636986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档