提问人:Jurian Baas 提问时间:11/3/2023 最后编辑:273KJurian Baas 更新时间:11/4/2023 访问量:36
需要帮助设置 curl 命令来填写表单。服务器在 302 重定向后以 HTTP/1.1 411 长度要求进行响应
Need help setting up a curl command to fill in a form. Server responds with HTTP/1.1 411 Length Required after a 302 redirect
问:
我正在尝试编写一个批处理脚本,该脚本将使用户轻松填写有关非法烟花爆竹的警察表格。它获取有关用户的一些个人信息,并将其与当前日期和时间结合使用,为警方创建声明。个人信息也填写在表格中,以便以后可以联系他们。
发出 POST 请求时,服务器以 302 状态代码进行回复。因此,我在 curl 中使用了 -L 标志来使其遵循重定向。
但是,在此重定向后,服务器会以 411 状态代码(需要长度)进行响应。
为了添加上下文,我使用的是 curl 版本 8.0.1 (Windows) libcurl/8.0.1 Schannel WinIDN
我已经尝试过的事情:
- 使用 GET 而不是 POST。
- 使用 --post302 标志,将产生无限循环。
- 添加“Content-Length: 0”标头会导致 HTTP/1.1 403 Forbidden 响应。
我的批处理脚本如下:
:: First we set some variables such as name, place, date, time, etc (omitted here)
...
:: We then use these variables to create the 'data' variable
set data="melding_bericht=%melding_bericht%&plaats_voorval=%plaats_voorval%&straat_voorval=%straat_voorval%&bestanden=&voornaam=%voornaam%&tussenvoegsel=%tussenvoegsel%&achternaam=%achternaam%&straatnaam=%straatnaam%&huisnummer=%huisnummer%&huisnummer-toevoeging=%huisnummer_toevoeging%&postcode=%postcode%&woonplaats=%woonplaats%&telefoonnummer=%telefoonnummer%&email=%email%&transmit=Versturen"
:: Now issue the request to the server
curl "https://www.politie.nl/aangifte-of-melding-doen/meldformulier-vuurwerkoverlast.html" ^
-X POST ^
-L ^
-H "authority: www.politie.nl" ^
--data %data% ^
--verbose
curl 进程中的一些日志:
首先,服务器响应:
HTTP/1.1 302 Moved Temporarily
然后:
Issue another request to this URL: 'https://www.politie.nl/aangifte-of-melding-doen/meldformulier-vuurwerkoverlast.html? (the data in the form, omitted here)'
* Switch from POST to GET
* Found bundle for host: 0x21c63c12c50 \[serially\]
* Re-using existing connection #0 with host www.politie.nl
> POST /aangifte-of-melding-doen/meldformulier-vuurwerkoverlast.html?(the urlencoded data in the form, omitted here) HTTP/1.1
在此之后,服务器响应为:
HTTP/1.1 411 Length Required
任何人都知道为什么
curl 似乎又做了一个帖子请求?即使它说之前从 POST 切换到 GET
如果不是,服务器是否需要 GET 请求的内容长度?
答:
在互联网上进行了挖掘,在 GitHub 上发现了这个问题:通过 302 重定向 POST 时,HTTP 消息无效。这让我想到了这个选项。--post302
当 curl 跟随重定向并且请求是 POST 时,如果 HTTP 响应为 301、302 或 303,则它会使用 GET 发送以下请求。如果响应代码是任何其他 3xx 代码,则 curl 使用相同的未修改方法重新发送以下请求。
您可以使用专用选项告诉 curl 不要在 30 倍响应后将 POST 请求更改为 GET:--post301、--post302 和 --post303。
这表明您可能应该包括 和选项来强制重新发送 POST 正文。--post301
--post302
--post303
无论哪种方式,看起来 Curl 似乎都对重定向感到有些困惑。据我所知,[HTTP/1.1 规范,第 6.4.3 节](https://datatracker.ietf.org/doc/html/rfc7231#section-6.4.3 - 302 FOUND)中没有任何内容意味着重定向应该更改为 GET 请求:
注意:由于历史原因,用户代理可以更改请求 方法从 POST 到 GET 用于后续请求。如果这 行为是不需要的,307(临时重定向)状态代码 可以代替使用。
虽然没有进入“历史原因”是什么!
评论