php - 在 RESTful API 中使用干净的 URL

标签 php rest

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

即:“http://twitter.com/users/show/”+username+“.json”

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

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

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

  3. 为什么 twitter 调用 .json 文件 那肯定不存在。它必须根据要求生成。如何 这行得通吗?这使我相信问题的答案 2 是的。

最佳答案

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

.htaccess

RewriteEngine On
RewriteRule ^/api/ api.php

api.php

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

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

.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 的。我会偏离这个,我不会称它为完美的框架,但它肯定是一个开始。祝你好运!

关于php - 在 RESTful API 中使用干净的 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8291712/

相关文章:

REST 集合,良好的做法 : GET api/CollectionA/<collection id>/CollectionB?

node.js - REST API 端点命名

javascript - 如何使用 Javascript 从菜单栏获取值

.net - 现在没有 Windows 应用程序的范围吗?

PHP 将数组转换为类内的对象。那可能吗?

php - PHP中如何确保日期有效?

REST API 设计、RESTful API 命名约定

php - 选择多个实体学说

java - java.lang.UnsupportedOperationException 的 HTTP 501

rest - WSO2 API 管理器将 SOAP 转换为 REST