如何构建RESTful API?

问题是这样的:我有一个运行在PHP服务器上的Web应用程序。 我想为它构建一个REST API。
我做了一些研究,我发现REST api使用HTTP方法(GET,POST ...)为某些URI提供了一个身份验证密钥(不一定),并且信息以HTTP或XML响应形式返回, (我宁愿JSON)。

我的问题是:

  • 作为应用程序的开发人员,我如何构建这些URI? 我需要在该URI编写一个PHP代码吗?
  • 如何构建JSON对象以作为响应返回?

  • 这是一个简单的php中的简单例子。

    有2个文件client.phpapi.php 。 我把这两个文件放在同一个网址: http://localhost:8888/ ,所以你必须改变链接到你自己的网址。 (该文件可以位于两台不同的服务器上)。

    这只是一个例子,它非常快速和肮脏,再加上它已经很长时间了,因为我已经完成了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));
    
    ?>
    

    我没有为这个例子调用数据库,但通常这是你应该做的。 你还应该用“curl”替换“file_get_contents”函数。


    在2013年,你应该使用像Silex或Slim这样的东西

    Silex例如:

    require_once __DIR__.'/../vendor/autoload.php'; 
    
    $app = new SilexApplication(); 
    
    $app->get('/hello/{name}', function($name) use($app) { 
        return 'Hello '.$app->escape($name); 
    }); 
    
    $app->run(); 
    

    苗条的例子:

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

    这与创建普通网站几乎一样。

    一个php网站的正常模式是:

  • 用户输入一个url
  • 服务器获取url,解析它并执行一个操作
  • 在此操作中,您可以获取/生成该页面所需的全部信息
  • 您可以使用操作中的信息创建html / php页面
  • 服务器生成完整的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只能在打电话的情况下工作,我认为可以做一个简单的(检查,我通常使用curl)。

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

    但是使用curl库执行get和post调用更常见。 你可以问我是否需要卷发帮助。

    一旦从api获取信息,就可以执行4和5步骤。

    查看json函数和file_get_contents的php文档。

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


    编辑

    不,等等,我不明白。 “php API页面”你是什么意思?

    API只是您项目的创建/恢复。 你永远不会直接发送HTML结果(如果你正在创建一个网站)抛出一个API。 您可以通过url,api返回信息调用api,然后使用此信息创建最终结果。

    例如:你想写一个说hello xxx的html页面。 但要获取用户的名称,您必须从api获取信息。

    假设你的api有一个函数,它有user_id作为参数,并返回这个用户的名字(比方说getUserNameById(user_id)),并且你只能在像/ 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的角色。

    这更清楚吗?

    链接地址: http://www.djcxy.com/p/1253.html

    上一篇: How to build a RESTful API?

    下一篇: type and datatype in an AJAX request?