PHPのシンプルなJSON-RPCのようなAPI

エントリー



JSON-RPC APIとは何ですか? これはAPIタイプの1つにすぎませんが、明確な標準でもあり、この記事には含まれていない可能性があります(はい、サモピスがあります)。



しばらくRESTful APIをいじって非常に怒った後、それが外側にあり、内側に折り畳むことができるので、私はGoogleに行って代替品を探しました。



そして、JSON-RPC APIについての記事に出会い、そのコンセプトに非常に興味を持ったので、最もシンプルなバイクを実装することにしました。



JSON-RPC APIの概念



この標準の主なアイデアは、特定のオブジェクト指向のアプローチです。



意味的には、クエリは次のようになります。



{ "api version": 0.1, "method": "object.method", "params": { "user id": 1234 } }
      
      





これは1つのリクエストにすぎません。このようなAPIの大きな魅力は、それらを美しく組み合わせることができることです。これにより、バッチリクエストに使用できるようになります(一部を読み込む)。



つまり、完全なリクエストは次のようになります。



 { "api_v": "0.1", "reqs": [ { "name": "my_important_request", "method": "user.kick_out", "params": { "id": "1234", "when": "now", ... } }, ... ] }
      
      





ここで、api_vはAPIバージョンであり、reqsはリクエストの配列です。 重要なのは、各リクエストにメソッド(class.method)、パラメーター、名前が含まれていることです。 ここで名前が大きな役割を果たします。 サーバーから応答を受信すると、その名前で要求の結果を参照できます。 例:ユーザーを追加するメソッドを持つリクエストは「user_creating」と呼ばれるべきですが、これはあなた次第です;)



書き始めましょう



最初に行うことはAPIクラスです。私の場合は、必要以上に実行しません。 一部のプロセスは私とは別のものですが、これは本質を変えるものではありません。



 <?php // @package 'api_0.1.php' // API  0.1 class API { private $last_resp; //    private $resp = []; //   public function __call( $method, $params ) { //  ,     $object = substr($method, 0, strpos($method, '.')); $method_name = substr($method, strpos($method, '.')+1); //   include_once __DIR__.'/source/'.$object.'.methods.php'; //      $resp = $object::$method_name($params); if(!empty($resp)) $this->last_resp = $resp; else $this->last_resp = null; } //          - pulbic function add_resp($req_name){ if($this->last_resp === null) return false; $req = $this->last_resp; $this->resp[$req_name] = $req; } //  ,    public function response(){ exit ( json_encode($this->resp) ); } }
      
      





コードにはコメントがありますが、簡単な余談があります... APIを未知の関数と呼び、これらの目的で魔法の__call関数を使用します。 つまり、APIの "Object.method"関数($ api-> {"Object.method"})を呼び出すことで、文字列をオブジェクトとメソッドのペアに自動的に分割して呼び出します。 その後、すべてのクエリの結果が1つの配列に追加され、json形式で返送されます。 すべてがシンプルです。



クラス



これは非常に重要です-ここでは、クラスはソースフォルダーに保存されます。これがクラスの外観です。



 <?php class object{ function method($params){ /* ... */ } }
      
      





クラス名は、メソッド名と同じように、リクエストでリクエストされたものと一致する必要があります。 他のすべては関係ありません。 メソッドは何でもでき、何でも返すことができます。



しかし、制御スクリプトも必要です。 これは、リクエストに応じて呼び出されるスクリプトと同じです。



 <?php // @package api.php header('Content-Type: application/json'); //     json $api_v = $_POST['api_v']; // $path = __DIR__.'/APIs/api_'.$api_v.'.php'; //       ,    if(!file_exists($path)) exit; //       include_once __DIR__.'/APIs/api_'.$api_v.'.php'; //  API $api = new API(); $reqs = $_POST['reqs']; $reqs = @json_decode($reqs, true); //  json  php  () //    ,          API foreach ($reqs as $req) { $method = $req['method']; $params = $req['params']; $req_name = $req['name']; $api->$method($params); $api->add_resp($req_name); } //    $api->response();
      
      





ここで何が起こっていますか? リクエストで指定されたバージョンに応じてAPIを有効にします。 JSONリクエストをデコードし、それぞれを通過します。 タイプ "object.method"のAPIメソッドを呼び出し、その結果をこのリクエストの名前で保存します(各リクエストには独自の名前があることを上に書きました)。 すべてのリクエストを実行した後、結果のjson配列を返します...そして、原則として、これですべてです。



リトルJS



このタイプのAPIリクエストを行うjsの関数の小さな例を次に示します。 jQueryを使用して作成されており、それについてはおwildび申し上げますが、それほど多くなくても本質を示す方が簡単です。



 function api_call(reqs, callback){ //  (  ,    ,     )   json var json = JSON.stringify( (Array.isArray(reqs) ? reqs : [reqs]) ); //  POST  $.post({ url: '/api/api.php', //    api.php dataType: 'json', //   json,     data: ({ api_v: '0.1', reqs: json }), //   API   ( json ) success: function(res){ //         window,      .     for(var key in res){ window.loaded[key] = res[key]; } //      callback(res); } }); }
      
      





これは単純なPOSTリクエストです。配列ではなく1つのリクエストのみを指定できることを除いて、ほとんど何も特別なものはありません。また、ロードされたアレイにすべての回答を保存します。



まあ、私はあなたに主要なアイデアが明確であることを願っています。 シンプルで直感的なAPIを作りたかったのです。 ほとんどの場合、多機能APIを作成するためのこの簡単なアプローチを示したかったのです。



またね...



All Articles