我正在寻找一个可以让我手动发出 HTTP 或 HTTPS 请求的工具(可能在 Linux 上)。我说的手动,其实是这样的:我应该能够给它提供一个文本文件,如下所示
POST /foo HTTP/1.1
Host: www.example.com
Accept: text/xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-gb,en;q=0.5
Content-Type: text/plain
Content-Length: 11
Hello world
以及目标 URL(www.example.com/foo
),并将请求发送到该 URL。最多,如果Content_Length
标头是自动计算的,那将很有用。
我可以使用 Python 中的 httplib 之类的库来编写这样的工具,但我需要它的原因主要是当这些库出现问题时进行手动调查。
答案1
答案2
对于 HTTP(不是 HTTPS),想到的“wget”命令的一个替代方法是使用 telnet,如下所示:
- telnet 主机名 80 <输入.txt>输出.txt
文件“input.txt”是您希望提供给主机的预设命令列表主机名文件“output.txt”将存储响应。
答案3
您可以使用 OpenSSL 发出 GET 请求:
openssl s_client -quiet -connect cdn.sstatic.net:443 <<eof
GET /stackexchange/js/universal-login.js HTTP/1.1
Connection: close
Host: cdn.sstatic.net
eof
请注意,您也可以使用“HTTP/2”,但要小心,因为某些服务器(例如 github.com)不支持它。
答案4
我很惊讶没有人提到卷曲.它是由确切地满足您的所有需求。它几乎适用于任何平台(包括 Windows)。
因此,对于您的示例,您要做的就是:
curl -H 'Content-Type: text/plain' -d 'Hello World' www.example.com
从 Wireshark 捕获的信息如下:
POST / HTTP/1.1
User-Agent: curl/7.19.7 (x86_64-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15
Host: www.example.com
Accept: */*
Content-Type: text/plain
Content-Length: 11
Hello world
如果您想做各种事情(即更改用户代理等),您可以轻松地进一步修改标题。
编辑:没有注意到“来自文件”的要求。您也可以这样做,无论是纯 ascii 还是二进制文件。您只需使用 @ 符号指定文件名即可
-d @/tmp/HelloWorldFile