首頁 >後端開發 >PHP問題 >如何使用PHP建立API伺服器

如何使用PHP建立API伺服器

PHPz
PHPz原創
2023-04-21 09:06:571726瀏覽

隨著行動、雲端運算、物聯網等技術的快速發展,API成為了各種應用和系統之間資料互動的重要方式。在Web開發領域,PHP作為一種流行的後端語言,其提供了許多便於實作API的函式庫和框架。本文將介紹如何使用PHP建構API伺服器,分享從設計到實現的整個過程。

一、需求分析與設計想法

在實作API伺服器前,我們需要先明確需求與設計思路。本文實作的是一個簡單的API伺服器,其需求可以概括為:

  1. 支援HTTP協議,能夠處理GET、POST等請求;
  2. 能夠解析URL參數,實作RESTful API;
  3. 能夠傳回JSON格式的資料;
  4. 支援OAuth2授權,保護API的安全性。

為了實現以上需求,我們可以考慮如下的設計想法:

  1. #使用PHP擴充包Slim或Lumen來建立API伺服器,它們提供了良好的路由、中間件、控制器等結構化程式設計工具和豐富的插件機制;
  2. 在路由中解析URL參數,使用OAuth2框架來保護API的安全性;
  3. 在控制器中取得請求參數,呼叫模型來存取資料庫或其他資料來源,輸出JSON格式的資料。

二、建置開發環境

在建置API伺服器前,我們要準備好PHP、MySQL等必要的開發環境。可以選擇使用整合開發環境(IDE)如PHPStorm、Eclipse等,也可以使用輕量級的編輯器如Visual Studio Code、Sublime Text等。本文以PHPStorm為例。

  1. 安裝PHPStorm及PHP環境:下載PHPStorm,安裝過程中會提示安裝PHP環境,預設會安裝PHP,也可以自行選擇安裝路徑。安裝完成後,執行PHPStorm,開啟設定(Preferences),在Languages & Frameworks > PHP中加入PHP解釋器。
  2. 安裝MySQL:下載並安裝MySQL,建立和設定資料庫。
  3. 安裝Composer:Composer是PHP的依賴管理器,可以大幅簡化PHP的開發工作。在命令列中執行以下命令安裝Composer:
php -r "readfile('https://getcomposer.org/installer');" | php

安裝完成後,將composer.phar移至全域可用的路徑,例如/usr/bin/composer。

三、建立API伺服器

有了上述開發環境,我們可以開始建立API伺服器。

  1. 建立項目:在PHPStorm中建立新的PHP項目,並使用Composer安裝Slim或Lumen框架:
composer require slim/slim

composer require illuminate/routing illuminate/http

注意:如果選擇使用Lumen框架,則需要在bootstrap/app.php檔案中開啟$app->withFacades()和$app->withEloquent()開關,以便使用Lumen提供的Facade和Eloquent ORM功能。

  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的index方法,傳回所有使用者資料;
  • /users:POST請求,呼叫UsersController的create方法,建立一個新的使用者記錄。
  1. 建立中間件:在路由中加入中間件,可以實作一些預處理、過濾、授權等功能。在根目錄下建立middleware.php文件,例如:
$app->add(new JwtAuthMiddleware());

這裡定義了一個JwtAuthMiddleware中間件,用於驗證OAuth2授權的token和權限。

  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控制器,包含index和create方法,分別對應/users GET和/users POST請求。使用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格式資料。

四、OAuth2授權

預設情況下,API伺服器是不安全的,因為任何人都可以存取介面並修改資料。為了保護API,我們可以使用OAuth2授權。 OAuth2是一個標準的授權協議,可以在不洩露使用者名稱和密碼的情況下,授權第三方應用程式存取特定使用者在某個資源伺服器上的受保護資源。在本文中,我們使用Firebase的JWT框架來實現OAuth2授權。

  1. 安裝Firebase JWT框架:使用Composer安裝Firebase JWT框架:
composer require firebase/php-jwt
  1. 建立授權伺服器:在根目錄下建立AuthorizationServer.php文件,例如:
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.');
        }
    }
    
}

這裡定義了一個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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn