5.13 以POST方式发送网页并读取响应
POST和GET是HTTP协议中用于发送或检索信息的两种请求类型。在GET请求方式中,我们利用网页的URL来发送参数(“名称-值”对)。而在POST请求方式中,我们就不这么做了。POST方式用于提交表单,诸如提交用户名、密码以及检索登录页面等。
当编写基于网页检索的脚本时,用POST方式发送页面相当常见。让我们来看一看POST的使用方法。通过POST方式发送数据并检索输出来自动化HTTP GET和POST请求,在编写解析网站数据的shell脚本的过程中,是一项非常重要的任务。
5.13.1 预备知识
cURL和wget
都可以通过各种参数来处理POST请求。请求内容能够以“名称-值”对的形式传递给命令。
5.13.2 实战演练
来看看如何用curl
发送POST请求并读取网站的HTML响应:
- $ curl URL -d "postvar=postdata2&postvar2=postdata2"
在一个用于提交诸如主机名和用户名等当前用户信息的网站中(http://book.sarathlakshman.com/lsc/mlogs/),假设其主页有HOSTNAME和USER两个字段和一个SUBMIT按钮,当用户输入主机名和用户名,点击SUBMIT按钮,输入的信息就会储存在网站中。这个过程可以通过一行curl
命令将POST请求提交自动化来实现。如果你查看网站的源代码(使用网页浏览器的查看源代码选项),你会发现一个与下面类似的HTML表单:
<form action="http://book.sarathlakshman.com/lsc/mlogs/submit.php"
method="post" >
<input type="text" name="host" value="HOSTNAME" >
<input type="text" name="user" value="USER" >
<input type="submit" >
</form>
其中 http://book.sarathlakshman.com/lsc/mlogs/submit.php是目标URL。当用户输入信息并点击submit按钮,名为host和user的输入内容就以POST请求的方式被发送到submit.php中,然后对应的响应页面被返回到浏览器。
我们可以按照下面的方法自动化POST请求:
- $ curl http://book.sarathlakshman.com/lsc/mlogs/submit.php -d "host=test-
- host&user=slynux"
- <html>
- You have entered :
- <p>HOST : test-host</p>
- <p>USER : slynux</p>
- <html>
curl
返回响应页面。
-d
选项用于发送请求。-d
的字符串参数和GET请求在语义上类似。每对var=value
之间用 &
分隔。
![]()
-d
的参数内容应该以引用的形式给出。如果不使用引用,&
会被shell解读为该命令应该作为后台进程运行。
5.13.3 补充内容
让我们再看看如何用cURL和wget
执行POST请求。
- 在
curl
中使用POST
可以在curl
中用 -d
或 --data
以POST方式发送数据:
- $ curl --data "name=value" URL -o output.html
如果需要发送多个变量,用 &
分隔变量。需要注意的是:如果使用了 &
,那么该“名称?值”对应以引用的形式出现,否则shell会将其看做是用于后台进程的特殊符号。例如:
- $ curl -d "name1=val1&name2=val2" URL -o output.html
- 用
wget
以POST方式发送数据
用wget
的--post-data "string"
可以POST方式发送数据。例如:
- $ wget URL -post-data "name=value" -O output.html
其中的“名称-值”对要采用和cURL同样的格式。
5.13.4 参考
5.4节讲解了
curl
命令。5.2节讲解了
wget
命令。