现在的位置: 首页 > 综合 > 正文

HTTP协议与REST基础介绍(上)

2013年09月04日 ⁄ 综合 ⁄ 共 3016字 ⁄ 字号 评论关闭
文章目录

http://rockux.com/archives/http%E5%8D%8F%E8%AE%AE%E4%B8%8Erest%E5%9F%BA%E7%A1%80%E4%BB%8B%E7%BB%8D%EF%BC%88%E4%B8%8A%EF%BC%89

 

超文本传输协议是网络应用基本,当你传输文档或者发送ajax请求的时候都会用到。但是对于一般的web开发者来说HTTP协议并不熟悉。这篇文章会介绍一些HTTP、REST的基本原理,然后你可以用这些构建一些跨系统跨平台的接口。

为什么是REST

REST是独立系统间一种简单的通信方法。它从2005年开始流行,用来构建一一些像Twitter API这样的应用。 因为REST允许以最小的开销为不同的系统提供服务。从理论上来说,REST并不依附于网络,但是REST总是可以作为HTTP的一种补充,所以他可以用在任何HTTP可用的地方。

另一种办法是在HTTP之上再建立一个协议。需要基于XML语法,典型的例子就是SOAP。你需要学习一些全新的东西,却没有发挥HTTP的威力。REST是HTTP驱动的,并且完全发挥了HTTP的能力,所以这也是学习HTTP的最佳实践。

我们会先做一个概述,然后深入到HTTP的每个部分:URL,HTTP请求,状态码。我们也会展示如何在REST使用它们。我们会通过一个公司客户与数据的应用来讲解。

HTTP

HTTP是网络上允许发送和接收文档的一个协议。所谓协议就是决定哪些信息是可以交换的、哪些信息是可以响应给其他人的一系列规则。另外一个常见的协议就是POP3,这个协议可以将你的邮件存储在硬盘上。

在HTTP中,有两种角色:服务端和客户端。一般总是客户端发起请求,然后服务端做出响应。HTTP是基于文本的,虽然消息体内可能包含其他类型的内容。使用文本形式很便于展示和交换。

HTTP消息由消息头和消息内容构成。 消息内容可以为空,他包含在头部指令指挥下的你要传递给其他人的消息内容。 消息头包含元数据,比如编码信息,在一次请求中也包含了重要的HTTP方法。在REST下,你经常发现头数据比消息内容还重要。

检测HTTP请求

如果你使用Firefox的Firebug,那么你点击网络标签,然后激活,这样你在浏览的时候就能看见请求了。另一个可以查看HTTP请求的办法就是使用客户端,比如cURL。

安装cURL之后,键入下面的命令:
curl -v google.com
他会显示完整的HTTP请求,请求前面会有<,响应则以>开始。

URLs

URL是用来区别你想要操作的对象的。我们可以认为每一个URL是一个资源。事实上,一个页面就是一种资源。从我们的示例出发,我们管理着公司的客户:

/clients

当链接为:

/clients/jim

的时候,就会鉴别出我们的客户,架设他是唯一一个叫jim的。

在这些例子中,我们一般不包括主机的URL地址,但是主机域名是确定这个url是网络上的唯一资源的重要的标识。主机地址一般与资源地址在消息头里是分离的:

1
2
GET /clientes/jim HTTP/1.1
Host:example.com

下面的这个就不是REST风格的:
/clients/add
这是因为他用一个链接来描述一个动作。这是区别REST系统和其他非REST系统的基本点。

最后,URL必须根据需要精确设计。设计的时候URL不应该是需要数据才能确定的。

但是怎么区别每个动作呢,比如你想发起一个新请求而不是重新请求,这就该要提到HTTP动作了。

HTTP动作

每一个请求在消息头都有确定的动作。在消息头的第一个全大写词中表示。比如:
GET / HTTP/1.1
表示使用的是GET方法,再比如:
DELETE /clients/anne HTTP/1.1
表示使用了DELETE方法。

HTTP方法用来告诉服务器根据URL来做什么,一些附加信息可以写在消息体内。在cURL中可以使用-d参数来添加数据。

如果你使用过HTTP表单,那么你肯定对GET和POST方法很熟悉。其实还有很多HTTP方法。可以用来生成REST API的方法有GET,POST,PUT,DELETE。其他的方法也有用比如HEAD和OPTIONS,但是很少用到。

GET

GET方法是最简单的HTTP请求方法,当你点击一个链接,或者在地址栏输入一个地址的时候就会触发。他把客户端的数据通过URL传递给服务端。使用GET方法时候,数据在服务端是不能被修改的。从这个角度来说GET请求是只读的,当然,一旦数据到了服务端,那么想做什么都是自由的。

PUT

PUT请求可以用来通过URL创建或者更新资源。例如:
PUT /client/robin
可能会在服务端创建一个robin的客户。你会发现,在REST中,后端实现是完全被屏蔽的,这条请求中不会告诉服务端怎么去创建这个客户,只是告诉他要创建。这样你就可以在需要的时候很容易的升级后端程序。PUT请求将需要修改的数据存储在消息体内。在cURL中,你可以添加-d参数。
curl -v -X PUT -d “some text”

DELETE

DELETE动作与PUT相反,用来删除资源。

POST

当你对服务端需要进行重复请求的时候可以使用POST方法,另外,POST请求会引起服务端对你所POST的URL的消息体的数据的处理。

POST /clients/
不会请求在clients的资源,但是可以修改。比如服务端可以自己添加一个客户的ID。

PUT请求可以很容易的替代POST请求,反之亦然。有的系统只使用一个,有的使用PUT来创建操作,使用POST修改操作。

有些时候POST请求会触发服务端的一些操作,而这写操作不只是简单的创建、修改、删除。当然这在REST中有点超出范围了,在我们的例子中,会一直使用PUT。

HTTP方法分类

安全和不安全的方法

安全的方法是指那些不修改资源的。上面列出的四个方法中,只有GET方法是安全的。其他都会修改资源。

幂等方法(Idempotent Methods)

这写方法无论重复多少次,都返回相同的结果,他们有GET PUT DELETE。唯一一个不是幂等方法的就是POST。PUT和DELETE方法被归类为幂等方法有些奇怪,然而,这也是很好解释的:重复发送一个消息体相同的PUT方法,他只会对同样的资源做同样的处理,所以还是没变。同样,删除就更好理解了。不论你执行多少次PUT和DELETE,结果都是一样的。

需要注意的是,是你来决定这些方法之后做什么操作。对于建改删没有固定的实现,你必须自己根据特定的环境做特定的处理。

综述

我们可以总结为:服务端与客户端通过URL来交换信息。

我们认为请求和响应都包含资源的载体。所谓载体,就是指信息按照一定的格式表现出来。消息头和消息体都是载体的一部分。

HTTP的消息头,包括一些元信息,都是HTTP规范里定义过的。必须都是纯文本的而且有一定的格式要求。

消息体的内容可以使任何格式的,这也是HTTP请求的闪光点。如你所知的你可以发送文本、图片、视频等等。通过不同的元信息或者URL,你可以为一个资源请求不同的载体。比如,你可以为浏览器发送一个网页,为其他应用发送JSON格式的数据。

HTTP的响应必须在消息体内明示,比如:
Conrtent/Type:application/json

为了简单起见,我们的示例程序使用JSON来传输数据。但是一个好的架构应该可以很轻松的为不同的请求返回不同格式的数据。

【上篇】
【下篇】

抱歉!评论已关闭.