【问题标题】:Create API using CakePHP使用 CakePHP 创建 API
【发布时间】:2012-08-08 12:03:16
【问题描述】:

我有一个简单的 CakePHP 应用程序,它允许用户创建和编辑帖子。而且我希望在未来的某个时候将该应用程序引入 PhoneGap。

因此,我创建了一个 API,它可以输出 JSON 以用于 AJAX 请求,但我觉得我做错了,因为我没有使用 REST 或做任何不同的事情,将它与其他代码区分开来控制器。

例如(注意:对于这个例子,我错过了将其转换为 JSON 的部分)

class ApiController extends AppController {

    function index() {
        $posts= $this->Post->find('all');
        $this->set(compact('posts'));
    }
}

要创建一个 url,如:domain.com/api/posts/all(将创建自定义路由来实现此目的),然后我可以使用 AJAX 调用它以在我的移动应用程序中使用。

现在我的问题是使用 REST 做这件事会有什么不同?我是构建应用程序的新手,我的优势在于前端而不是后端开发,所以任何指针,在这方面的帮助将不胜感激。

【问题讨论】:

标签: php cakephp


【解决方案1】:

在 CakePHP 中启用 REST 基本上将正确的 HTTP 方法路由到操作。因此,GET 请求将被路由到索引或视图操作,DELETE 请求将被路由到删除操作,等等。

这为使用您的 API 的人们创建了一个非常简单的端点。然后在调用此端点时,Cake 会根据 HTTP 方法将其路由到正确的操作(原谅任何 HTTP 请求语法错误):

// single endpoint
http://example.com/api/posts

一个路由到 /posts/index.json 的 GET 请求

GET /api/posts.json HTTP/1.1
Host: example.com

一个路由到 /posts/edit/1.json 的 POST 请求

POST /api/posts/1.json HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded; charset=utf-8
Content-Length: 24

data[Post][name]=updated

阅读本文将回答您的大部分问题:http://book.cakephp.org/2.0/en/development/rest.html

【讨论】:

  • 好吧,已经说过了...它与仅在控制器中创建标准方法而不使用 REST 有何不同?此外,这似乎是一个不同的问题,但是 DELETE 方法比表单的 POST 或 GET 方法提供了什么?
  • 一方面,对开发人员和您来说(创建文档)都更容易。更少的端点。其次,它需要正确的 HTTP 方法。例如,用户不能再在浏览器中访问/api/posts/delete/1 并删除帖子,他们实际上必须使用正确的方法请求删除。此外,Cake 的 REST 系统将允许您接受不同的内容类型并自动为您解码 $this->request->data。如果它不适合您,则无需这样做,但它是创建 RESTful API 的正确方法。
【解决方案2】:

如果您关心的是对其余原则的真实情况。

那么,通常有4点需要牢记:

  • Web 服务的基本 URI
  • Web 服务支持的数据的 Internet 媒体类型。
    这通常是 JSON、XML 或 YAML,但也可以是任何其他有效的 Internet 媒体类型。
  • 使用 HTTP 方法的 Web 服务支持的一组操作 (例如,GET、PUT、POST 或 DELETE)。
  • API 必须是超文本驱动的

更多详情请见http://en.wikipedia.org/wiki/Representational_state_transfer

现在,话虽如此,我建议将上面的代码更改为接近下面的伪代码。

1) 资源的存在是关键,将您的帖子视为可以通过 URI 访问的资源集合。(身份验证和授权是您可能还需要处理的其他问题):

api.domain.com/resources/posts => 这个 URI 指向一个帖子集合

2) 需要定义您希望使用 HTTP 方法/动词支持的一组操作,例如,我们可能希望通过执行以下操作仅检索集合的一个成员:

api.domain.com/resources/posts/12

以下是可以在此 URI 的传入请求中找到的请求标头和正文:

接受:应用程序/json
内容类型:application/json
请求网址:http://api.domain.com/resources/posts/12
请求方法:GET

您的应用程序应该能够处理该类型的请求,而无需在 URI 中规定操作,让我们回到第 (1) 点,

而不是这样写一个 URI:

domain.com/api/posts/全部

您的 URI 应该这样建模:

resources/posts/12 作为资源/类型/项目从集合中检索一个成员,
资源/帖子作为资源/类型与整个集合一起使用。

下面是代码示例:

通用抽象类 在这里你可以实现一些常见的任务。 如果,您正在使用基于服务的实现 这也可以通过服务来完成。

abstract class ResourcesController extends AppController {
}


class PostResourcesController extends ResourcesController {

    /**
     * By the time this method is called in your controller/class, you already know
     * that the HTTP method is GET.
     * 
     * @param Request\$_GET $request A request instance
     * @param int           $postId  The post ID to retrieve
     *
     * @return Response A reponse instance
     */
    function getPost(Request $Request, $postId = null)
    {
      /**
       * Here you can use the request object to get
       * the response content type    
       * the requesting client accepts. Example JSON or XML.
       */

       /**
        * using the $postId you can then query your database  
        * to retrieve a post with that ID or use a sort of 
        * service.
        */

         /**
         * Once you implemented a you logic
         * you can build a response to return.
         */
    }
}

这段代码不完整,但我希望它能给 您对真正的 Restful API 的外观有所了解。

确保它的关键
“应用程序可以通过了解两件事与资源进行交互:资源的标识符和所需的操作”。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    • 2013-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多