web-dev-qa-db-ja.com

RESTful APIを構築する方法は?

問題はこれです。PHPサーバーで実行するWebアプリケーションがあります。 REST APIを構築したいと思います。
調査を行ったところ、REST apiが特定のURIに対して認証キー(必ずしもではない)に対してHTTPメソッド(GET、POST ...)を使用し、情報が返されることがわかりました。情報をXMLまたはJSONとしてHTTPレスポンスとして(JSONではなく)。

私の質問は:

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

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

2つのファイルがありますclient.phpapi.php。両方のファイルを同じURLに配置します:http://localhost:8888/ので、リンクを自分のURLに変更する必要があります。 (ファイルは2つの異なるサーバーに存在できます)。

これはほんの一例であり、非常に迅速で汚いだけでなく、PHPを実行してから長い時間がかかりました。しかし、これはAPIのアイデアです。

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

<?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));

?>

この例ではデータベースを呼び出しませんでしたが、通常はこれを行う必要があります。また、「file_get_contents」関数を「curl」に置き換える必要があります。

67
Simon marc

2013年には、 Silex または Slim のようなものを使用する必要があります

Silexの例:

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(); 

スリムな例:

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

これは、通常のWebサイトを作成した場合とほとんど同じです。

PHP Webサイトの通常のパターンは次のとおりです。

  1. ユーザーはURLを入力します
  2. サーバーはURLを取得して解析し、アクションを実行します
  3. このアクションでは、ページに必要なすべての情報を取得/生成します
  4. アクションからの情報を使用してhtml/phpページを作成します
  5. サーバーは完全なhtmlページを生成し、ユーザーに送り返します

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 callでのみ機能する場合、単純に行うことができると思います(確認するには、通常curlを使用します)。

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

ただし、getおよびpost呼び出しを実行するためにcurlライブラリを使用する方が一般的です。 curlのサポートが必要かどうかを尋ねることができます。

APIから情報を取得したら、4と5の手順を実行できます。

Json関数とfile_get_contentsのphpドキュメントを見てください。

curl: http://fr.php.net/manual/fr/ref.curl.php


編集

いいえ、待ってください、わかりません。 「php APIページ」とはどういう意味ですか?

APIは、プロジェクトの作成/回復のみです。 (Webサイトを作成している場合)htmlの結果を直接送信することは絶対にしないでください。 URLでAPIを呼び出し、APIの戻り情報を取得し、この情報を使用して最終結果を作成します。

例:こんにちはxxxと言うhtmlページを書きたいとします。しかし、ユーザーの名前を取得するには、APIから情報を取得する必要があります。

したがって、apiに引数としてuser_idを持ち、このユーザーの名前を返す関数(getUserNameById(user_id)とします)があり、この関数をyour/api/ulr/getUser/idのようなURLでのみ呼び出すとします。

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

クライアント側から

    $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>

したがって、クライアントは、APIの役割であるデータベースに直接アクセスすることはありません。

それは明確ですか?

10
Simon marc

(1)どうすればそれらのURIを作成できますか?そのURIでPHPコードを記述する必要がありますか?

API URIスキームの設定方法に関する標準はありませんが、スラッシュで区切られた値を持つことは一般的です。このために使用することができます...

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

... URIでスラッシュで区切られた値の配列を取得するにはafterファイル名。

例:アプリケーションのどこかにAPIファイルapi.phpがあり、api.php/members/3をリクエストすると、$apiArgArray['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/17662 および http://en.wikipedia.org/wiki/Representational_state_transfer#Applied_to_web_services

6
Luke

私はこの質問が受け入れられており、少し年齢があることを知っていますが、これはまだ関連性があると思う人にとっては役立つかもしれません。結果は完全なRESTful APIではありませんが、PHPの-​​ API Builder mini lib を使用すると、MySQLデータベースをWebアクセス可能なJSON APIに簡単に変換できます。

2
Brannon

これまで言及されていない別のフレームワークは Laravel です。一般的にPHPアプリの構築には最適ですが、優れたルーターのおかげで、リッチAPIを構築するのは非常に快適で簡単です。 SlimやSliexほどスリムではないかもしれませんが、しっかりとした構造を提供します。

Aaron Kuzemchak-Laravelを使用したシンプルなAPI開発 YouTubeおよび

Laravel 4:RESTful APIで開始 NetTuts +で

2
zimt28

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

Xmlrpcインターフェースなどが本当に必要な場合があります。このインターフェースで何ができるようにしたいですか?

-編集

ここで、私は安らかなAPIとZend Frameworkを始めました。 Zend Frameworkの例

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

0
James Butler