【问题标题】:curl runs fine in the terminal, getting 419 error with httrcurl 在终端中运行良好,使用 httr 出现 419 错误
【发布时间】:2021-07-25 00:14:58
【问题描述】:

我有一个 curl 在终端中运行良好,会产生响应。结尾是:

--data-raw 'field1=123456&_token=mytoken'
--compressed

我的data 列表如下:

data = list(
  `field1` = '123456',
  `_token` = 'mytoken'
)

然后我对 POST 进行以下调用:

httr::POST(url = 'url', 
       httr::add_headers(.headers=headers), 
       httr::set_cookies(.cookies=cookies), 
       body = data
       #,encode = 'raw'
       )

卷曲中的raw 是什么意思--data-raw?这是否意味着我会设置encode='raw'?我已经尝试了我能想到的encode 的每一次迭代。

当我尝试在 R 中运行时,我得到:

Status: 419
Content-Type: application/json

如果我转身在终端中运行原始 curl,一切正常。

关于我可能指定不正确的任何想法?


我使用了 httpreq.com 并尝试了来自终端的工作 curl 和来自 R 的改编 httr 代码(用 httpreq.com 记录端点替换 url)。我注意到两个不同之处:

  1. 首先,R 的记录缺少cookies = c() 中定义的一个 cookie 参数。
  2. 其次,“User-Agent”不同。对于终端,它记录为"libcurl\/7.64.1 r-curl\/4.3 httr\/1.4.2"。对于 R 脚本,它记录为"Mozilla\/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/....。这是我在headers = c(User-Agent="...") 中指定的,因为这是我在原始 curl 中找到的。我需要更换 R 的代理吗?

【问题讨论】:

  • --data-raw 与 httr 的 encode="form" 相同。试试看。
  • 谢谢。这让我很困惑。不幸的是,encode="form" 产生了相同的结果。
  • A 419 可能意味着“身份验证超时”因此您的标头或 cookie 可能存在问题。如果没有 API 端点的文档,这真的是不可能的。
  • 好的,感谢您的考虑。我对超时感到困惑,因为我可以在 httr 中失败并转身并在终端中使用原始 curl 成功。
  • 那么,您使用的只有这两个 CURL 参数吗?此外,一些端点屏幕基于用户代理。也不清楚您是如何格式化标题或 cookie 的。有很多事情可能会关闭。可以尝试将这两个命令发送到httpreq.com 之类的站点,而不是实际的 URL,然后比较结果以发现任何差异。

标签: r httr


【解决方案1】:

我最终在终端中工作的原始 curl 上调用了 system()。这让我可以在 R 中更舒适地工作,但我无法让 httr 解决方案正常工作。

【讨论】:

    猜你喜欢
    • 2017-02-03
    • 2021-01-18
    • 2014-04-19
    • 2013-12-27
    • 1970-01-01
    • 2018-10-19
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    相关资源
    最近更新 更多