本文档假设你熟悉HTML和基本网络知识。
为了构建一个好的计算机系统编写脚本是必要的。Unix的扩展能力来自于shell脚本和各种自动化命令和脚本组成的工具,这也是其很成功的一个原因。现今为了能自动从Web获取信息而伪造用户来提交或者上传数据到Web服务器是一件很重要的工作。
curl是一个重要的命令行工具,用于做各种URL操作和传输,但是本文档将聚焦于怎样用它去发起HTTP请求。这里假设你知道如何使用curl
--help或者curl --manual来获取关于curl的基本信息。
curl不是用来为你做任何事情的,它用于发起请求、获取数据、发送数据和返回信息。你可能需要使用某种脚本语言或者重复手动调用将这些事情粘合在一起。
一、HTTP协议
HTTP是一种用于从Web服务器获取数据的协议。它是一种非常简单地协议,构建于TCP/IP之上。该协议允许客户端使用一些不同的方法获取信息发送到服务器。
客户端发送纯ASCII文本行HTTP请求给服务器,在实际请求内容返回给客户端之前,服务器返回一些文本行给客户端。
客户端可以利用curl发送一个HTTP请求。该请求包含一个方法(比如GET、POST、HEAD等)、一些请求头和请求体(不是必须的)。HTTP服务器回应一个状态行(指示请求状态)、回应头和回应体(大多数时候包含)。body部分是请求的纯数据,比如实际的HTML或者图片等。
使用curl的选项--
verbose(-v)来显示curl有哪些命令和相关解释信息。--verbose很简单,可以用于debug或者理解curl<->server之间的交互。但有时候仅仅有
--verbose还不够,所以--trace和--trace-ascii经常用于显示curl发送和接收的更多详细信息,像这样来使用它:
curl --trace-ascii debugdump.txt
二、URL
统一资源定位符用于指定特定资源在Internet上的地址,比如:http://curl.haxx.se或者。
三、获取page
最简单最普通的请求/操作是使用HTTP获取URL,这个URL本身可能指向一个Web页面、一个图片或者一个文件。客户端发起一个GET请求到服务器,并且接收请求到的文档,这个请求命令行如下:
curl http://curl.haxx.se
你可以在终端窗口中获取到一个Web页面(整个HTML文档)。
所有HTTP回应包含一组响应报头,通常是隐藏的,使用curl的选项--include(-i)来显示它们以及文档的其余部分。也可以用--
head(-I)选项来仅仅获取响应报文头。
四、表单
1、GET
假设有如下表单:
URL地址是,那么用curl就可以如下来发起GET表单请求了:
curl "http:///junk.cgi?birthyear=1905&press=OK"
2、POST
假设有如下表单:
URL地址是,那么用curl就可以如下来发起POST表单请求了:
curl --data "birthyear=1905&press=%20OK%20" hotmail.com/when/junk.cgi
如果你的data数据需要urlencode,那么curl也会帮你做好,具体如下:
curl --data-urlencode "birthyear=1905&press=%20OK%20"
hotmail.com/when/junk.cgi
如果你的后台HTTP服务接收body为二进制的protobuf数据,可以如下方式来发送POST请求:
curl -H "Content-type: application/x-protobuf" -X POST --data-binary
@pb41884288/41884288_1.pb xxx.com/bid
3、表单文件上传
假设文件上传的表单如下:
那么可以如下来上传文件:
curl --form upload=@localfilename --form press=OK [URL]
五、HTTP上传
上传数据到HTTP服务最好的方式是使用PUT方法,当然前提是服务端有程序或脚本知道如何接受HTTP PUT流。
用curl可以如下来上传文件到HTTP服务:
curl --upload-file uploadfile receive.cgi
六、HTTP认证
1、基本认证
如下来用curl使用用户名和密码来认证:
curl --user name:password example.com
上面方法的缺陷显而易见,用纯文本明文传输密码,这种认证方式很不安全。
2、代理认证
如果HTTP访问需要走HTTP代理,那么可以如下来通过代理认证:
curl --proxy-user proxyuser:proxypassword curl.haxx.se
如果代理认证需要使用NTLM方法,那么参数用--proxy-ntlm,如果需要使用摘要认真,那么参数用--proxy-digest。
七、HTTP头
有时需要在HTTP Request之中,增加一些头信息。
1、Referer
如果你需要在http request头信息中,提供一个referer字段,表示你是从哪里跳转过来的,可以如下:
curl --referer example.come example.com
2、User Agent
有时候服务器需要知道客户端的设备信息,服务端会根据不同的客户端设备返回不同的网页,移动互联网时代常见的是手机版和PC版网页,那么用curl可以模拟不同的设备,具体操作如下:
curl --user-agent "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)" [URL]
3、header
header参数也可以用来为http request增加头信息,具体如下:
curl --header "Host:" example.com
curl --header "Destination: "
也可以通过参数-H来指定k/v header信息,具体如下:
curl -v xxx.com/bid?p=1&s=2 -H "NS-Client-IP:125.39.240.113"
八、重定向
浏览器能识别302跳转来根据response头中的location来作重定向,还可以通过JavaScript来做跳转,而curl本身并不直接支持,但是可以用如下方式来模拟:
curl --location example.com
九、cookie
curl也支持发送cookie到服务端,具体如下:
curl --cookie "name=scq" example.com
十、HTTPS
curl通过如下方式来发起HTTPS请求:
curl https://secure.example.com
如果HTTPS需要证书可以如下:
curl --cert mycert.pem https://secure.example.com
评论 (0)