POST 使用 httr 的请求失败,而 shell 请求有效

POST request with httr fails while shell request works

我正在尝试通过 POST 请求从 API 获取数据。该请求适用于直接 shell 命令:

system(sprintf('curl POST -k --tlsv1.2 -v "https://api-gateway.inpi.fr/services/apidiffusion/api/marques/search" -H "X-XSRF-TOKEN: %s" -H \'accept: application/xml\' -H "Content-Type: application/json" -H "Cookie: XSRF-TOKEN=%s; access_token=%s; session_token=%s"  -d \'%s\' > test.xml',token,token,access_token,refresh_token,json_request))

但是,出于多种原因,我想使用 httr。我使用以下代码:

test <- httr::POST(
  "https://api-gateway.inpi.fr/services/apidiffusion/api/marques/search",
  httr::set_config(config(ssl_verifypeer = 0L)),
  config = (add_headers(
    "X-XSRF-TOKEN" = token,
    "accept" = "application/xml",
    "Content-Type" = "application/json",
    "Cookie" = sprintf("XSRF-TOKEN=%s; access_token=%s; session_token=%s",token,access_token,refresh_token)
  ))
  ,set_cookies(`X-XSRF-TOKEN` = token,
               `XSRF-TOKEN` = token,
              access_token = access_token,
              session_token = refresh_token)
  ,body = json_request
)

但是这个 returns 403 禁止错误(my_token 是我使用的令牌):

$error
[1] "access_denied"

$error_description
[1] "Invalid CSRF Token '*my_token*' was found on the request parameter '_csrf' or header 'X-XSRF-TOKEN'.

似乎 httr 没有考虑我的 cookie,因为令牌在我创建的 test 对象中不同 :

> test2$cookies
               domain  flag path secure expiration       name                                value
1 api-gateway.inpi.fr FALSE    /  FALSE       <NA> XSRF-TOKEN *another_token*

有什么想法吗?很抱歉,出于明显的安全原因,我无法创建可重现的示例。

谢谢!

解决方案很奇怪。

我不得不摆脱 httr,我改用了 UNIX 系统命令,并且它适用于相同的请求。

  system(sprintf('curl POST -k --tlsv1.2 "https://api-gateway.inpi.fr/services/apidiffusion/api/marques/search" -H "X-XSRF-TOKEN: %s" -H \'accept: application/json\' -H "Content-Type: application/json" -H "Cookie: XSRF-TOKEN=%s; access_token=%s; session_token=%s"   -d \'%s\' > %s/res.json',tokens$xsrf_token,tokens$xsrf_token,tokens$access_token,tokens$refresh_token,json_request,tempdir()))

似乎 httr 试图自己处理 cookie,所以这可能就是导致我出现问题的原因。