用CURL来发送HTTP请求的方法.docx
- 文档编号:27423282
- 上传时间:2023-06-30
- 格式:DOCX
- 页数:10
- 大小:24.45KB
用CURL来发送HTTP请求的方法.docx
《用CURL来发送HTTP请求的方法.docx》由会员分享,可在线阅读,更多相关《用CURL来发送HTTP请求的方法.docx(10页珍藏版)》请在冰豆网上搜索。
用CURL来发送HTTP请求的方法
用CURL来发送HTTP请求的方法
原文:
Online:
http:
//curl.haxx.se/docs/httpscripting.html
翻译:
豆连军doulianjun@
假设您已经熟悉了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和—trace‐ascii选项可以提供curl发送和接收的所有详细信息。
下面是示例:
#curl--trace-asciidebugdump.txt
2.URL
URL是你用来表达一个特定互联网资源如何定位寻址的一种格式。
你看到的URL比如:
http:
//curl.haxx.seoramilliontimes.
3.获得一个网页
最简单和最常用的HTTP请求操作是Get一个URL。
这个URL可能指向一个web页面,一副图片,或者一个文件
。
客户端表达一个GET请求发送给服务器端,并接收所请的文档。
比如:
你表达了一个命令行:
#curlhttp:
//curl.haxx.se在终端窗口中你会获得一个web页面,这就是URL指向的完整的HTML文档。
所有HTTP应答都包含了一组响应头,这些响应头通常被隐藏起来。
使用curl的—include(‐i)选项可以显示这些响应头。
你可以使用—head(‐I)选项来单单请求响应头。
这是通过curl发送一个HEAD请求来实现的。
4.Form表单
Form表单的这样一种作用:
网站用来提供一个网页,该网页包含一组Fields,用户需要输入数据,然后点击“OK”或者“确认”按钮,发送这些数据到服务器端。
服务器然后使用这些发过来的数据来决定如何做下一步响应。
比如使用输入的文字来检索数据库,或者在一个bug跟踪系统中登记信息,在一个地图上显示输入的地址,或者校验输入的用户名口令是否合法。
当然,接收你发送数据的服务器端还是存在着某种程序,你不能凭空产生。
4.1GET
一个GET表单使用了GET方法,HTML中是如下描述的:
窗体顶端
窗体底端
在浏览器端,该表单会展现一个文字输入框和“OK”按钮。
如果你输入“1905”并点击“OK”按钮,浏览器会生成一个新的URL,该URL将使用GET方法。
该"junk.cgi?
birthyear=1905&press=OK"衔接在先前的URL的PATH后面。
如果原表单展现在页面上,则第二个页面将是"绝大多数搜索引擎采用这种工作方式。
要使Curl做同样的事情,只需要键入如下命令:
#curl"
4.2POST
GET方法将把所有输入的Fields名称显示在浏览器的URL中。
这一般是一种比较好的做法,这种做法可以帮助你来保持书签。
但是这也是一种显而易见的危险行为,比如你输入了秘密信息,或者输入了大量的Fields造成URL非常长难以阅读。
HTTP协议提供了POST方法。
该方法在客户端发送时,将数据从URL中分离出来,因此你不会在URL地址栏中看到任何数据内容。
表单与之前描述的表单非常类似:
窗体顶端
窗体底端
使用curl发送携带了上次数据的表单,我们可以这样做:
#curl--data"birthyear=1905&press=%20OK%20"这种POST操作使用的Content‐Type为application/x‐www‐form‐urlencoded,并且这是一种应用最广泛的POST方法。
你发送给
服务器端的数据必须是已经被准确地编码了。
不会自动帮你做此事。
curl例如:
如果你想使用包含了空格的数据,你需要使用%20来替换空格等。
错误的请求将很可能造成你发送的数据错误,并出现混乱。
新版本的curl能够执行URL编码的POST数据,比如:
#curl--data-urlencode"name=IamDaniel"
4.3文件上传POST
在1995年定义了一种通过HTTP协议POST数据的方法。
这就是RFC1867。
其中RFC1867‐posting部分将在此被引用。
该方法主要设计来支持文件的上传。
一个表单允许用户上传一个文件,如同下面的HTML代码:
窗体顶端
窗体底端
上面代码清楚地描述了将要发送内容的Content‐Type是multipart/form‐data。
POST一个表单,如果使用CURL,则你只需要键入下面的命令:
#curl--formupload=@localfilename--formpress=OK[URL]
4.4隐藏Fields
在HTML应用中,有一个很常用的在页面之间传输状态信息的方法,就是将隐藏Fields放到表单中。
隐藏Fields事先被填充好了数据。
这些Fields不会被显示给用户看,它们会跟其他Fields一道被传送给服务器端。
同一个可见Field用法类似,一个隐藏Field和一个submit按钮见下述示例:
窗体顶端
窗体底端
使用curl来发送上述表单,你不必考虑这些Fields是隐藏的或者不是隐藏的。
实现上述功能的Curl用法与上例中是相同的。
#curl--data"birthyear=1905&press=OK&person=daniel"[URL]
4.5展示POST请求
当你使用curl代替浏览器填充一个表单并发送给服务器端时,你一定会对发送和浏览器一样的POST请求感兴趣。
一个简单的办法可以看到这个过程。
你可以将包含Form表单的HTML页面存储到本地硬盘上,修改表单的method为GET,然后点击submit按钮(当然,你也可以修改ActionURL)。
你将清楚地看到发送的数据附加在URL之后,它们之间采用’?
’符号分割,就如同GET表单的发送过程一样。
5.PUT
上传数据到一个HTTP服务器的可能最好的方法是使用PUT操作。
然后,当然服务器端必须有一个脚本或者程序来接收这些HTTPPUT流。
使用CURL上传一个文件到HTTP服务器,用法如下:
#curl--upload-fileuploadfile
6.HTTP认证鉴权
HTTP认证(Authentication)是一种通过校验你的用户名及密码来验证你是否有权执行相关操作的机制。
基本的鉴权机制也是缺省的机制是*plain**text*based,顾名思义,它发送的用户名和密码看起来稍显杂乱,但仍然可以被读懂。
通过Curl来使用用户名口令的鉴权,示例如下:
#curl--username:
password网站可能要求一种不同的鉴权机制(检查服务器端回应的Header头),这时,你可以使用‐‐ntlm,‐‐digest,‐‐negotiate或‐‐anyauth等选项。
某些时候,你的HTTP访问需要通过HTTP代理完成。
这是在很多公司存在的。
HTTP代理一般需要验证它自己发放的账户口令来决定是否准许访问INTERNET。
用curl来实现上述要求,可以使用如下命令行:
#curl--proxy-userproxyuser:
proxypasswordcurl.haxx.se如果你的代理要求使用NTLM方法来认证,则使用—proxy‐ntlm选项。
如果要求Digest,则使用—proxy‐digest选项。
如果你使用任何user+passord选项,但是没有标明password部分,curl将提示一个password交互窗口。
要注意的是,当一个程序执行时,查看这些进程时,它的参数可能会显示出来。
这样,如果你执行一个直白的命令行选项,则其他用户可能会看到你的密码。
这里有避免的方法。
这值得注意的是,HTTP认证时如何工作的。
很多很多WEB站点不会使用这种登陆认证方式。
后面的WEB登陆章节会有进一步的细节说明。
7.Referer
HTTP请求可以包含一个’referer’字段(虽然这个拼写有误),该字段说明这个URL请求是来自于客户端的那个URL文档。
某些程序/脚本检查请求中的referer字段来校验它是否来自于外部站点或者一个未知的页面。
当然,检查如此容易的伪造是一个傻瓜做法。
许多脚本仍然在这么做。
使用CURL,你可以在referer字段中放任何数据,并且非常容易地愚弄服务器端来响应你的请求。
使用CURL来设置referer字段:
#curl--referere
8.UserAgent
与referer字段非常类似,所有HTTP请求可以设置User‐Agent字段。
这个字段说明了用户使用的是哪种代理(客户端)。
许多应用使用该信息来判断如何显示页面。
傻瓜web编码人员试图为不同的浏览器用户提供不同的页面,以提供给用户最佳的体验。
他们通常也使用不同的javascript,vbscript等。
有时,你会看到使用curl获得的web页面与你使用浏览器获得页面有所不同。
这时,
你应该知道使用User‐Agent来糊弄这些服务器端使它们认为你就是那个它认为的浏览器。
使curl模拟Windows2000上的Explorer5:
#curl--user-agent"Mozilla/4.0(compatible;MSIE5.01;WindowsNT5.0)"[URL]使curl模拟老Linux上的Netscape4.73:
#curl--user-agent"Mozilla/4.73[en](X11;U;Linux2.2.15i686)"
[URL]
9.Redirects
当向一个服务器请求一个资源时,回应可能包含了一个提示,这个提示说明了浏览器应该继续跳转到另外一个网页上。
告诉浏览器做重定向的响应头是Location:
Curl不会执行重定向:
响应头是先前描述的,消息体也是跟其他回应相同的显示模式。
但提供了一个功能选项,可用来执行后继的重定向。
使curl执行重定向:
#curl--location如果你使用curl来POST到一个网址,该网址将重定向到另外一个网页,你可以安全地将—localtion(‐L)和—data/‐‐form等选项一起结合使用。
Curl将只在第一次请求中使用POST,然后使用GET来执行后继操作。
10.Cookies
web浏览器执行“客户端状态控制”技术是通过cookies来实现的。
Cookies是多个内容组合体。
Cookies由服务器端发送给客户端。
服务器端告诉客户端Cookie的有效路径和主机名称,以便浏览器返回这些数据。
同时,它也发送过期时间和一些其他特性。
客户端跟服务器端通信时,如果服务器名称、路径名都跟以前Cookie设定的参数相匹配,则客户端将把Cookies和相关内容回传给服务器,除非这些cookie过期才不回传。
许多应用和服务器使用这种方式来连接一系列请求为一个逻辑会话。
为了使curl能够用
于这种场合,我们必须能够记录和回传cookies。
就如同浏览器处理它们一样。
当使用curl获取一个网页,最简单的方式就是发送一组cookies给服务器端。
在命令行中如下所示:
#curl--cookie"name=Daniel"Cookies跟其他普通的HTTP响应头一样传输。
这里可以通过curl来记录cookies,跟记录其他响应头一样。
要使用—dump‐header(‐D)选项:
#curl--dump-headerheaders_and_cookies(注意,下面描述的‐‐cookie‐jar选项是一种更好的存储cookies的方法。
)Curl有一个内置的功能全面的cookie解析引擎,如果你想重新连接一个服务器站点,想使用前一个步骤访问站点时存储下来的cookies(或者人工愚弄服务器端使服务器相信你有一个以前的连接)你可以使用这个功能。
,使用先前存储的Cookies,你可以这么使用Curl:
#curl--cookiestored_cookies_in_fileCurl的Cookie引擎在你使用—cookie选项后开始执行。
如果你仅仅想curl理解接收到的cookies,使用—cookie再跟一个不存在的文件。
例如,如果你想让curl理解一个网页的cookie,并且重定向到一个新的网址(当然,curl会回送它接收到的cookies)你可以这么引用curl:
,#curl--cookienada--locationCurl能够读取和生成Cookie文件,这文件格式跟
Netscape和Mozilla是一样的。
这种特性为cookies在浏览器和自动脚本之间共享提供了一种方便性。
‐‐cookie(‐b)开关自动检测一个给定文件是否为Cookie文件,如果是,就解析它。
使用—cookie‐jar(‐c)选项,你可以使curl在操作结束时生成一个新的cookie文件:
#curl--cookiecookies.txt--cookie-jarnewcookies.txt
11.HTTPS
有多种方式来实现SecureHTTP传输。
最知名的协议时HTTPS,HTTPoverSSL。
SSL将所有网络上发送和接收的数据进行加密,从而避免攻击者窃取敏感信息。
SSL(或者TLS是最近的标准)提供一整套高级功能,允许加密和HTTP请求密钥加密机制。
感谢OpenSSL库的支持,Curl实现了加密的支持。
从一个HTTPS站点获得网页,只需要简单地执行如下操作:
#curl
11.1Certificates
使用HTTPS,你需要使用证书来证明你是否有权访问,这作为登陆密码的一个补充。
Curl支持客户端证书。
所有证书在校验过程中都会被锁定,在证书可以被curl使用之前,你需要进入这个过程。
这个过程可以在命令行中被指定,或者在curl询问时人工输入。
curl在一个HTTPS站点上使用一个证书,可以采用如下方式:
#curl--certmycert.pemCURL也将执行对证书中的服务器端的校验,该校验是通过比对本地存储的CA证书和服务器端的证书进行的。
错误的证书将会导致CURL拒绝本次连接。
此时,你必须使用—insecure(‐k)确保你想告诉curl去忽略服务器端的失败校验。
更多关于服务器端证书和CA机制,请参阅SSLCERTS文档,线上地址为:
http:
//curl.haxx.se/docs/sslcerts.html
12.定制请求元素
要想做得漂亮,你需要增加或者修改curl的请求元素。
例如,你可以修改POST请求指向一个PROPFIND,并且使发送的数据采用”Content‐Type:
text/xml”(代替缺省的
Content‐Type),则相应curl用法如下:
#curl--data"
13.WebLogin
由于不只是HTTP方面的问题,仍然有许多困难。
这里详细描述了各种登陆表单如何工作的原理以及如何使用CURL来模拟登录。
需要注意的是,要自动登陆,大多数情况下,你需要编写脚本,反复调用url。
首先,服务器端大多数都是使用cookies来跟踪客户端登陆状态。
因此,你应该捕获服务器端的Cookies响应,然后,许多站点会在登录页面设置一个特殊的cookie(请确认你已登陆了)。
所以,你应习惯于首先抓获一个登陆表单来捕获其上的cookies。
某些web登陆页使用了功能复杂的javascript,有时他们使用这些代码来设置和修改cookie内容。
也有可能他们想通过这种方式来阻挡机器人登陆,就象本文描述的这样……。
但不管如何,如果阅读这些代码不足以让你实现自动登陆,你需要通过浏览器来捕获http请求,并分析这些cookies的发送过程,以找到剥离javascript代码的途径。
在实际登陆页的form标签中,许多站点会隐藏很多秘密标签或填充一些随机数或session。
你需要首先捕获登陆表单的HTML代码,并且抽取所有的隐藏字段,来正确地发送POST登陆请求。
切记,采用普通POST命令发送数据时,内容需要使用URL编码。
14.Debug
很多时候,当你在一个站点上使用curl,你会注意到站点并不像你使用浏览器一样给你想要的响应。
然后,你需要使curl可以发出与你浏览器更类似的请求数据包。
下面是几个有用的调试命令选项:
*使用—trac‐ascii选项来存储详细的请求log日志,这可以用来辅助分析和理解。
*检查确认是否有必要使用cookies(参考—cookie和—cookie‐jar)*设置User‐Agent为最近流行的浏览器类型。
*设置referer为浏览器上的数值。
*如果你使用POST,需要确认你发送了所有的字段,并且字段顺序跟浏览器一致。
(见4.5章节)一个可以帮助你正确操作的工具是LiveHttpHeadertool,这可以帮助你在Mozilla/Firefox上查看你发送和接收的所有Headers。
(包括你使用HTTPS场合)一个更基本的目的是捕获HTTP网络通信数据,这可以使用ethereal或者tcpdump等工具来做到。
通过这些工具可以帮助检查浏览器发送了和接收了哪些Headers。
HTTPS不适用)(
15.References
RFC2616是你理解HTTP协议所必须阅读的。
RFC3986解释了URL语法。
RFC2109定义了cookies是如何工作的。
RFC1867定义了HTTPpost上传格式。
http:
//curl.haxx.se是curl的官方网站。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CURL 发送 HTTP 请求 方法