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基础介绍(下)