在RESTful API中使用干净网址
“干净网址”(也称为“RESTful URL”)用户友好,纯粹结构化,不包含查询字符串。相反,它们只包含资源的路径。在RESTful API中使用干净网址
即: “http://twitter.com/users/show/"+username+".json”
问题有关服务器端功能:
我需要为每个目录制作一个唯一的服务器端API脚本?
如果有,我可以将所有请求转发到一个脚本吗?我如何 从Clean URL结构($ _GET ['url_structure'])提取有用的信息?
为什么twitter会调用一个肯定不存在的.json文件 。它必须根据请求生成。 如何完成这项工作?这使我相信问题 2的答案是肯定的。
1)如果你不使用一个RESTful框架像RecessPHP,或者如果您使用的mod_rewrite规则在您的.htaccess文件重定向所有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中的服务器变量中,我相信这是$_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。我偏离这一点,我不会把它称为完美的框架,但它肯定是一个开始。祝你好运!
感谢您真正的回复。除非它为我节省了很多时间,否则我通常会偏离框架。但我一定会检查Recess。 –
我也在搜索服务器端实现RESTful URL的提示。我曾怀疑涉及Front Controller,所以感谢您的澄清。这是一个很好的答案。 – ComethTheNerd
@Bailey Parker ::您提供的Recess PHP框架链接不再适用:“注意:此域名在2017年10月29日过期,正在等待续订或删除。” – Peter
我会使用一个框架,如CodeIgniter。您不需要URL的每个部分的目录,只需使用.htaccess文件将所有网址重定向到特定网址,并让该网址处理所有操作。
这几乎是我在这里做的。我使用.htaccess文件指向提到的api.php文件。然后使用逻辑来决定将用户发送到哪里。 – PHPGuru
这对我有用: 把它放在你的网站根目录下的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请求。
清洁URL与REST API无关。他们只是一个很好的方式来美化网址,否则会有丑陋的查询字符串。他们通常使用mod_rewrite来实现干净的URL并在内部将其转换回查询字符串版本。 –