【问题标题】:Using Clean URLs in RESTful API在 RESTful API 中使用干净的 URL
【发布时间】:2019-06-21 18:18:59
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 干净的 url 与 REST api 无关。它们只是一种美化 url 的好方法,否则它们会带有丑陋的查询字符串。它们通常使用 mod_rewrite 来实现,以获取干净的 url 并在内部将其转换回查询字符串版本。

标签: php rest


【解决方案1】:

1) 如果您使用像 RecessPHP 这样的 RESTful 框架,或者如果您在 .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 的 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 的说明。这当然是一个很棒的工具,我会鼓励你看看它(也许从它的源头了解它是如何处理事物的),但也就是说,它对我来说似乎有点笨拙。路径名是用特殊的 cmets 编写的这一事实对我来说似乎不是 PHP 的。我会偏离这个,我不会称它为完美的框架,但这肯定是一个开始。祝你好运!

【讨论】:

  • 感谢您的精彩回复。我通常会远离框架,除非它可以节省我很多时间。但我一定会去 Recess 看看。
  • 我也在寻找有关 RESTful URL 的服务器端实现的技巧。我曾怀疑涉及前端控制器,因此感谢您的澄清。这是一个很好的答案。
  • @Bailey Parker :: 您提供的 Recess PHP 框架的链接已失效:“注意:此域名已于 2017 年 10 月 29 日到期,正在等待续订或删除。”
【解决方案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,您可以包含不同的文件,具体取决于您使用什么 ajax 请求与您的 api 对话。

【讨论】:

    【解决方案3】:

    试试这个:

    RewriteRule ^([^/]+)\/([^/]+)\/?$ getdata.php?para1=$1&para2=$2 [NC]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-27
      • 1970-01-01
      • 2016-04-24
      • 2014-09-26
      相关资源
      最近更新 更多