使用CodeIgniter 创建 RESTful 服务 REST API

介绍
在现在这个时代,你很容易把例如blog,CMS等等的服务整合到自己的网站里面。有一件事你也许没想过就是利用CodeIgniter去创建API接口。尝试几个RESTful服务的实现方法后,我发现过程非常麻烦,而且缺少你所期望的一些RESTful的功能。所以我自己建了一个,这个教程将告诉你怎样去利用这些代码创建属于自己的REST API,而且我将举些例子告诉你如何与自己搭建的API进行交互。

 

假设
■你有自己的web 服务器,可以是本地localhost的,也可以是线上的,而且你知道如何去管理里面的问文件
■你必须阅读过CodeIgniter from Scratch教程(译者注:也就是懂得使用CodeIgniter框架)
■懂得怎么设置CodeIgniter
■懂一点点RESTful 服务知识
这个教程将分成2个部分讲。第一部分将从学习如何搭建RESTful 服务说起,然后深入,第二部分将讲如何用多种方式与自己搭建的REST API交互。

 

第一部分—创建REST API
 

第一步:建立demo
首先,你需要从Git中下载一份 codeigniter-restserver 代码回来。提取里面的代码,放置你的web server里面(译者注:下载方式如图所示,原作者的图片是Git改版前的,不适用于现在,所以本人斗胆替换掉了)

下载回来解压后,你会发现这已经是一个完整的CodeIgniter框架。这样可以让大家完整的使用这个 REST demo,而不用添加进自己的文件里才能使用。

打开“application/config/config.php” ,根据自己的情况设置base_url。。(译者注:其实就是CI的根目录的地址,这个我想用过CI的都懂吧。如果你真的什么都不懂,那么你把下载回来后的文件解压,然后重命名为restserver,把整个文件夹丢到WWW根目录下,把base_url设置成如图所示)

 

第二步:了解URL

根据第一步的情况,解压好文件,配置好base_url,我们就已经可以访问已经配置好RESTful的CodeIgniter框架了。。打开你的web server,输入你刚才设置的base_url地址,看看是不是已经可以正常访问啦。。

下面讲解下RESTful 的URL结构。基本情况如图所示:

(译者注:这里的情况我就不多说了,只是说下RESTful的CodeIgniter与正常的情况下URL结构的差异,前面的传值和URL结构都和正常情况下一致,就是在最后添加了一个参数format,这里可以定义返回的类型)

关于format的类型情况,可以看下图

为了让API提供更丰富的格式选择。。。format类型不仅仅只有上图所列举的3个情况,具体的类型如下所示:

  • xml – 几乎所有的语言都能识别XML格式
  • json – 对javascript和PHP APP非常有用. (译者注:其实还有一个jsonp格式)
  • csv – 可以被电子表格程序打开
  • html – 不解释
  • php – 返回的PHP是可以被eval函数执行过的
  • serialized – 序列化格式,对PHP非常有用(译者注:原文有误,记得是有个d结尾)

更RESTful的发送Content-type http 头部的方式将在后面提到。

 

第三步:了解代码

现在,你打开 “application/controllers/example_api.php”你立即会发现一些与正常CodeIgniter 控制器不同的地方。

REST_Controller

在MVC模式中,控制器是逻辑运算的中心。它们在用户请求或从控制器中获取数据时或者是需要输出html时,控制器的方法才会被调用。CodeIgniter 有它自己的逻辑来指挥控制器去怎么工作,但是我们现在情况和CodeIgniter不同,我们需要自己的REST_Controller 类 去指挥 相关的REST 逻辑运算,所以我们需要继承REST_Controller这个控制器。

正常情况下,我们的控制器是这样的

  1. <?php  
  2. class Example_api extends Controller {  
  3.  
  4. }  

现在我们需要变成这样

  1. <?php  
  2. require(APPPATH’.libraries/REST_Controller.php’);  
  3.  
  4. class Example_api extends REST_Controller {  
  5.  
  6. }  

(译者注:只能require REST_Controller 不能加入autoload 里面,至于为什么,擦,我也不懂)

添加方法

现在,你已经建立一个空的控制器了,那么让我们开始添加一些方法进去。一般来说,你要根据需要的资源和相应的HTTP操作来命名方法名。所以,下面的代码中你将看到有userusers 2个方法。

  1. <?php  
  2. require(APPPATH’.libraries/REST_Controller.php’);  
  3.  
  4. class Example_api extends REST_Controller {  
  5.  
  6.     function user_get()  
  7.     {  
  8.         // 返回关于1个用户的信息  
  9.     }  
  10.       
  11.     function users_get()  
  12.     {  
  13.         // 返回所有用户的信息  
  14.     }  
  15. }  

这看起来似乎有点奇怪,但是它可以让你使用一个相同的URL  根据实际的HTTP 请求来响应不同的动作。如果某人用了你不允许的方法去调用你的API,那么它会自动返回404错误码。如果你不太懂得HTTP动作的话,让我来解释下:

GET

不解释

POST

不解释

PUT

比较少用的一个HTTP动作,大多数浏览器都不支持,PUT动作用于创建一个资源。(译者注:与delete对应)

DELETE

和PUT一样,很少用到。DELETE动作用于删除一个资源.

(译者注:其实GET,POST已经可以完全替代PUT和DELETE的功能,所以后面2个动作非常少用到)

如果我们把上面的代码,改成允许每个HTTP动作来响应请求user的资源,则,可以写成这样:

  1. <?php  
  2. require(APPPATH’.libraries/REST_Controller.php’);  
  3.  
  4. class Example_api extends REST_Controller {  
  5.  
  6.     function user_get()  
  7.     {  
  8.         // respond with information about a user  
  9.         // 返回一个用户信息  
  10.     }  
  11.  
  12.     function user_put()  
  13.     {  
  14.         // create a new user and respond with a status/errors  
  15.         // 创建一个新用户和返回对应的状态码  
  16.     }  
  17.  
  18.     function user_post()  
  19.     {  
  20.         // update an existing user and respond with a status/errors  
  21.         // 更新一个已存在的用户信息和返回对应的状态码  
  22.     }  
  23.  
  24.     function user_delete()  
  25.     {  
  26.         // delete a user and respond with a status/errors  
  27.         // 删除一个用户和返回响应状态码  
  28.     }  
  29. }  

 

接受参数和返回数据

so,现在的控制器已经添加好相应的方法来响应不同的HTTP动作了,我们现在需要接受一些参数,然后我们可以使用CodeIgniter里的model和library的方法。正因为有这个好处,我们才使用CodeIgniter来建立我们的API,当然,我们也可以使用我们项目中已经存在的models和libraryies里的方法,而不用重新写过。

  1. <?php  
  2. require(APPPATH’.libraries/REST_Controller.php’);  
  3.  
  4. class Example_api extends REST_Controller {  
  5.  
  6.     function user_get()  
  7.     {  
  8.         $data = array(‘returned: ‘. $this->get(‘id’));  
  9.         $this->response($data);  
  10.     }  
  11.       
  12. &nbsp
    ;   function user_post()  
  13.     {         
  14.         $data = array(‘returned: ‘. $this->post(‘id’));  
  15.         $this->response($data);  
  16.     }  
  17.  
  18.     function user_put()  
  19.     {         
  20.         $data = array(‘returned: ‘. $this->put(‘id’));  
  21.         $this->response($data;  
  22.     }  
  23.  
  24.     function user_delete()  
  25.     {  
  26.         $data = array(‘returned: ‘. $this->delete(‘id’));  
  27.         $this->response($data);  
  28.     }  
  29. }  

$this->get()

用来接收GET参数

$this->post()

是CodeIgniter内置方法$this->input->post() 的别名,用来接收$_POST参数, 受到XSS保护。

$this->put()

接收put参数

$this->delete()

接收delete参数

$this->response()

发送数据给浏览器,数据格式是什么,默认是XML格式,你可以设置返回的HTTP状态码,例如用户这个例子,加入ID不存在,你可以使用 $this->response(array(‘error’ => ‘User not found.’), 404);

 

第四步:使用你的Models

从开始到现在,一个简单的DEMO API已经可以正常运行了。所以,下一步让我们用我们自己的Models来运行这些API

从下载回来的CodeIgniter中找到上图显示的2个文件,具体位置如下:

  • application/config/rest.php
  • application/libraries/REST_Controller.php

把这2个文件拷入你现有的项目里面,位置不变。下面的完整项目的控制器demo

  1. <?php  
  2. require(APPPATH.’/libraries/REST_Controller.php’);  
  3.  
  4. class Api extends REST_Controller  
  5. {  
  6.     function user_get()  
  7.     {  
  8.         if(!$this->get(‘id’))  
  9.         {  
  10.             $this->response(NULL, 400);  
  11.         }  
  12.  
  13.         $user = $this->user_model->get( $this->get(‘id’) );  
  14.           
  15.         if($user)  
  16.         {  
  17.             $this->response($user, 200); // 200 being the HTTP response code  
  18.         }  
  19.  
  20.         else 
  21.         {  
  22.             $this->response(NULL, 404);  
  23.         }  
  24.     }  
  25.       
  26.     function user_post()  
  27.     {  
  28.         $result = $this->user_model->update( $this->post(‘id’), array(  
  29.             ‘name’ => $this->post(‘name’),  
  30.             ‘email’ => $this->post(‘email’)  
  31.         ));  
  32.           
  33.         if($result === FALSE)&
    nbsp; 
  34.         {  
  35.             $this->response(array(‘status’ => ‘failed’));  
  36.         }  
  37.           
  38.         else 
  39.         {  
  40.             $this->response(array(‘status’ => ‘success’));  
  41.         }  
  42.           
  43.     }  
  44.       
  45.     function users_get()  
  46.     {  
  47.         $users = $this->user_model->get_all();  
  48.           
  49.         if($users)  
  50.         {  
  51.             $this->response($users, 200);  
  52.         }  
  53.  
  54.         else 
  55.         {  
  56.             $this->response(NULL, 404);  
  57.         }  
  58.     }  
  59. }  
  60. ?>  

这是一个通用型的demo,在第一个方法中,我们先把判断是否有id这个参数,如果没有就返回400状态码,如果有则继续执行,让user_model去获取user,有则返回数据,并返回200状态码,没则返回null以及404状态码。

第五步: API安全

现在,你的API已经建立好了。你需要给予相应的调用权限来保护它。设置登陆权限,用户名密码等可以打开 “application/config/rest.php”文件来修改。

  1. $config['rest_auth'] = ‘basic’;  //设置REST权限

None

设置为None的话,所有人都可以调用这个API.

Basic

设置为Basic的话,是一个相对不安全的登录方法,它应该只用于内部/安全网络.

Digest

这是一个更安全的选项,需要加密的用户名和密码,如果你想受保护的API让有权限的人调用,使用这个选项。

 

  1. $config['rest_valid_logins'] = array(‘admin’ => ’1234′); 

这个选项中,可以设置用户的账号和密码,账号是array的key,密码则是对应的value;你可以添加尽可能多的有权限调用你的API的用户进来。

 

(译者注:第一部分到此结束。。。有点累,第二部分下次再翻译了。。。预告一下,下一部分主要讲如何建立公开调用的REST API,例如twitter API  , 新浪API  等等

 

时间: 2024-07-30 13:15:04

使用CodeIgniter 创建 RESTful 服务 REST API的相关文章

结合Dojo和JAX-RS创建RESTful服务

在客户端和服务器端的简易实现 最新版本的 IBM WebSphere Application Server Feature Pack for Web 2.0,为您创建 Ajax 样式架构提供一个端到端的解决方案.在客户端,功能部件包提供开源 Dojo JavaScript 工具箱.在最新版的功能部件包中 JAX-RS (基于 Apache Wink 项目)提供服务器端库,可用来实现连接 Dojo 的 RESTful 服务. 除了广泛的用户界面小部件外,Dojo 还提供了丰富的数据服务 API,可

用Java技术创建RESTful Web服务

简介:JAX-RS (JSR-311) 是为 Java EE 环境下的 RESTful 服务能力提供的一种规范.它能提供对传 统的基于 SOAP 的 Web 服务的一种可行替代. 在本文中,了解 JAX-RS 的主要组件.本文用一个例子展示了一个企业如何使用 JAX-RS 内的功能以 一种 Restful 的方式公开员工的联系信息. 背景 多年来,开发人员使用各种工具在其 Java 应用程序内创建 RESTful 服务.由于 REST 架构的简单性,主要需求 - 接收 HTTP 消息和 头部的能

使用 Swagger UI 与 Swashbuckle 创建 RESTful Web API 帮助文件

作者:Sreekanth Mothukuru 2016年2月18日 本文旨在介绍如何使用常用的 Swagger 和 Swashbuckle 框架创建描述 Restful API 的交互界面,并为 API 用户提供丰富的探索.文件和操作体验. 源代码: 下载 SwaggerUi_2.zip 步骤 在本文中,我们将在 Asp.Net 创建一个简单的 Restful API,并整合 Swashbuckle 和 Swagger UI.本文分为三部分. 创建 Asp.Net Web API项目 通过实体数

使用Java创建RESTful Web Service(转)

REST是REpresentational State Transfer的缩写(一般中文翻译为表述性状态转移).2000年Roy Fielding博士在他的博士论文"Architectural Styles and the Design of Network-based Software Architectures"<体系结构与基于网络的软件架构设计>中提出了REST. REST是一种体系结构.而HTTP是一种包含了REST架构属性的协议. REST基础概念 在REST中所

Springboot 实现 Restful 服务,基于 HTTP / JSON 传输

"怎样的人生才是没有遗憾的人生?我的体会是:(1)拥有健康:(2)创造"难忘时刻":(3)尽力做好自己,不必改变世界:(4)活在当下." – <向死而生>李开复 基于上一篇<Springboot 整合 Mybatis 的完整 Web 案例>,这边我们着重在 控制层 讲讲.讲讲如何在 Springboot 实现 Restful 服务,基于 HTTP / JSON 传输. 一.运行 springboot-restful 工程 git clone

使用Docker创建Elasticsearch服务

最近需要做的几个功能都是基于Elasticsearch,但又不想污染系统环境,所以就花了些时间研究下如何使用Docker创建Elastcisearch服务. 首先先分别了解下Docker和Elasticssearch. Docker是什么? Docker是一个开源工具,能将一个WEB应用封装在一个轻量级,便携且独立的容器里,然后可以运行在几乎任何服务环境下. Docker的容器能使应用跑在任何服务器上并且表现一致.一个开发者在笔记本上建立的一个容器,能跑在很多环境下,如:测试环境,生产环境,虚拟

Yii2框架制作RESTful风格的API快速入门教程_php实例

先给大家说下什么是REST restful REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移. 它首次出现在2000年Roy Fielding的博士论文中,Roy Fielding是HTTP规范的主要编写者之一. 他在论文中提到:"我这篇文章的写作目的,就是想在符合架构原理的前提下,理解和评估以网络为基础的应用软件的架构设计,得到一个功能强.性能好.适宜通信的架构.REST指的是一组架构约束条件和原则." 如

IBM Worklight适配器与RESTful服务的集成

在第三篇文章中,Bhargav Perepa 介绍了三个重要主题:在 Rational Application Developer for WebSphere 中开发和测试一个 JPA 公开的 RESTFul 服务应用程序:使用该应用程序创建一个应用程序逻辑包,将它作为库在移动应用程序开发中使用的库:使用 Worklight Studio 开发和测试一个使用该库的服务器端移动应用程序组件. 通过阅读本文,您将学习如何使用 IBM® Rational® Application Developer

WCF RESTful服务的Google Protocol Buffers超媒体类型

Protocol Buffers 是在一个很理想的结构化数据的语言中立的序列化格式.你可以考虑一下XML或JSON,但更轻,更小的协议缓冲区. 这种格式的广应用于谷歌不同的系统之间交换数据. 由于其结构化数据的最佳表现,protocol buffers 是一个代表RESTful服务处理的数据很好的选择.要遵循REST的原则, protocol buffers 应作为一个新的超媒体类型的代表. 在当前版本(.NET 4) 的Windows通讯基础(WCF),包含一个新的媒体类型,需要相当数量的努力