2012-08-08 1 views
5

私は簡単なCakePHPアプリケーションを使って、投稿を作成したり編集したりすることができます。そして私は、PhoneGapにアプリケーションを将来、ある時点で入手しようとしています。CakePHPを使ってAPIを作成する

したがって、JSONをAJAXリクエストで使用するためのAPIを作成しましたが、RESTを使用していない、または他のコードとは別の設定コントローラ内にあります。

(注:私はこの例ではJSONにそれを回すについての一部が欠落しています):私は、その後使用するためにAJAXを使用して呼び出すことができますdomain.com/api/posts/all(これを達成するためのカスタムルートを作成します)のようなURLを作成するには

class ApiController extends AppController { 

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

を私のモバイルアプリで

ここで私の質問は、RESTを使用して別の方法でそれを行うのでしょうか?私は非常にアプリケーションを構築するための初心者であり、私の強みはバックエンド開発ではなくフロントエンドにあるので、これを助けてくれれば助かります。

+0

PhoneGabアプリ内でSencha Touchを使用する場合は、RESTfulの代わりに[Ext.Direct implementation](http://banchaproject.org)を使用することもできます。 –

答えて

3

CakePHPでRESTをオンにすると、基本的に適切なHTTPメソッドがアクションにルーティングされます。したがって、GETリクエストは、索引またはビュー・アクション、削除アクションにルーティングされたDELETEリクエストなどにルーティングされます。

これにより、APIを使用するユーザーにとって非常に簡単なエンドポイントが作成されます。適切なアクションへのHTTPメソッドケーキ意志ルート、それに応じて、このエンドポイントを呼び出すときに(任意のHTTPリクエストの構文エラーを許す):ルートは/posts/index.jsonする

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

GETリクエストを

http://book.cakephp.org/2.0/en/development/rest.html

:ルートは、あなたの質問のほとんどにお答えしますこれを読ん

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 

を/posts/edit/1.jsonする

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

A POSTリクエスト

+0

さてされている... RESTを使わないでコントローラの標準的なメソッドを作成するだけとどう違うのですか?また、これは別の質問のように思えるかもしれませんが、DELETEメソッドはフォームのPOSTメソッドまたはGETメソッドよりも何を提供していますか? – Cameron

+0

これは、開発者にとっても、あなたにとっても(文書作成のために)簡単です。より少ないエンドポイント。第二に、適切なHTTPメソッドが必要*です。たとえば、ユーザーがブラウザで '/ api/posts/delete/1'にアクセスしてポストを削除できなくなった場合、実際には適切な方法でDELETEを要求する必要があります。また、CakeのRESTシステムでは、さまざまなコンテンツタイプを受け入れ、 '$ this-> request-> data'で自動的にデコードすることができます。それがうまくいかない場合は、それを行う必要はありませんが、RESTful APIを作成する適切な方法です。 – jeremyharris

3

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

  • Webサービスによってサポートされているデータのインターネットメディアタイプの

    • ベースURI:

      はその後、通常は心に留めておくべき4点があります。
      これは多くの場合JSON、XML、またはYAMLですが、その他の有効なインターネットの メディアタイプにすることもできます。

    • HTTPメソッド (GET、PUT、POST、またはDELETEなど)を使用してWebサービスでサポートされる一連の操作。
    • APIは、ハイパーテキストは

    を参照してください、詳細についてhttp://en.wikipedia.org/wiki/Representational_state_transferを駆動する必要があります。

    ここで、上記のコードを以下の擬似コードに近いものに変更することをお勧めします。

    1)リソースの存在が重要です。あなたの投稿は、URIによってアクセスできるリソースの集合であると考えてください。(認証&許可があなたにも対処することがあります他の関心事です):投稿

    2のコレクションに

    api.domain.com/resources/posts =>このURIはポイント)操作のセットものあなたはHTTPメソッドを使用してサポートしたいと思うでしょう/動詞は、私たちがこれを行うことで、コレクションの1人のメンバーだけを取得したい場合があります例として、定義される必要があります。

    api.domain.com/resources/posts/12

    以下は、入荷時に見つかる可能性があるリクエストヘッダ&の本文ですこのURIの要求:

    は受け入れ:アプリケーション/ JSON
    のContent-Type:アプリケーション/ JSON
    リクエストURL:http://api.domain.com/resources/posts/12
    要求メソッド:GET

    アプリケーションは、そのタイプを処理できる必要がありますURIの操作を規定する必要はなく、このように記述されたURIを持たずに、

    を返します。

    domain.com/api/posts/ すべて

    あなたのURIは、この方法のモデルでなければなりません:

    リソース/記事/コレクションから一つのメンバーを取得するためのリソース/種類/アイテムとして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がどのように見えるかのアイデアを提供したいと考えています。


    "アプリケーションはリソースの識別子と必要なアクションの2つを知ることによってリソースとやり取りできます"。

    うまくいけば、これが助けになりました。

  • 関連する問題