Php 在RESTful API中使用干净的URL
“干净的URL”也称为“RESTful URL”,是用户友好的、纯结构的,并且不包含查询字符串。相反,它们只包含资源的路径 即:http://twitter.com/users/show/“+username+”.json” 有关服务器端功能的问题:Php 在RESTful API中使用干净的URL,php,rest,Php,Rest,“干净的URL”也称为“RESTful URL”,是用户友好的、纯结构的,并且不包含查询字符串。相反,它们只包含资源的路径 即:http://twitter.com/users/show/“+username+”.json” 有关服务器端功能的问题: 是否需要为每个目录创建唯一的服务器端API脚本 我可以将所有请求转发到一个脚本吗?如果可以,我该怎么做 从干净的URL结构中提取有用的信息($\u GET['URL\u structure']) 为什么twitter调用.json文件 这肯定不存在
RewriteEngine On
RewriteRule ^/api/ api.php
RewriteEngine On
RewriteRule ^/api/([^\.]+).(xml|json|atom) api.php?url=$1&type=$2
api.php
$request = $_SERVER['REQUEST_URI']; //this would be /users/show/abc.json
$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;
}
2)您可以使用apache的重写模块将所有api请求重定向到处理它们的特殊PHP文件。根据您的apache配置,原始请求的(RESTful)url将存储在PHP中的服务器变量中,我相信它是
$\u server['REQUEST\u URI']
。当然,您也可以将$\u GET[]
变量传递给包含RESTful url的PHP
.htaccess
RewriteEngine On
RewriteRule ^/api/ api.php
RewriteEngine On
RewriteRule ^/api/([^\.]+).(xml|json|atom) api.php?url=$1&type=$2
api.php
$request = $_SERVER['REQUEST_URI']; //this would be /users/show/abc.json
$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文件,该文件负责创建所有文件并将其内容回显到输出。该文件从未实际存储在服务器上(除非缓存)
好资源
RewriteEngine On
RewriteRule ^/api/ api.php
RewriteEngine On
RewriteRule ^/api/([^\.]+).(xml|json|atom) api.php?url=$1&type=$2
关于RecessPHP的说明。这当然是一个很好的工具,我会鼓励你看看它(也许从它的源头上了解它是如何处理事情的),但也就是说,它对我来说似乎有点笨重。路径名是用特殊注释编写的,这一事实对我来说似乎很难理解。我会偏离这一点,我不会称之为完美的框架,但这肯定是一个开始。祝你好运 这对我很有用: 将其放入网站根目录下的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>
重新启动发动机
重写cond%{REQUEST_FILENAME}-F
重写cond%{REQUEST_FILENAME}-D
重写规则api/(*)$api/api.php?请求=$1[QSA,NC,L]
重写规则(recipe/*)api/app.php?请求=$1[QSA,NC,L]
然后如果你进入页面
您将看到它将带您到位于的文件
我也有一个食谱页,我去使用
将其放入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');
}
试试这个:
RewriteRule ^([^/]+)\/([^/]+)\/?$ getdata.php?para1=$1¶2=$2 [NC]
干净的URL与RESTAPI无关。它们只是一种美化URL的好方法,否则会有难看的查询字符串。它们通常使用mod_rewrite实现,以获取干净的url,并在内部将其转换回查询字符串版本。感谢您的精彩回复。我通常会偏离框架,除非它能节省我很多时间。但我肯定会去看看。我也在寻找RESTful URL服务器端实现的技巧。我怀疑前面的控制员有牵连,谢谢澄清。这是一个很好的答案。@Bailey Parker::您提供的PHP框架链接不再有效:“注意:此域名于2017年10月29日过期,正在等待续订或删除。”