虽然cURL支持多种协议,但日常我们最常用的还是HTTP协议,下文中着重介绍HTTP的相关使用方法,因此我们要对HTTP协议有所了解。

HTTP,超文本传送协议,通过因特网传送万维网文档的数据传送协议。

我们访问一个网页的实际过程如下:

客户端C===HTTP请求===>服务端S:GET index.html http/1.1
客户端C<==HTTP响应====服务端S:HTTP/1.1 200 OK HTML文件内容

HTTP协议本身是个无状态协议,它不像其他基于会话的协议那样去不断追踪、记忆事务处理过程。而它要做的就只是简单的

连接=>发起HTTP请求(HTTP Request)=>得到HTTP响应(HTTP Response)=>断开连接

而平常我们通过浏览器浏览网页这个过程,浏览器自动完成发送HTTP请求及对服务端应答的数据进行解析的工作,从而将网页呈现给我们。

我们使用cURL要做的就是模仿浏览器的动作,因此要对HTTP请求的格式进行进一步的解析。

一、HTTP请求

在你向HTTP服务器请求一个资源(比如简单的使用浏览器打开一个网页),TCP三次握手建立连接后,HTTP请求发出。

HTTP请求信息由3部分组成:

 l 请求行(Request Line)

 l 请求头(Request Header)

 l 请求正文(Message Body)

 1、HTTP请求行

典型的HTTP请求行格式为:

 HTTP命令 请求资源的URI HTTP版本号

HTTP请求行例子如下:

GET / HTTP/1.1\r\n

这个请求行的意思是:请求得到(GET)/路径下的默认主页文件,使用HTTP协议1.1版本。

根据HTTP标准,HTTP请求可以使用多种请求方法。例如:HTTP1.1支持7种请求方法:GET、 POST、HEAD、OPTIONS、PUT、DELETE和TARCE。而服务器也可以自定义请求命令供客户端使用。具体请参考HTTP的RFC文档。 而我们最常用的是GET和POST命令:

1)GET命令

GET主要用于取得URL指定的资源信息,也可用来提交表单。GET提交的信息实际上是附加在url之后作为URL的一部分。

当年盛行一时的SQL注入,最常见的检测手段就是在GET提交的链接后加单引号来检测是否存在注入漏洞。

如提交username和password两个字段,正常的GET网址如下:

http://www.xxx.com/login.php?username=user&password=pass

网站后台就会在_GET数组中取得username和password的值,从而组建SQL语句:

select count(*) from user_table where username=user and password=pass

如果返回的count值大于0即为用户名密码正确。

而添加单引号后:

http://www.xxx.com/login.php?username=user&password=pass'

组建的SQL语句为

select count(*) from user_table where username=user and password=pass'

这个SQL语句执行出错,网页显示错误信息,黑客从而得知网页有SQL注入漏洞。

因此使用GET提交表单是不安全的,只进行了简单的编码无法加密,可以很容易的从网址猜出各字段的意思。而且受限于URL长度限制,GET提交表单能携带的数据也有限。

2)POST命令

POST主要用于提交表单,尤其是提交大批量的表单数据。

POST方法克服了GET方法的一些缺点。通过POST方法提交表单数据时,数据不是作为URL请求的一部分而是作为标准数据传送给Web服务器,这就克服了GET方法中的信息无法加密和数据量太小的缺点。

HTTP请求的下一段数据为HTTP请求头。

2、HTTP请求头

HTTP请求头中主要包含关于请求本身或者客户端的有用信息,比如浏览器的类型、浏览器语言、编码、压缩算法等信息。服务器上的动态脚本如PHP等可以利用请求头信息生成动态的网页内容。

典型的HTTP请求头例子如下:

Connection: keep-alive
Cache-Control: max-age=0
User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.168 Safari/535.19 QIHU 360EE
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Referer: http://www.adeploy.com/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8
Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3

\r\n表示换行。由此可以看到HTTP请求头是由几行“属性:值”对组成的,例如属性Accept的值为*/*\r\n ,表示客户端可以接受任意数据类型。

而我们最常用的是User-Agent字段和Referer字段,分别用于指定客户端类型和来源页面。

最末行额外多出的一对\r\n表示一个空白行,此空白行表示HTTP请求头结束,以下部分为请求正文。

3、HTTP请求正文

 HTTP请求正文经常为空,除非需要向服务端提交信息,如在使用POST向网站提交表单的时候。

例如如下是一个完整的HTTP请求的例子:

GET / HTTP/1.1
Host: www.adeploy.com
Connection: keep-alive
Cache-Control: max-age=0
User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.168 Safari/535.19 QIHU 360EE
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Referer: http://www.adeploy.com/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8
Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3
二、HTTP响应

当收到HTTP请求之后,HTTP服务器会进行处理然后返回一个HTTP响应给客户端(典型的客户端为浏览器)。HTTP响应中包含几乎与HTTP请求同样类型的数据。

HTTP响应信息也由3部分组成:

 l 响应行(Response Status Line)

 l 响应头(Response Header)

 l 响应正文(Message Body)

响应行以服务端使用的HTTP协议版本号开始,后加响应状态码,表示请求结果状态,例如:

HTTP/1.1 200 OK

状态码200表示请求成功。

紧接着的是响应头。响应头与请求头十分相似,也是由几行“属性:值”对组成。其中包含关于服务器的有用信息、响应数据等。典型响应头如下:

Content-Type: text/html; charset=utf-8
Cache-Control: no-cache
Expires: Fri, 01 Jan 1990 00:00:00 GMT
Content-Encoding: gzip
Vary: Accept-Encoding
Date: Tue, 31 Jul 2012 07:20:31 GMT
Server: Google Frontend
Content-Length: 10387

如果请求成功,响应正文中将包含请求的数据,如图片文件的二进制数据、HTML文件等。一旦响应正文传输完毕,服务端又没有使用HTTP 1.1版本的Keep-Alive请求,HTTP连接将会断开。

三、Cookie

Cookie是服务器为了辨别用户身份、进行session跟踪用户识别,而储存在客户端的数据。用以判断在HTTP传输中的状态,从而弥补HTTP协议无状态的缺陷。

比如我们登录一个网站后,关闭网页后重新打开网页,服务端就可以通过cookie信息判断我们曾经登录过,从而跳过重新登录的过程,让用户感觉到亲切、方便、人性化。

当客户端向服务端发起请求时,浏览器会自动将cookie信息添加在HTTP请求头中。例子如下:

Cookie: __utmc=90639562; __utma=90639562.1273157993.1343361841.1343361841.1343718828.2; __utmb=90639562.1.10.1343718828; __utmz=90639562.1343361841.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)

在我们使用cURL时,每次访问网页都相当于浏览器打开关闭一次,因此cookie会起到很大的作用。

HTTP协议概述的更多相关文章

  1. javaweb学习总结十九(http协议概述以及http请求信息分析)

    一:http协议概述 1:http协议定义 2:使用telnet程序连接web服务器,获取资源 3:http协议:超文本传输协议,它是基于tcp/ip协议,就是建立在tcp/ip之上工作的, http ...

  2. 嵌入式linux的网络编程(1)--TCP/IP协议概述

    嵌入式linux的网络编程(1)--TCP/IP协议概述 1.OSI参考模型及TCP/IP参考模型 通信协议用于协调不同网络设备之间的信息交换,它们建立了设备之间互相识别的信息机制.大家一定都听说过著 ...

  3. 【HTTP 2】HTTP/2 协议概述(HTTP/2 Protocol Overview)

    前情提要 在上一篇文章<[HTTP 2.0] 简介(Introduction)>中,我们简单介绍了 HTTP 2. 在本篇文章中,我们将会了解到 HTTP 2 协议概述部分的内容. HTT ...

  4. JAVA之旅(三十二)——JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用

    JAVA之旅(三十二)--JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用 GUI写到一半电脑系统挂了,也就算了,最多GUI还有一个提示框和实例, ...

  5. 【高速接口-RapidIO】1、RapidIO协议概述

    一.RapidIO背景介绍 RapidIO是由Motorola和Mercury等公司率先倡导的一种高性能. 低引脚数. 基于数据包交换的互连体系结构,是为满足和未来高性能嵌入式系统需求而设计的一种开放 ...

  6. 1.RapidIO协议概述

    转自https://www.cnblogs.com/liujinggang/p/9925859.html 一.RapidIO背景介绍 RapidIO是由Motorola和Mercury等公司率先倡导的 ...

  7. [编程] TCP协议概述

    TCP 协议概述 1.TCP提供一种面向连接的.可靠的字节流服务. 2.两个应用程序通过TCP连接交换8bit字节构成的字节流. 3.每个TCP首部都包含源端和目的端的端口号,用于寻找发端和收端应用进 ...

  8. 搞懂分布式技术4:ZAB协议概述与选主流程详解

    搞懂分布式技术4:ZAB协议概述与选主流程详解 ZAB协议 ZAB(Zookeeper Atomic Broadcast)协议是专门为zookeeper实现分布式协调功能而设计.zookeeper主要 ...

  9. tcp/ip详解 卷1 -- 协议概述

    第一章 概述 分层 TCP/IP 通常被认为是一个四层协议系统. 每一层负责不同的功能. 链路层, 也成为数据链路层或者网络接口层. 通常包括 操作系统中的设备驱动程序和计算机中对应的网络接口卡. 主 ...

  10. Javaweb学习笔记——(八)——————常见系统体系结构,Tomcat,以及web的内部外部应用,http协议概述

    ·软件系统体系结构: 1.常见软件系统体系结构B/S.C/S C/S 1.C/S结构即客户端/服务器(Client/Server),列如QQ: 2.需要编写服务器端程序,以及客户端程序,列如我们安装的 ...

随机推荐

  1. python(12)给文件读写上锁

    目的:当我们用脚本去爬取数据或者向文件中写数据的时候,有时候需要两个或者多个脚本同时向一个文件中读写 于是乎就会出现写乱的情况,于是乎我们就需要把正在写的文件先锁起来,只让当前的写,写完后再释放 代码 ...

  2. CLR如何调用虚方法、属性和事件

    方法代表在类型或类型的实例上执行某些操作的代码.在类型上执行操作,称为静态方法:在类型的实例上执行操作,称为非静态方法.任何方法都有一个名称.一个签名和一个返回值(可以是void). CLR允许一个类 ...

  3. 通过JSTL+EL实现循环迭代

    使用前需要导入包 jstl.jar 和 standard.jar <%@ page language="java" import="java.util.*,com. ...

  4. Android使用KSOAP2调用WebService及正确导入jar包的问题(转)

    Android使用KSOAP2调用WebService及正确导入jar包的问题(转)     错误信息 最近在学Android使用KSOAP2调用现有的Webservice的方法,期间在网上找了很多代 ...

  5. nvl

    NVL是Oracle PL/SQL中的一个函数.它的格式是NVL( string1, replace_with).它的功能是如果string1为NULL,则NVL函数返回replace_with的值, ...

  6. 采访ServiceStack的项目领导Demis Bellot——第2部分(转)

    ServiceStack是一个开源的.支持.NET与Mono平台的REST Web Services框架.InfoQ有幸与Demis Bellot深入地讨论了这个项目.在这篇两部分报道的第2部分中,我 ...

  7. Oracle中的单行函数

    Oracle中的单行函数 1 字符函数 UPPER()--将字符串转换为大写 SELECT UPPER('abc') FROM dual; LOWER()-将字符串转换为小写 SELECT LOWER ...

  8. POJ 2352 【树状数组】

    题意: 给了很多星星的坐标,星星的特征值是不比他自己本身高而且不在它右边的星星数. 给定的输入数据是按照y升序排序的,y相同的情况下按照x排列,x和y都是介于0和32000之间的整数.每个坐标最多有一 ...

  9. DML(Oralce)

    创建视图简化上面              视图就是一张表    一个子查询  虚表 视图通常以v$开头 grant create table,create view to scott;        ...

  10. Android——ImageSwitcher 图片切换

    public class ImageSwitcherActivity extends Activity implements OnClickListener,        ViewFactory { ...