5

我有一个简单的 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 做这件事会有什么不同?我是构建应用程序的新手,我的优势在于前端而不是后端开发,所以任何指针,对此的帮助将不胜感激。

4

2 回答 2

3

如果您关心的是要忠于其余的校长。

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

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

有关详细信息,请参阅http://en.wikipedia.org/wiki/Representational_state_transfer

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

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

api.domain.com/resources/posts => 这个 URI 指向 Posts 的集合

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

api.domain.com/resources/posts/12

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

接受:application/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 可能是什么样子。

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

希望这有帮助。

于 2012-08-08T15:53:28.660 回答
3

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

这为使用您的 API 的人创建了一个非常简单的端点。然后在调用此端点时,根据 HTTP 方法,Cake 会将其路由到正确的操作(原谅任何 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

于 2012-08-08T14:58:36.520 回答