【发布时间】: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)。我注意到两个不同之处:
- 首先,R 的记录缺少
cookies = c()中定义的一个 cookie 参数。 - 其次,“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,然后比较结果以发现任何差异。