HTTP协议与REST基础介绍(下)
为了体验不同的请求方法,你在客户端需要一个支持改变请求类型的东东。不幸的是,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,其他的忽略:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$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'); } |
我们会有两种输出:
如果还有更多的校验项,我们假设是客户名,当然,还需要根据方法的不同进行不同的处理,我们使用switch来做判断:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
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中也很常用:
表示一切正常。
表示资源成功创建,通常是对PUT和POST请求的返回。
通常在PUT和POST请求中,表示数据没有通过验证等情况。
这个返回表示要访问的资源需要授权。
这个资源不支持这种HTTP方法。
表示冲突。例如你使用了两次PUT请求创建一个资源。
服务器的内部错误。
我们来做几个简单的操作来看看,我们现在要获取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,你还有很多其他的选择:
refer
转载请注明:
作者:RockUX–WEB前端
出自:HTTP协议与REST基础介绍(下)