5

ユーザーが投稿を作成および編集できるようにする単純な CakePHP アプリケーションがあります。そして、将来のある時点でアプリケーションを PhoneGap に取り込もうとしています。

したがって、AJAX 要求で使用するために JSON を吐き出す API を作成しましたが、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

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 に答える
3

あなたの懸念が残りのプリンシパルに当てはまる場合。

次に、通常、留意すべき 4 つのポイントがあります。

  • Web サービスのベース URI
  • Web サービスがサポートするデータのインターネット メディア タイプ。
    多くの場合、これは JSON、XML、または YAML ですが、その他の有効なインターネット メディア タイプにすることもできます。
  • HTTP メソッド (GET、PUT、POST、DELETE など) を使用して Web サービスによってサポートされる操作のセット。
  • API はハイパーテキスト ドリブンである必要があります

詳細については、http://en.wikipedia.org/wiki/Representational_state_transferを参照してください。

そうは言っても、上記のコードを以下の疑似コードに近いものに変更することをお勧めします。

1) リソースの存在が重要です。投稿を、URI でアクセスできるリソースのコレクションと考えてください (認証と承認は、処理したい他の懸念事項です)。

api.domain.com/resources/posts => この URI は投稿のコレクションを指します

2) HTTP メソッド/動詞を使用してサポートする一連の操作を定義する必要があります。例として、次のようにしてコレクションのメンバーを 1 つだけ取得する場合があります。

api.domain.com/resources/posts/12

以下は、この URI の着信要求で検出される可能性のある要求ヘッダーと本文です。

Accept: application/json
Content-Type: application/json
Request Url: http://api.domain.com/resources/posts/12
Request Method: GET

アプリケーションは、URI で操作を規定する必要なく、そのタイプの要求を処理できる必要があります。ポイント (1) に戻ります。

URI を次のように記述するのではなく、

domain.com/api/posts/すべて

URI は次のようにモデル化する必要があります。

コレクションから 1 つのメンバーを取得するための resources/type/item としての resources/posts/12、コレクション
全体を操作するための resources/type としての resources/posts。

コードの例を次に示します。

一般的な抽象クラス ここで、いくつかの一般的なタスクを実装できます。サービスベースの実装を使用している場合、これはサービスによっても実現できます。

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 がどのようなものかを理解していただければ幸いです。


「リソースの識別子と必要なアクションという 2 つのことを知ることで、アプリケーションがリソースとやり取りできる」ことを確認することが重要です。

うまくいけば、これは役に立ちました。

于 2012-08-08T15:53:28.660 に答える