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响应:

  1. $ curl URL -d "postvar=postdata2&postvar2=postdata2"

在一个用于提交诸如主机名和用户名等当前用户信息的网站中(http://book.sarathlakshman.com/lsc/mlogs/),假设其主页有HOSTNAME和USER两个字段和一个SUBMIT按钮,当用户输入主机名和用户名,点击SUBMIT按钮,输入的信息就会储存在网站中。这个过程可以通过一行curl命令将POST请求提交自动化来实现。如果你查看网站的源代码(使用网页浏览器的查看源代码选项),你会发现一个与下面类似的HTML表单:

  1. <form action="http://book.sarathlakshman.com/lsc/mlogs/submit.php"
  2. method="post" >
  3. <input type="text" name="host" value="HOSTNAME" >
  4. <input type="text" name="user" value="USER" >
  5. <input type="submit" >
  6. </form>

其中 http://book.sarathlakshman.com/lsc/mlogs/submit.php是目标URL。当用户输入信息并点击submit按钮,名为host和user的输入内容就以POST请求的方式被发送到submit.php中,然后对应的响应页面被返回到浏览器。

我们可以按照下面的方法自动化POST请求:

  1. $ curl http://book.sarathlakshman.com/lsc/mlogs/submit.php -d "host=test-
  2. host&user=slynux"
  3. <html>
  4. You have entered :
  5. <p>HOST : test-host</p>
  6. <p>USER : slynux</p>
  7. <html>

curl返回响应页面。

-d选项用于发送请求。-d的字符串参数和GET请求在语义上类似。每对var=value之间用 &分隔。

5.13 以POST方式发送网页并读取响应 - 图1 -d的参数内容应该以引用的形式给出。如果不使用引用,& 会被shell解读为该命令应该作为后台进程运行。

5.13.3 补充内容

让我们再看看如何用cURL和wget执行POST请求。

  • curl中使用POST

可以在curl中用 -d--data以POST方式发送数据:

  1. $ curl --data "name=value" URL -o output.html

如果需要发送多个变量,用 & 分隔变量。需要注意的是:如果使用了 &,那么该“名称?值”对应以引用的形式出现,否则shell会将其看做是用于后台进程的特殊符号。例如:

  1. $ curl -d "name1=val1&name2=val2" URL -o output.html
  • wget以POST方式发送数据

wget--post-data "string" 可以POST方式发送数据。例如:

  1. $ wget URL -post-data "name=value" -O output.html

其中的“名称-值”对要采用和cURL同样的格式。

5.13.4 参考

  • 5.4节讲解了curl命令。

  • 5.2节讲解了wget命令。