用CURL来发送HTTP请求的方法
原文:Online: curl.haxx.se/docs/httpscripting.html
翻译:豆连军 doulianjun@gmail
假设您已经熟悉了 HTML 和基本网络知识。 拥有脚本语言编写能力对于设计一个漂亮的计算机系统非常重要。UNIX shell 脚本和 各种 Tools 工具,这些可以用来执行各种自动化命令和脚本,从而大大拓展了 UNIX 的计算 能力。这是 UNIX 为什么如此成功的原因之一。 越来越多的应用转向了 WEB,这使得 HTTP 执行脚本变得更频繁和迫切。为了从 web 获得更多的信息,模拟用户浏览、发帖、上传数据等,今天已经成了我们重要工作内容。 Curl 是一个命令行工具, 用来执行各种 URL 操作和信息传输。 但在本文中将着重描述如 何用 Curl 来完美地执行 HTTP 请求。 我假定您知道如何调用’curl –help’或者’curl –manual’来获 curl 的基本信息。 Curl 自然不是所有事情都能干。Curl 只是生成请求包,获得数据,发送数据获得信息。 你可以使用脚本语言或者重复手工调用来完成你想要做的所有事情。
1. HTTP 协议
HTTP 用来从 WEB 服务器获得数据。它也是一种建筑在 TCP/IP 之上的简单协议。HTTP 允许从客户端向服务器端发送数据,这些数据有多种不同的操作方法。这里将给予说明。 HTTP 是一些 ASCII 文字行,这些 ASCII 文字从客户端发送给服务器端来请求一个特别的 操作。然后,服务器端在发送给客户端的实际请求内容之前回应一些文字行。 客户端,也就是 curl,发送一个 HTTP 请求,该请求包含一个操作方法(比如: GET,POST,HEAD 等) ,一组请求头,以及某些时候再携带一些请求消息体。HTTP 服务器响应 一个状态行(表明操作结果是否成功) ,响应头,以及大多数情况下还有响应消息体。消息 体部分是你请求的实际数据,比如 HTML 或者图片等。
1.1 查看协议
使用 Curl 选项 –verbose(或者v)可以显示 curl 发送了什么样的命令给服务器端, 以及显 示其他的一些信息。 ‐‐verbose 是一个非常有用的选项,可以用来调试以及历届 curl server 端之间的交互 操作。 有时—verbose 选项仍然不满足调试需求,这时—trace —traceascii 选项可以提供 curl 发送和接收的所有详细信息。下面是示例: # curl -- ample/
2. URL
URL 是你用来表达一个特定互联网资源如何定位寻址的一种格式。你看到的 URL 比如: curl.haxx.se or yourbank a million times.
3. 获得一个网页
最简单和最常用的 HTTP 请求操作是 Get 一个 URL。这个 URL 可能指向一个 web 页面, 一副图片,或者一个文件
。客户端表达一个 GET 请求发送给服务器端,并接收所请的文档。 比如:你表达了一个命令行: # curl curl.haxx.se 在终端窗口中你会获得一个 web 页面,这就是 URL 指向的完整的 HTML 文档。 所有 HTTP 应答都包含了一组响应头,这些响应头通常被隐藏起来。使用 curl —include(i)选项可以显示这些响应头。你可以使用—headI)选项来单单请求响应头。这 是通过 curl 发送一个 HEAD 请求来实现的。
4. Form 表单
Form 表单的这样一种作用:网站用来提供一个网页,该网页包含一组 Fields,用户需要 输入数据,然后点击“OK”或者确认按钮,发送这些数据到服务器端。服务器然后使 用这些发过来的数据来决定如何做下一步响应。 比如使用输入的文字来检索数据库, 或者在 一个 bug 跟踪系统中登记信息, 在一个地图上显示输入的地址, 或者校验输入的用户名口令 是否合法。 当然,接收你发送数据的服务器端还是存在着某种程序,你不能凭空产生。
4.1 GET
一个 GET 表单使用了 GET 方法,HTML 中是如下描述的:
窗体顶端
<form method="GET" action="i">
<input type=text name="birthyear">
<input type=submit name=press value="OK"> </form>
窗体底端
在浏览器端,该表单会展现一个文字输入框和“OK”按钮。如果你输入“1905”并点 “ OK ” URL URL 使 GET "i?birthyear=1905&press=OK"衔接在先前的 URL PATH 后面。 如果原表单 展现在 www.hotmail/when/birth.html 页面上,则第二 个页面将是 "www.hotmail/i?birthyear=1905&press=OK". 绝大多数搜索引擎采用这种工作方式。 要使 Curl 做同样的事情,只需要键入如下命令: # curl "www.hotmail/i?birthyear=1905&press=OK"
4.2 POST
GET 方法将把所有输入的 Fields 名称显示在浏览器的 URL 中。 这一般是一种比较好的做 法,这种做法可以帮助你来保持书签。但是这也是一种显而易见的危险行为,比如你输入了 秘密信息,或者输入了大量的 Fields 造成 URL 非常长难以阅读。 HTTP 协议提供了 POST 方法。该方法在客户端发送时,将数据从 URL 中分离出来,因 此你不会在 URL 地址栏中看到任何数据内容。 表单与之前描述的表单非常类似:
窗体顶端
<form method="POST" action="i">
<input type=text name="birthyear">
<input type=submit name=press value=" OK ">
</form>
窗体底端
使用 curl 发送携带了上次数据的表单,我们可以这样做: # curl --data "birthyear=1905&press=%20OK%20" i 这种 POST 操作使用的 ContentType application/xwwwformurlencoded ,并且这是 一种应用最广泛的 POST 方法。 你发送给
服务器端的数据必须是已经被准确地编码了。 不会自动帮你做此事。 curl 网页设计html代码翻译例如: 如果你想使用包含了空格的数据, 你需要使用%20 来替换空格等。 错误的请求将很可能造成 你发送的数据错误,并出现混乱。 新版本的 curl 能够执行 URL 编码的 POST 数据,比如: # curl --data-urlencode "name=I am Daniel" ample
4.3 文件上传 POST
1995 年定义了一种通过 HTTP 协议 POST 数据的方法。这就是 RFC 1867。其中 RFC1867posting 部分将在此被引用。
该方法主要设计来支持文件的上传。 一个表单允许用户上传一个文件, 如同下面的 HTML 代码:
窗体顶端
<form method="POST" enctype='multipart/form-data'action="i">
<input type=file name=upload>
<input type=submit name=press value="OK">
</form>
窗体底端
上面代码清楚地描述了将要发送内容的 ContentType multipart/formdata POST 一个表单,如果使用 CURL,则你只需要键入下面的命令: # curl --form upload=@localfilename --form press=OK [URL]
4.4 隐藏 Fields
HTML 应用中,有一个很常用的在页面之间传输状态信息的方法,就是将隐藏 Fields 放到表单中。隐藏 Fields 事先被填充好了数据。这些 Fields 不会被显示给用户看,它们会跟 其他 Fields 一道被传送给服务器端。 同一个可见 Field 用法类似,一个隐藏 Field 和一个 submit 按钮见下述示例:
窗体顶端
<form method="POST" action="i">
<input type=text name="birthyear">
<input type=hidden name="person" value="daniel">
<input type=submit name="press" value="OK">
</form>
窗体底端
使用 curl 来发送上述表单,你不必考虑这些 Fields 是隐藏的或者不是隐藏的。实现上述
能的 Curl 用法与上例中是相同的。 # curl --data "birthyear=1905&press=OK&person=daniel" [URL]
4.5 展示 POST 请求
当你使用 curl 代替浏览器填充一个表单并发送给服务器端时, 你一定会对发送和浏览器 一样的 POST 请求感兴趣。 一个简单的办法可以看到这个过程。你可以将包含 Form 表单的 HTML 页面存储到本地 硬盘上, 修改表单的 method GET 然后点击 submit 按钮 (当然, 你也可以修改 Action URL 你将清楚地看到发送的数据附加在 URL 之后,它们之间采用’?’符号分割,就如同 GET 表单的发送过程一样。
5. PUT
上传数据到一个 HTTP 服务器的可能最好的方法是使用 PUT 操作。然后,当然服务器端 必须有一个脚本或者程序来接收这些 HTTP PUT 流。 使用 CURL 上传一个文件到 HTTP 服务器,用法如下: # curl --upload-file uploadfile i

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。