“Clean URL”也称为“RESTful URL”,用户友好,纯粹是结构化的,不包含查询字符串。相反,它们只包含资源的路径。
即:“http://twitter.com/users/show/”+用户名+“。json”
有关服务器端功能的问题:
我是否需要为每个目录制作唯一的服务器端API脚本?
如果可以,我可以将所有请求转发到一个脚本吗? 从Clean URL结构中提取有用的信息($ _GET ['url_structure'])?
为什么twitter会调用.json文件 肯定不存在。它必须根据要求生成。怎么样 这有用吗?这让我相信问题的答案 2是的。
答案 0 :(得分:58)
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的重写模块将所有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。我会偏离这个,我不会称之为完美的框架,但它肯定是一个开始。祝你好运!
答案 1 :(得分:7)
这对我有用: 把它放在你网站根目录的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请求。
答案 2 :(得分:0)
尝试一下:
RewriteRule ^([^/]+)\/([^/]+)\/?$ getdata.php?para1=$1¶2=$2 [NC]