Php 使用RESTAPI处理URL?
我知道,当创建一个php网站时,我可以使用index.php?id=2这样的东西,index.php可以使用:$\u GET['id']获取id。我想为我的一个网站创建一个api,我看到了不同的例子Php 使用RESTAPI处理URL?,php,api,url,Php,Api,Url,我知道,当创建一个php网站时,我可以使用index.php?id=2这样的东西,index.php可以使用:$\u GET['id']获取id。我想为我的一个网站创建一个api,我看到了不同的例子 <?php require_once 'Kunststube/Router/Router.php'; $r = new Kunststube\Router\Router; $r->add('/foo'); ... $r->route($_GET['url']); 推特: ht
<?php
require_once 'Kunststube/Router/Router.php';
$r = new Kunststube\Router\Router;
$r->add('/foo');
...
$r->route($_GET['url']);
推特:
https://api.twitter.com/1.1/statuses/mentions_timeline.json?count=2&since_id=14927799
因此,我在我的FTP服务器上创建了一个文件夹“1.1”和一个文件夹“statuses”,其中的文件提到了$\u timeline.json,它理解$\u GET['count']等
其他API如下所示:
https://quote.fm/api/recommendation/delete
GET /foo/bar/baz?some=parameters HTTP/1.1
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=/$1 [QSA,L]
</IfModule>
我可以删除一条建议,其中包括:
https://quote.fm/api/recommendation/delete/?id=1 or
https://quote.fm/api/recommendation/delete/1
通常对于网站,我可以使用mod_rewrite创建这样的url结构。据我所知,我在这里为不同的部分创建了不同的URL:
https://xyz.com/api/user/get/1
https://xyz.com/api/user/delete/1
因此,我创建了一个文件夹用户,其中的子文件夹delete和get位于FTP服务器上,每个文件夹都有一个index.php文件?我的脚本如何知道/1是id=1
<?php
require_once 'Kunststube/Router/Router.php';
$r = new Kunststube\Router\Router;
$r->add('/foo');
...
$r->route($_GET['url']);
有人理解我吗?我很难理解我的脚本如何将url结构转换为来自应用程序的必要数据片段
谢谢 我将从这里复制这一章: 什么是URL以及如何设置路由 URL只是由几个部分组成的字符串:
http://example.com/foo?bar=baz
| | | |
| | | +- query
| | +- path
| +- host
+- scheme
URL还可以具有身份验证信息、端口和地址
片段,但我们会尽量保持简单。kunstube\路由器
专门处理路径。方案和查询通常具有
对路由没有影响,主机通常由web处理
服务器
假设使用Apache web服务器进行典型设置,Apache通常
为你做“路由”。它接收一个HTTP请求
大概是这样的:
https://quote.fm/api/recommendation/delete
GET /foo/bar/baz?some=parameters HTTP/1.1
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=/$1 [QSA,L]
</IfModule>
web服务器现在可以自由地以任何方式响应此请求
选择。大多数web服务器的默认操作是映射URL的
硬盘上文件的路径。web服务器将首先找出
适当的DocumentRoot是什么,即
已配置为“公共web文件夹”。让我们假设
DocumentRoot是/var/www
。然后它将连接请求路径
到该根,结果是/var/www/foo/bar/baz
。然后它将尝试
确定磁盘上是否存在该文件,并将其作为响应提供。如果
请求的文件以.php
结尾,或者以其他方式配置Apache
要将该文件视为PHP文件,它将首先通过
PHP解释器,然后返回其输出
要使用PHP路由器使用我们自己的自定义路由,我们需要拦截
Apache查找要在磁盘上提供服务的文件的过程。这个可以
在Apache配置文件中完成;但如果你有权访问
这些文件我想你知道你在做什么,不会去查的
最佳设置的具体细节。相反,我将报道
无法或不想编辑核心Apache的典型情况
配置文件,而是求助于.htaccess
文件。什么时候
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)$ index.php?url=/$1 [QSA,L]
</IfModule>
Apache遍历磁盘上的目录结构以查找
正确的文件服务,它检查每个目录中是否有一个文件
名为。htaccess
放置在其中。如果找到一个,它将执行
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)$ index.php?url=/$1 [QSA,L]
</IfModule>
和/或将其中定义的规则合并到文件查找中
进程,然后继续到路径中的下一个更深的目录
您想要实现的是让Apache“查找”并执行一个
任何和所有请求的特定PHP文件,并生成原始URL
可用于该PHP文件,以便它可以自己进行路由。最简单的,
最肮脏的方法是一个简单的重写规则:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)$ index.php?url=/$1 [QSA,L]
</IfModule>
.htaccess
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)$ index.php?url=/$1 [QSA,L]
</IfModule>
第二个url
参数将替换第一个参数。如果您需要使用
在应用程序中的查询参数url
中,选择其他
重写规则的参数名称
其次,请注意kunstube\Router希望URL传递给
route()
以/
开头。您可以在编辑过程中添加该斜杠
重写过程如上所示,或在PHP中;只要确保它是
在那里
第三,您通常也有不想通过路由传送的文件
PHP,例如CSS和图像文件。你会想要这些东西的
由Apache直接提供。这方面的良好设置如下:
/var
/Kunststube
/Router
...
/MyApp
MyScript.php
...
/www
.htaccess
index.php
/css
style.css
...
/img
kitten.jpg
...
从公共web根目录中取出所有实际的PHP文件,
只保留公共资产文件和一个最小的index.php
文件。
<?php
require_once 'Kunststube/Router/Router.php';
$r = new Kunststube\Router\Router;
$r->add('/foo');
...
$r->route($_GET['url']);
将重写规则调整为如下所示:
https://quote.fm/api/recommendation/delete
GET /foo/bar/baz?some=parameters HTTP/1.1
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=/$1 [QSA,L]
</IfModule>
事实上,完全在别处定义路线是更好的做法
并使用自动加载程序加载所需文件,但这超出了
本文件的范围
你要么在寻找“漂亮的URL”(谷歌it),要么在寻找一个完整的路由器(请阅读以下内容:)