php-Rest Api的服务器端实现
作者:互联网
我正在学习bone.js和rest api.有一件事情真的困扰着我. urlRoot!
我非常习惯AJAX调用,我们在其中提供一个名为handleAjaxCall.php的文件,其中包含xmlhttp.open(“ POST”,“ handleAjaxCall.php”,true);这意味着使用post方法将请求发送到handleAjaxCall.php.
在handleAjaxCall.php中,我使用发送的信息并将其保存在数据库中.但是在模型的urlRoot中,URL总是令人困惑;就像urlRoot:“ / books”.我发现该URL是使用重写模块在.htaccess中创建的逻辑URL.我对吗?因此,我没有重写它,而是指向一个外部文件说:
url:'./itemInfo/itemListRet.php', or url:'./itemInfo/itemList.json
itemListRet.php具有以下代码
<?php
$res = "{category:'check',name:'checkname',id:'itemname1'}";
echo $res;
?>
itemList.json has following information:
{
id:"item1",
name:"name1",
category:"cat1"
}
当我将fetch用于模型时,我根本没有收到数据.
在AJAX中,我编写了PHP代码以接收数据并将其保存在数据库中.
我到处都了解REST,它说发布是保存新内容,获取是阅读内容,放置是更新内容,删除是删除内容.但是,究竟谁在服务器中处理所有这一切?节省的确切地点在哪里?它在数据库中吗?
解决方法:
我目前正在从头开始编写自己的RESTful API.我会给您一个大纲,以帮助您了解基础知识.
htaccess:
已知htaccess的性能不佳,并且路由能力受到限制. htaccess扮演的唯一角色是将请求路由到单个php文件.该php文件将成为api的入口点.我这样访问我的api:site.com/api,因此我使用此规则将所有/ api请求路由到一个php文件:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^api/(.*)$api/index.php [L]
因此,对site.com/api的任何请求现在都路由到api / index.php.该文件将负责弄清所请求的数据,检索并打印结果.
index.php
通常,路由系统将具有写出路径的方法以及关于该路径的操作的说明.例如:
$myRoutes = [
'/' => 'home.php',
'/juices' => 'juices.php'
];
$route = $_SERVER['REQUEST_URI'];
//if we have instructions for this route
if (in_array($route, $myRoutes)) {
//inlude the route file
include $myRoutes[$route];
}
else {
//this route is not defined
echo "Go to a real page. This one doesn't exist."
}
完整的路由解决方案将具有解析有关url的其他内容(路由参数,查询字符串)的方法,因此/ juices / apple可以作为apples作为汁液集合的一部分来处理.
我的api处理路由略有不同.我选择了一种更动态的方法,其中我的脚本将尝试基于api / thisParOfTheUrl实例化一个类,因此api / juices对应于新的JuicesController().这实际上是一个复杂的过程,这个示例大大简化了它,但是请考虑这种方法:
//$controllerName = 'juices'; //extract "juices" from api/juices/apple
//this class will be autoloaded - autoloading is awesome
$controller = new $controllerName();
$data = $controller->handle($request);
echo $data;
在这两种方法中,将URL与能够获取所请求数据的代码相关联只是目标.
动词
发送到api的请求将带有一个动词,告诉api如何处理资源.由于有一些较新的动词,例如PATCH,因此我不会对此进行详细说明,以免与任何可用的较新信息冲突.从体系结构上讲,您唯一需要了解的是脚本中的某些内容可以识别动词并知道如何基于该动词进行响应.我所有的api控制器都是从基本控制器扩展而来的,该基本控制器拒绝默认情况下不是GET的所有请求.每个控制器都可以覆盖它,并使其他方法可用(等待授权检查).
数据去哪儿了?
数据可以存放在任何您想要或需要的地方.我的api的大部分资源都存储在数据库中.我的资源之一实际上是通过搜索文件来编译的.您可以使用服务器端语言可以获取或创建的任何数据.做你想做的.
RESTful的
正如我提到的,请确保不要将您的uri视为行动.您想将请求视为集合或集合中的项目.您可以根据自己的意愿来确定他们的身份,但是我认为id是最好的,因为id永远都不会改变.这里有些例子.
api/articles
api/articles/15
api/users
api/user/4
有用的框架:
看看Zend,Symfony和Laravel非常受欢迎(也可能还有其他不错的选择).如果您想使用框架来构建自己的框架,则可以在每个框架上搜索“带有__的REST API”,并找到良好的结果,以帮助您入门.
您的主干代码:
var modelClass = Backbone.Model.extend({
initialize: function() {
this.on('all', function(e) {
console.log('Event is '+e+' and id is '+this.get('id'));
});
},
url:"itemList.json",
defaults: {
id:"def Item",
name:"def name",
category:"def cat"
}
});
var modelObj1 = new modelClass();
modelObj1.fetch().then(function(resp) {
foo(resp);
})
function foo(resp) {
console.log(resp);
}
itemList.json
{
"id":"item1",
"name":"name1",
"category":"cat1"
}
urlRoot属性只是设置请求url的基础部分.想一想我如何解释api / juices / apple.如果我们有Juices模型,则可以将urlRoot设置为api / Juices.这将不在您的示例代码中,因为请求将是itemList.json / def Item.
标签:rest,url,backbone-js,php 来源: https://codeday.me/bug/20191122/2058065.html