ホームページ  >  記事  >  バックエンド開発  >  PHPを使用してAPIサーバーを構築する方法

PHPを使用してAPIサーバーを構築する方法

PHPz
PHPzオリジナル
2023-04-21 09:06:571672ブラウズ

モバイル、クラウド コンピューティング、モノのインターネット、その他のテクノロジの急速な発展に伴い、API はさまざまなアプリケーションやシステム間のデータ対話の重要な方法となっています。 Web 開発の分野では、PHP は人気のあるバックエンド言語として、API の実装を容易にする多くのライブラリとフレームワークを提供します。この記事では、PHP を使用して API サーバーを構築し、設計から実装までのプロセス全体を共有する方法を紹介します。

1. 要件分析と設計アイデア

API サーバーを実装する前に、要件と設計アイデアを明確にする必要があります。この記事では単純な API サーバーを実装しており、その要件は次のように要約できます:

  1. は HTTP プロトコルをサポートし、GET、POST およびその他のリクエストを処理できます。
  2. は URL パラメーターを解析でき、 RESTful API を実装します;
  3. は JSON 形式でデータを返すことができます;
  4. は API のセキュリティを保護するために OAuth2 認証をサポートします。

上記の要件を達成するには、次の設計アイデアを検討できます。

  1. PHP 拡張パッケージ Slim または Lumen を使用して API サーバーを構築します。適切なルーティング、ミドルウェアやコントローラーなどの構造化プログラミング ツール、豊富なプラグイン メカニズム;
  2. ルーティングで URL パラメーターを解析し、OAuth2 フレームワークを使用して API セキュリティを保護;
  3. コントローラー リクエストを取得するパラメータを指定し、モデルを呼び出してデータベースまたは他のデータ ソースにアクセスし、データを JSON 形式で出力します。

2. 開発環境の構築

API サーバーを構築する前に、PHP や MySQL など必要な開発環境を準備する必要があります。 PHPStorm、Eclipse などの統合開発環境 (IDE) を使用することも、Visual Studio Code、Sublime Text などの軽量エディターを使用することもできます。この記事では、PHPStorm を例として取り上げます。

  1. PHPStorm と PHP 環境のインストール: PHPStorm をダウンロードします。インストール プロセス中に、PHP 環境をインストールするように求められます。PHP はデフォルトでインストールされますが、インストール パスを自分で選択することもできます。インストールが完了したら、PHPStorm を実行し、[環境設定] を開き、[言語とフレームワーク] > [PHP] で PHP インタープリターを追加します。
  2. MySQL のインストール: MySQL をダウンロードしてインストールし、データベースを作成して構成します。
  3. Composer のインストール: Composer は PHP の依存関係マネージャーであり、PHP 開発作業を大幅に簡素化できます。コマンド ラインで次のコマンドを実行して Composer をインストールします。
php -r "readfile('https://getcomposer.org/installer');" | php

インストールが完了したら、composer.phar をグローバルに利用可能なパス (/usr/bin/composer など) に移動します。

3. API サーバーの構築

上記の開発環境を使用して、API サーバーの構築を開始できます。

  1. プロジェクトの作成: PHPStorm で新しい PHP プロジェクトを作成し、Composer を使用して Slim または Lumen フレームワークをインストールします:
composer require slim/slim

または

composer require illuminate/routing illuminate/http

注: Lumen フレームワークの使用を選択した場合、Facade および Eloquent ORM 関数を使用するには、bootstrap/app.php ファイル内の $app->withFacades() および $app->withEloquent() スイッチをオンにする必要があります。ルーメンから提供されました。

  1. ルートの作成: Slim または Lumen フレームワークでは、ルートとミドルウェアの作成が簡単です。ルート ディレクトリに Routes.php ファイルを作成します。例:
$app->get('/hello/{name}', function ($request, $response, $args) {
    $name = $args['name'];
    $response->getBody()->write("Hello, $name");
    return $response;
});

$app->get('/users', 'UsersController:index');

$app->post('/users', 'UsersController:create');

ここでは 3 つのルートが定義されています:

  • /hello/{name}: name パラメータを受け入れます、「Hello, name」の文字列を返します;
  • /users: GET リクエスト、UsersController のインデックス メソッドを呼び出し、すべてのユーザー データを返します;
  • /users: POST リクエスト、create メソッドを呼び出しますUsersController のメソッドで、新しいユーザー レコードを作成します。
  1. ミドルウェアの作成: ルーティングにミドルウェアを追加すると、前処理、フィルタリング、承認などの機能を実現できます。ルート ディレクトリに middleware.php ファイルを作成します。例:
$app->add(new JwtAuthMiddleware());

JwtAuthMiddleware ミドルウェアは、OAuth2 によって承認されたトークンとアクセス許可を確認するためにここで定義されます。

  1. コントローラーの作成: ルート ディレクトリにコントローラー ファイル (UsersController.php など) を作成し、ルートによって定義されたすべてのメソッドを実装します。コントローラーのコード構造は、次の例を参照できます。
namespace App\Controllers;

use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Message\ResponseInterface as Response;
use App\Models\User;

class UsersController {
    
    public function index(Request $request, Response $response) {
        $users = User::all();
        $response = $response->withJson($users);
        return $response;
    }
    
    public function create(Request $request, Response $response) {
        $data = $request->getParsedBody();
        $user = new User;
        $user->name = $data['name'];
        $user->email = $data['email'];
        $user->password = password_hash($data['password'], PASSWORD_DEFAULT);
        $user->save();
        $response = $response->withJson($user);
        return $response;
    }
    
}

ここでは、UsersController コントローラーが定義されており、/users GET リクエストと /users POST リクエストにそれぞれ対応する、index メソッドと create メソッドが含まれています。 Eloquent ORM を使用してユーザー データ テーブル (User::all() および $user->save()) を操作し、JSON 形式で応答を返します。

  1. API サーバーを実行します。コマンド ラインでプロジェクト ディレクトリを入力し、次のコマンドを実行します。
php -S localhost:8000 -t public

組み込みの PHP Web サーバーがここで開始され、リッスンします。ポート8000​​で。ブラウザで http://localhost:8000/hello/world にアクセスすると、通常は「Hello, world」という文字列が返されるはずです。 http://localhost:8000/users にアクセスすると、すべてのユーザーの JSON 形式のデータが返されるはずです。

4. OAuth2 認証

デフォルトでは、誰でもインターフェイスにアクセスしてデータを変更できるため、API サーバーは安全ではありません。 API を保護するために、OAuth2 認証を使用できます。 OAuth2 は、ユーザー名とパスワードを明らかにすることなく、サードパーティ アプリケーションがリソース サーバー上の特定のユーザーの保護されたリソースにアクセスすることを承認できる標準の承認プロトコルです。この記事では、Firebase の JWT フレームワークを使用して OAuth2 認証を実装します。

  1. Firebase JWT フレームワークをインストールします: Composer を使用して Firebase JWT フレームワークをインストールします:
composer require firebase/php-jwt
  1. 認可サーバーを作成します:ルート ディレクトリ (例:
namespace App;

use Firebase\JWT\JWT;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Message\ResponseInterface as Response;
use App\Models\User;

class AuthorizationServer {
    
    private static $key = 'your_secret_key';
    
    public static function getToken(Request $request, Response $response) {
        $data = $request->getParsedBody();
        $user = User::where('email', $data['email'])->first();
        if (!$user || !password_verify($data['password'], $user->password)) {
            return $response->withStatus(401)->withJson([
                'error' => 'Invalid email or password.'
            ]);
        }
        $now = time();
        $payload = array(
            'iat' => $now,
            'exp' => $now + 3600,
            'sub' => $user->id
        );
        $jwt = JWT::encode($payload, self::$key);
        
        return $response->withJson([
            'access_token' => $jwt,
            'token_type' => 'Bearer',
            'expires_in' => 3600
        ]);
    }
    
    public static function authenticate(Request $request) {
        $jwt = isset($request->getHeader('Authorization')[0]) ? explode(' ', $request->getHeader('Authorization')[0])[1] : null;
        if (!$jwt) {
            throw new Exception('Unauthorized.');
        }
        try {
            $decoded = JWT::decode($jwt, self::$key, array('HS256'));
            $user = User::find($decoded->sub);
            if (!$user) {
                throw new Exception('Unauthorized.');
            }
            return $user;
        } catch (Exception $e) {
            throw new Exception('Unauthorized.');
        }
    }
    
}

) ここでは、2 つのメソッドを含む AuthorizationServer 承認サーバーが定義されています。

  • getToken:接受客户端传递的email和password,生成access token并返回给客户端;
  • authenticate:接受客户端传递的access token,验证并返回用户对象。

这里使用了JWT加密框架,将用户信息存储在token中,并使用HS256算法加密。

  1. 创建中间件:在根目录下创建中间件文件JwtAuthMiddleware.php,例如:
namespace App\Middlewares;

use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Message\ResponseInterface as Response;
use App\AuthorizationServer;

class JwtAuthMiddleware {
    
    public function __invoke(Request $request, Response $response, $next) {
        try {
            $user = AuthorizationServer::authenticate($request);
            $request = $request->withAttribute('user', $user);
            return $next($request, $response);
        } catch (Exception $e) {
            return $response->withStatus(401)->withJson([
                'error' => $e->getMessage()
            ]);
        }
    }
    
}

这里定义了一个JwtAuthMiddleware中间件,用户验证客户端请求的access token的有效性,并在后面的控制器中通过$request->getAttribute('user')获取到用户对象。

  1. 更新路由:在路由中加入OAuth2授权相关的路由和中间件。在routes.php文件中增加以下代码:
$app->post('/auth/token', 'AuthorizationServer:getToken');

$app->group('', function () use ($app) {
    $app->get('/users/@id', 'UsersController:getUser');
    $app->put('/users/@id', 'UsersController:updateUser');
    $app->delete('/users/@id', 'UsersController:deleteUser');
})->add(new JwtAuthMiddleware());

这里定义了一个/auth/token路由,用于获取访问令牌。另外,对于需要OAuth2授权的路由(getUser、updateUser和deleteUser),使用$app->group()方法包裹其中,并添加JwtAuthMiddleware中间件。

五、总结

本文介绍了如何使用PHP搭建API服务器,基于Slim或Lumen框架,解析URL参数、返回JSON格式的数据,并使用OAuth2框架保护API的安全性。使用这种方式搭建API服务器,可以快速、高效地开发出各种类型的RESTful API。但是,具体实现还需要根据实际需求进行适当调整和优化。

以上がPHPを使用してAPIサーバーを構築する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。