带有httr的POST请求后的无效内容类型

时间:2018-09-29 14:43:26

标签: r api oauth-2.0 httr

我正在尝试使用可从法国公共就业服务局(PôleEmploi)获得的名为“ Offres d'emploi v2”(职位空缺)的API。该API的描述为here。在here中描述的过程中,使用API​​需要令牌以及通过OAuth v2进行的身份验证。

我正在使用R 3.5.0和httr 1.3.1。首先,我指定请求正文。 eeideesec是我注册时由PôleEmploi提供的标识符和密钥。

require(jsonlite)
require(httr)

request_body <- list(
   grant_type = "client_credentials",
   client_id = eeid,
   client_secret = eesec,
   scope = paste(
      "api_offresdemploiv2",
      "o2dsoffre",
      paste0("application_",eeid,"%20api_offresdemploiv2"), sep = " "))

然后,我运行POST请求:

result_auth <- POST(
    "https://entreprise.pole-emploi.fr/connexion/oauth2/access_token",
    realm = "/partenaire",
    body = request_body,
    add_headers('Content-Type'='application/x-www-form-urlencoded')
    )
result_auth
content(result_auth)

返回有关内容类型的错误:

> result_auth
Response [https://entreprise.pole-emploi.fr/connexion/oauth2/access_token]
  Date: 2018-09-29 14:33
  Status: 400
  Content-Type: application/json; charset=UTF-8
  Size: 70 B
> content(result_auth)
$error
[1] "invalid_request"

$error_description
[1] "Invalid Content Type"

我也尝试将add_headers('Content-Type'='application/x-www-form-urlencoded')行替换为content_type("application/x-www-form-urlencoded"),但收到相同的错误消息。

我在这里显然做错了什么,但是呢?谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

这是@hrbrmstr发表的评论之后的答案。非常感谢他。

应该使用encode = "form"函数中的POST选项,而不是将内容类型指定为标题。

请注意,eeideesec是PôleEmploi在注册时提供的标识符和密钥。完整的脚本如下所示。

require(jsonlite)
require(httr)

request_body <- list(
    grant_type = "client_credentials",
    client_id = eeid,
    client_secret = eesec,
    scope = paste(
"api_offresdemploiv2",
"o2dsoffre",
paste0("application_",eeid), sep = " "))

result_auth <- POST(
    "https://entreprise.pole-emploi.fr/connexion/oauth2/access_token",
    query = list(realm = "/partenaire"),
    body = request_body,
    encode = "form"
    )