2011-01-13 14 views
72

問題は次のとおりです。 私はPHPサーバー上で動作するWebアプリケーションを持っています。私はそれのためのREST APIを構築したいと思います。
私はいくつかの研究を行いました.REST APIが認証キー(必ずしも必要ではありません)を持つ特定のURIに対してHTTPメソッド(GET、POST ...)を使用し、情報がXMLとして情報とともにHTTP応答として返されることを認識しましたまたはJSON(私はむしろJSON)です。RESTful APIを構築するにはどうすればよいですか?

私の質問は:

  1. どのように私は、アプリの開発者として、これらのURIの構築のですか?そのURIにPHPコードを書く必要がありますか?
  2. 応答として返すようにJSONオブジェクトを作成するにはどうすればよいですか?
+1

http://www.gen-x-design.com/archives/create-a-rest-api-with-php/この上の偉大なリソースです。 –

+0

私は、この[ブログ投稿](https://www.leaseweb.com/labs/2015/10/creating-a-simple-rest-api-in-php/)に、これに関するいくつかのサンプルコードと説明を書いています。 – mevdschee

答えて

66

ここは単純なPHPの非常に単純な例です。

api.php 2つのファイルclient.php & があります。私は両方のファイルを同じURLに入れます:http://localhost:8888/、あなたは自分のURLへのリンクを変更する必要があります。 (ファイルは2つの異なるサーバー上にあることができます)。

これは単なる例であり、非常に速く汚れています。また、私はPHPを行ってから長い時間がかかりました。しかし、これはAPIのアイデアです。私はこの例では、データベースへのすべてのコールをしなかったが、通常それはあなたが何をすべきかである

<?php 

// This is the API to possibility show the user list, and show a specific user by action. 

function get_user_by_id($id) 
{ 
    $user_info = array(); 

    // make a call in db. 
    switch ($id){ 
    case 1: 
     $user_info = array("first_name" => "Marc", "last_name" => "Simon", "age" => 21); // let's say first_name, last_name, age 
     break; 
    case 2: 
     $user_info = array("first_name" => "Frederic", "last_name" => "Zannetie", "age" => 24); 
     break; 
    case 3: 
     $user_info = array("first_name" => "Laure", "last_name" => "Carbonnel", "age" => 45); 
     break; 
    } 

    return $user_info; 
} 

function get_user_list() 
{ 
    $user_list = array(array("id" => 1, "name" => "Simon"), array("id" => 2, "name" => "Zannetie"), array("id" => 3, "name" => "Carbonnel")); // call in db, here I make a list of 3 users. 

    return $user_list; 
} 

$possible_url = array("get_user_list", "get_user"); 

$value = "An error has occurred"; 

if (isset($_GET["action"]) && in_array($_GET["action"], $possible_url)) 
{ 
    switch ($_GET["action"]) 
    { 
     case "get_user_list": 
     $value = get_user_list(); 
     break; 
     case "get_user": 
     if (isset($_GET["id"])) 
      $value = get_user_by_id($_GET["id"]); 
     else 
      $value = "Missing argument"; 
     break; 
    } 
} 

exit(json_encode($value)); 

?> 

client.php

<?php 

/*** this is the client ***/ 


if (isset($_GET["action"]) && isset($_GET["id"]) && $_GET["action"] == "get_user") // if the get parameter action is get_user and if the id is set, call the api to get the user information 
{ 
    $user_info = file_get_contents('http://localhost:8888/api.php?action=get_user&id=' . $_GET["id"]); 
    $user_info = json_decode($user_info, true); 

    // THAT IS VERY QUICK AND DIRTY !!!!! 
    ?> 
    <table> 
     <tr> 
     <td>Name: </td><td> <?php echo $user_info["last_name"] ?></td> 
     </tr> 
     <tr> 
     <td>First Name: </td><td> <?php echo $user_info["first_name"] ?></td> 
     </tr> 
     <tr> 
     <td>Age: </td><td> <?php echo $user_info["age"] ?></td> 
     </tr> 
    </table> 
    <a href="http://localhost:8888/client.php?action=get_userlist" alt="user list">Return to the user list</a> 
    <?php 
} 
else // else take the user list 
{ 
    $user_list = file_get_contents('http://localhost:8888/api.php?action=get_user_list'); 
    $user_list = json_decode($user_list, true); 
    // THAT IS VERY QUICK AND DIRTY !!!!! 
    ?> 
    <ul> 
    <?php foreach ($user_list as $user): ?> 
     <li> 
     <a href=<?php echo "http://localhost:8888/client.php?action=get_user&id=" . $user["id"] ?> alt=<?php echo "user_" . $user_["id"] ?>><?php echo $user["name"] ?></a> 
    </li> 
    <?php endforeach; ?> 
    </ul> 
    <?php 
} 

?> 

api.php 。また、 "file_get_contents"関数を "curl"で置き換える必要があります。これまでに言及されていないもう一つのフレームワークはLaravelある

$app = new \Slim\Slim(); 
$app->get('/hello/:name', function ($name) { 
    echo "Hello, $name"; 
}); 
$app->run(); 
+0

Simon、ありがとうございました。私はちょうど確信したい:ユーザーと呼ばれるリソースがあると仮定し、私はAPIファイルを置く必要があります:http://www.mydomain.com/api/user正しい? –

+0

ファイルの名前は自由です。しかし、はい、expliciteの名前でファイルを呼び出す方が良い方法です。私のAPIファイルを見て、getパラメータをチェックし、この値のおかげで関数を呼び出します。あなたはuser.phpのインクルードを行い、このファイルにある関数を呼び出すこともできますし、api/userにファイルを置いてここからパラメータを扱うこともできます。 –

+0

基本的には、サーバのルーティングテーブルを更新して、特定のURLを特定のPHPファイルにマップする必要があります。正しい? –

10

これは、通常のウェブサイトを作成したのとほぼ同じです。 PHPのウェブサイトのための

通常のパターンは次のとおりです。

  1. ユーザーサーバは、URLを取得し、それを解析して、このアクションでは
  2. アクションを実行
  3. URLを入力して、あなたはすべてのを生成/取得情報あなたは完全にHTMLページを生成し、ユーザに戻ってそれを送信
  4. はあなたが行動
  5. サーバーからの情報をHTML/PHPページを作成するページに必要

apiでは、3と4の間に新しいステップを追加するだけです。3の後、必要なすべての情報を含む配列を作成します。この配列をjsonでエンコードして終了するか、この値を返します。

$info = array("info_1" => 1; "info_2" => "info_2" ... "info_n" => array(1,2,3)); 
exit(json_encode($info)); 

すべてがapi用です。 クライアント側では、URLでapiを呼び出すことができます。 apiがgetコールだけで動作するなら、私は単純に行うことが可能だと思います(チェックするには、通常はカールを使います)。

$info = file_get_contents(url); 
$info = json_decode($info); 

ただし、curlライブラリを使用して呼び出しを実行するのが一般的です。 あなたはカールの助けが必要かどうか私に尋ねることができます。

APIから情報を取得したら、4 & 5ステップを実行できます。

json関数とfile_get_contentsのphp docを見てください。

カール:http://fr.php.net/manual/fr/ref.curl.php


EDIT

いいえ、私はそれを得ることはありません、待ってください。 "php API page"とはどういう意味ですか?

apiはプロジェクトの作成/回復のみです。あなたは決して直接HTMLの結果を送る(あなたがウェブサイトを作っているなら)APIを投げる。あなたはapiをurlで呼び出し、apiの戻り情報は、この情報を使用して最終結果を作成します。

例:hello xxxと言うhtmlページを作成します。しかし、ユーザーの名前を取得するには、apiから情報を取得する必要があります。

あなたのapiにuser_idを引数として持つ関数があり、このユーザーの名前を返します(getUserNameById(user_id)としましょう)、この関数は/ api/ulr/getUserのようなURLでのみ呼び出すとします/ id。 クライアント側から

Function getUserNameById(user_id) 
{ 
    $userName = // call in db to get the user 
    exit(json_encode($userName)); // maybe return work as well. 
} 

あなたは、APIの役割ように、クライアントは、直接データベースにアクセスすることはありません

$username = file_get_contents(your/api/url/getUser/15); // You should normally use curl, but it simpler for the example 
// So this function to this specifique url will call the api, and trigger the getUserNameById(user_id), whom give you the user name. 
    <html> 
    <body> 
    <p>hello <?php echo $username ?> </p> 
    </body> 
    </html> 

を行います。

これは明確ですか?

+0

+1。また、APIは応答に適切なコンテンツタイプを設定する必要があります。 jsonについては、http://stackoverflow.com/questions/477816/the-right-json-content-typeを参照してください。 – Ben

+0

すべてのリクエストを管理するPHP APIページが1つ必要です。 –

+0

いいえ、待って、私はそれを取得しません。 "php API page"とはどういう意味ですか? –

0

simon marcが言ったように、プロセスはあなたや私がウェブサイトを閲覧するのと同じです。 Zendフレームワークの使用に慣れていれば、簡単に設定できる簡単なチュートリアルがあります。安らかなAPIを構築することの最も難しい部分は、それを設計し、それを真に安らかにすることで、データベース用語でCRUDを考えます。

本当にxmlrpcインターフェイスやそれ以外のものが欲しいかもしれません。あなたはこのインターフェースで何ができるようにしたいですか?私は安らかなAPIとZend Frameworkを使用して始まったのはここ

--edit

です。 Zend Framework Example

要するに、Zend Restサーバーを使用しないでください。これは廃止されました。

+0

Zendのフレームワークを使ってRESTful APIを構築するにはどうすればよいですか? –

+0

あなたが興味を持っているなら、ZFとRESTfulなWebサービスを使い始める方法については、私のブログに投稿しています。 –

31

、あなたはSilexまたはSlim

サイレックスの例のようなものを使用する必要があります。一般的にPHPアプリケーションを構築するのに最適ですが、偉大なルータのおかげで、豊かなAPIを構築するのは本当に快適で簡単です。 SlimやSliexほどスリムでないかもしれませんが、それはあなたに堅実な構造を与えます。

NetTuts +

+1

ありがとうございます。私はスリムを使用し、私は裸のAPIを数分で実行していた。 – user12345

+0

もっと複雑な(詳細な)apiには何をお勧めしますか?Slimは便利ですが、すべての機能は1つのファイルにまとめられているため、読みやすくするのは難しいです。 –

+2

@IlkerBaltaci Silexを使用すると、コントローラをクラスに抽出できます。ここでは、その上での良い記事と、マイクロフレームワークを使用することの長所と短所をフルスタック・フレームワークであるhttps://igor.io/2012/11/09/scaling-silex.htmlと比較します。私は個人的にはSilexが私に最も重要なことを与え、残りのスタックを選ぶことができるので、Silexを好む。 – finishingmove

2

require_once __DIR__.'/../vendor/autoload.php'; 

$app = new Silex\Application(); 

$app->get('/hello/{name}', function($name) use($app) { 
    return 'Hello '.$app->escape($name); 
}); 

$app->run(); 

スリム例:2013年に

2

上のYouTubeのAaron Kuzemchak - Simple API Development With Laravel

Laravel 4: A Start at a RESTful APIを参照してください、私はこの質問が受け入れられ、年齢のビットを持っていますが、これはまだそれが関連を見つける一部の人のために役に立つかもしれませんされていることを知っています。結果は完全なRESTful APIではありませんが、API Builder mini lib for PHPではMySQLデータベースをWebアクセス可能なJSON APIに簡単に変換できます。

5

(1)どうすればこれらのURIを構築できますか?そのURIにPHPコードを書く必要がありますか?

API URIスキームの設定方法はありませんが、スラッシュで区切られた値を持つのが一般的です。このためには後にファイル名をURI でスラッシュで区切られた値の配列を取得するには... ...

$apiArgArray = explode("/", substr(@$_SERVER['PATH_INFO'], 1)); 

を使用することができます。

例:その後、$apiArgArray['members', '3']を含む配列となり、あなたがどこかに、アプリケーションのAPIファイルapi.phpを持っていて、api.php/members/3の要求を行うと仮定。これらの値を使用してデータベースに照会したり、他の処理を行うことができます。

(2)応答として返すようにJSONオブジェクトを作成するにはどうすればよいですか?

PHPオブジェクトはどれでも取って、json_encodeでJSONに変換できます。また、適切なヘッダーを設定する必要があります。

header('Content-Type: application/json'); 
$myObject = (object) array('property' => 'value'); // example 
echo json_encode($myObject); // outputs JSON text 

すべてこれはJSONを返すAPIのために良いですが、あなたが尋ねるべき次の質問は次のとおりです。

(3)どのように私は私のAPIは、RESTfulな作るのですか?

私たちは$_SERVER['REQUEST_METHOD']を使用して、使用されているメソッドを取得し、それに基づいて異なる処理を行います。最終的な結果は次のようなものです...

header('Content-Type: application/json'); 
$apiArgArray = explode("/", substr(@$_SERVER['PATH_INFO'], 1)); 
$returnObject = (object) array(); 
/* Based on the method, use the arguments to figure out 
    whether you're working with an individual or a collection, 
    then do your processing, and ultimately set $returnObject */ 
switch ($_SERVER['REQUEST_METHOD']) { 
    case 'GET': 
    // List entire collection or retrieve individual member 
    break; 
    case 'PUT':  
    // Replace entire collection or member 
    break; 
    case 'POST':  
    // Create new member 
    break; 
    case 'DELETE':  
    // Delete collection or member 
    break; 
} 
echo json_encode($returnObject); 

出典:https://stackoverflow.com/a/897311/1766230http://en.wikipedia.org/wiki/Representational_state_transfer#Applied_to_web_services