在 RESTful API 中使用 Clean URL

2022-08-30 12:03:07

“干净 URL”也称为“RESTful URL”,是用户友好的,纯结构的,不包含查询字符串。相反,它们仅包含资源的路径。

即: “http://twitter.com/users/show/”+用户名+“.json”

有关服务器端功能的问题:

  1. 我是否需要为每个目录创建唯一的服务器端 API 脚本?

  2. 如果是,我可以将所有请求仅转发到一个脚本,如何从干净的URL结构中提取有用的信息($_GET['url_structure'])?

  3. 为什么 twitter 会调用一个肯定不存在的 .json 文件。它必须根据请求生成。这是如何工作的?这使我相信问题2的答案是肯定的。


答案 1

1)如果您使用Restful框架(如RecessPHP),或者如果您在.htaccess文件中使用mod_rewrite规则将所有API请求重定向到单个PHP文件(称为前端控制器),则不会。

.htaccess

RewriteEngine On
RewriteRule ^/api/ api.php

api.php

$request = $_SERVER['REQUEST_URI'];  //this would be /users/show/abc.json

2)您可以使用apache的重写模块将所有api请求重定向到处理它们的特殊PHP文件。根据您的apache配置,原始请求的(RESTful)url将存储在PHP的服务器变量中,我相信它是.当然,您也可以将一个包含RESTful url的变量传递给PHP。$_SERVER['REQUEST_URI']$_GET[]

.htaccess

RewriteEngine On
RewriteRule ^/api/([^\.]+).(xml|json|atom) api.php?url=$1&type=$2

api.php

$request_parts = explode('/', $_GET['url']); // array('users', 'show', 'abc')
$file_type     = $_GET['type'];

$output = get_data_from_db(); //Do your processing here
                              //You can outsource to other files via an include/require

//Output based on request
switch($file_type) {
    case 'json':
        echo json_encode($output);
        break;
    case 'xml':
        echo xml_encode($output); //This isn't a real function, but you can make one
        break;
    default:
        echo $output;
}

3)Twitter(和许多其他API)使用它,因为它是提供应用程序期望从API返回的格式的便捷方式。所有 API 请求都重新路由到单个 PHP 文件,该文件处理所有文件的创建并将其内容回显到输出。该文件实际上永远不会存储在服务器上(除非它被缓存)。


良好的资源


关于RecessPHP的说明。这当然是一个很棒的工具,我鼓励你看看它(也许在它的来源,以了解它如何处理事情),但话虽如此,它对我来说似乎有点笨拙。路径名写在特殊注释中的事实对我来说似乎非常不是PHP。我会偏离这个,我不会称之为完美的框架,但它肯定是一个开始。祝你好运!


答案 2

这对我有用:把它放在你网站根部的htaccess文件中。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule api/(.*)$ api/api.php?request=$1 [QSA,NC,L]
RewriteRule (recipe/.*) api/app.php?request=$1 [QSA,NC,L]
</IfModule>

然后,如果您转到页面 http://localhost/api/person/susan 您将看到它将带您到文件 http://localhost/api/api.php 我还有一个食谱页面,我使用 http://localhost/recipe/edit/2 将其放入api.php文件中:

<?php
$requestParts = explode('/',$_GET['request']);
$category = $requestParts[0];
$action = $requestParts[1];
$data = $requestParts[2];
if($category == 'recipe'){
    include($_SERVER['DOCUMENT_ROOT'].'/pages/add_recipe.php');
}

上面的变量将保存类别:食谱,操作:添加或编辑,以及数据可以是一个数字,该数字是食谱的ID或您想要的任何内容。然后在add_recipe.php使用变量来确定是编辑还是添加配方。如果您使用api,则可以根据您用于与api通信的ajax请求来包含不同的文件。


推荐