手动HTTP(S)请求


9

我正在寻找一个工具(可能在Linux上),它允许我发出手动HTTP或HTTPS请求。通过手动,我的意思是:我应该能够提供一个看起来像的文本文件

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

和目标网址(www.example.com/foo),并将请求发送到URL。最多,如果自动计算Content_Length标头将是有用的。

我可以在Python中使用像httplib这样的库来编写这样的工具,但我需要它的原因是当这些库出现问题时进行手动调查。


Answers:


9

wget有一个--post-file选项,应该适合你。

编辑:此外,还有Ncat,你会以类似的方式使用Randolf Richardson的telnet建议,除了它还支持SSL / HTTPS:

ncat -C --ssl www.example.com 443 < input.txt > output.txt

5
如果您需要HTTPS,请使用openssl而不是netcat:openssl s_client -connect <address>:443
Ambroz Bizjak 2011年

wget --post-file将添加标头并仅将指定文件用于请求的主体。
DavidBalažic

6

对于HTTP(不是HTTPS),我想到的“wget”命令的一种替代方法是使用telnet,如下所示:

  • telnet hostname 80 <input.txt> output.txt

文件“input.txt”是您希望通过主机提供给主机的预设命令列表,文件“output.txt”将存储响应。


1
这让我想知道netcat是否支持SSL,而且还有Ncat,一个支持SSL的netcat克隆。
Chris Acheson

@Chris Acheson(+1):太棒了!请随意复制我在单独的答案中写的内容,并使其适应使用NetCat的解决方案(如果你这样做,我会投票给你答案)。
Randolf Richardson 2011年

1

您可以使用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)不支持它。


0

对我来说,它的工作创建一个请求文件(例如:request.txt

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; charset=utf-8
Content-Length: 11
Connection: close

Hello world

然后调用openssl s_client命令:

cat request.txt | openssl s_client -quiet -connect www.example.com:443

但是,请注意以下几点:

  • 必须正确编码文件,特别是内容正文。如果Content-type: text/plain; charset=utf-8文件是utf-8编码,则包含标题会更好。
  • 标题的行结尾必须是CR / LF。只有使用LF,Web服务器才能返回HTTP/1.1 505 HTTP Version Not Supported,因为标准HTTP协议使用CR / LF进行行结束(https://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html)。您可以使用该unix2dos命令执行此转换。
  • 添加Connection: close标头以终止请求并从呼叫返回。否则,如果服务器通常以Connection: keep-alive标头响应,则该命令将等待用户交互。

-1

我很惊讶没人提到cURL。它完全符合您的要求。它几乎适用于任何平台(包括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

curl 几乎就是我想要的,但是要求我在命令行上指定标题,这是非常不切实际的。我需要一些东西,允许我从文件中指定请求的完整文本,包括方法和标题,而ncat确实是我想要的。无论如何,谢谢你:-)
Andrea
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.