HTTP协议与REST基础介绍(下)
来源:互联网 发布:java招聘要求本科 编辑:程序博客网 时间:2024/05/15 23:49
HTTP协议与REST基础介绍(下)
HTTP客户端库
为了体验不同的请求方法,你在客户端需要一个支持改变请求类型的东东。不幸的是,HTTP的表单时不行的,他只能发送GET和POST请求,真实的情况下,你可以通过一些独立的客户端应用程序或者javascript来完成。
在服务端编程之外,选择一个好的HTTP客户端编程语言是非常重要的。
最流行的客户端程序就是cURL了,在上篇中我们也有讲到一些简单的命令行应用。cURL有一个独立可运行的命令行端,也有适合各个程序的库。通常,cURL用来在PHP中处理HTTP请求。其他的语言,比如python,有自己原生支持的东西。
开始一个例子
我们的PHP程序很简单。我不从框架的角度来谈,只是从最基本的一些功能来讲述。我也不想用一些真实存在的API,比如twitter的,他经常会变化,而且也需要验证,这样就不能马上用了,所以。
运行这些实例,你需要安装PHP5,然后让本地服务器跑起来。也必须在5.2版本之上,这样才有json_encode()和json_decode()函数可用。
对于服务器端,最方便的当然还是Apache+php_mod,当然你也可以用其他的你更加熟悉的服务器端程序。这里还有一些转发规则,可以让你的应用更快的跑起来。
所有URL是/client开头的请求都需要转发到server.php文件。
在Apache中,你需要启动mod_rewrite模块,然后修改相应的配置,或者修改你的.htacess文件。这样server.php才能接受到所有的请求,如果你用ngnix也需要同样的配置。
范例程序是如何工作的?
将请求用REST的方法处理有两个关键点:
第一,根据HTTP请求的不同初始化不同的处理程序–即使都是同一个URL,在PHP中,有在global中有一个$_SERVER变量,可以决定使用哪种方法来发起请求。
1
$_SERVER['REQUEST_METHOD']
这个变量中的请求类型以字符串形式保存,比如’GET’,'POST’。
第二个关键点在于需要知道是那个URL,我们也可以使用PHP的全局变量。
1
$_SERVER['REQUEST_URI']
这个变量包含URL中第一个/开始后面的部分(http://不算),假如主机名是’example.com’,那么’http://example.com/’就会返回’/',’http://example.com/test/’就会返回’/test/’。
所以在这里我们只考虑以’client’开始URL,其他的忽略:
123456789101112131415
$resource = array_shift($paths); if ($resource == 'clients') { $name = array_shift($paths); if (empty($name)) { $this->handle_base($method); } else { $this->handle_name($method, $name); } } else { // We only handle resources under 'clients' header('HTTP/1.1 404 Not Found'); }
我们会有两种输出:
- 是clients资源,我们返回完整的列表
- 更多的校验
如果还有更多的校验项,我们假设是客户名,当然,还需要根据方法的不同进行不同的处理,我们使用switch来做判断:
123456789101112131415161718
switch($method) { case 'PUT': $this->create_contact($name); break; case 'DELETE': $this->delete_contact($name); break; case 'GET': $this->display_contact($name); break; default: header('HTTP/1.1 405 Method Not Allowed'); header('Allow: GET, PUT, DELETE'); break; }
返回状态码
你可能注意到了,在这个例子中,使用了PHP的header()方法来处理一些奇怪的东西。header()方法用来输出HTTP头部信息,并且保证相应的值是按照规范来的。头部信息是需要首先输出的,所以在你做完头部信息处理之前不要输出别的东西。有的时候,服务器需要增加一些自定义的头部信息,这在代码中要注明。
heaer信息包含一些列的东西,比如文本的编码方式,内容元素的MIME信息。这里,还有HTTP的返回状态码。状态码是用来告诉客户端这次请求的返回状态的。通常200表示一切正常。
服务器端应该返回最合适的状态码,这样客户端才能做相应的处理。很多对404很熟悉,当然,还有很多其他的状态码。
需要注意的是,这些状态码也不是非常的准确,这是HTTP本身的原因造成的。你应该尝试使用最接近现实的状态码,但是也不用太担心。
下面这些状态码,在REST中也很常用:
200 OK
表示一切正常。
201 Created
表示资源成功创建,通常是对PUT和POST请求的返回。
400 Bad Request
通常在PUT和POST请求中,表示数据没有通过验证等情况。
401 Unauthorized
这个返回表示要访问的资源需要授权。
405 Method Not Allowed
这个资源不支持这种HTTP方法。
409 Conflict
表示冲突。例如你使用了两次PUT请求创建一个资源。
500 Internal Server Error
服务器的内部错误。
实例程序实战
我们来做几个简单的操作来看看,我们现在要获取jim这个客户的信息,所以我们发起一个GET请求:
1
curl -v http://localhost:80/clients/jim
这会显示完整的信息头部。最后一行会显示内容。在这个例子中,将会是一个包含jim的地址的JSON对象。
下面,我们还可以一次请求所有的客户信息:
1
curl -v http://localhost:80/clients/
还可以创建一个客户:
1
curl -v -X PUT http://localhost:80/clients/paul -d '{"address":"Sunset Boulevard" }
然后你会得到一个包含Paul的所有客户的列表。
最后,删除一个客户:
1
curl -v -X DELETE http://localhost:80/clients/anne
这时候就看不到anne的客户信息了。
如果你想要读取一个不存在的客户信息,那么将会返回404错误。如果要创建一个已经存在的客户,那么会返回409错误。
总结
需要重点记住的是,HTTP是用来给两个没有任何共享资源的系统通信用的。通常,超越HTTP的部分越少,你的应用就更加易于在多个系统间运行。
使用PHP因为大家也都算熟悉。实际上,虽然PHP是WEB语言,他也不是做REST最佳选择,比如他处理PUT的办法就跟GET和POST很不同。最佳的PHP REST库在Zend Framework中有。
除了PHP,你还有很多其他的选择:
- 很多ruby框架(Rails和Sinata)
- Python中对REST的支持也不错
- node.js对REST也很好
refer
转载请注明:
作者:RockUX–WEB前端
出自:HTTP协议与REST基础介绍(下)
- HTTP协议与REST基础介绍(下)
- HTTP协议与REST基础介绍(上)
- HTTP协议基础(朋友介绍的)
- HTTP协议介绍(分析tinyhttpd【下】)
- HTTP与HTTPS协议介绍
- http协议与网络基础
- http协议的一些基础介绍
- http协议(下)
- HTTP协议(一):介绍
- HTTP协议(1)入门-协议介绍
- 基于HTTP 协议认证介绍与实现
- 【http协议】协议介绍
- HTTP 协议详解(基础)
- HTTP协议基础(一)
- HTTP协议基础(HTTP 1.1)
- 网络基础与协议入门——(1)HTTP协议重点
- HTTP协议学习(下)
- Http协议访问DataSnap Rest 服务器
- Eclipse找不到proguard.cfg解决办法
- self.name="object"和name="object"的区别?
- C++中值传递、指针传递、引用传递的总结
- HTTP协议与REST基础介绍(上)
- 4月15日会议交流所想到的
- HTTP协议与REST基础介绍(下)
- Node.js – Debugging with node-inspector
- SSH2 struts2 在线编辑器实现(一)
- 什么是跆拳道?ITF与WTF有什么区别?带级怎么分?
- Java 数据库处理类优化
- 程序员从初级到中级10个秘诀
- ITF跆拳道的24个特尔
- 为什么我们要放弃Subversion
- ITF跆拳道训练注意事项