- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在学习 backbone.js 和 rest api。有一件事真的很困扰我。 urlRoot!
我非常习惯 AJAX 调用,我们提供了一个文件 handleAjaxCall.php 包含 xmlhttp.open("POST","handleAjaxCall.php",true);
这意味着发送使用 post 方法请求 handleAjaxCall.php。
在 handleAjaxCall.php
中,我使用发送的信息并将其保存在我的数据库中。但是在模型的 urlRoot 中,URL 总是令人困惑;它就像 urlRoot:"/books"。我发现该 URL 是一个逻辑 URL,它是使用重写模块在 .htaccess 中创建的。我对吗?所以我没有重写,而是将它指向一个外部文件说:
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,它说 post 是保存新的,get 是阅读的,put 是更新的,delete 是删除的。但究竟是谁在服务器中处理所有这些,以及保存发生在何处?它在数据库中吗?
最佳答案
我目前正在从头开始编写自己的 RESTful API。我会给你一个大纲来帮助你理解基础知识。
众所周知,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
。该文件将负责确定请求的数据、检索数据并打印结果。
通常,路由系统将有一种方法来写出路径和关于如何处理该路径的指令。例如:
$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
可以像 apple
一样被处理juices
集合中的一项。
我的 api 处理路由有点不同。我选择了一种更动态的方法,我的脚本将尝试根据 api/thisParOfTheUrl
实例化一个类,因此 api/juices
对应于 new 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 Controller 都是从一个基本 Controller 扩展而来的,该 Controller 拒绝默认情况下不是 GET 的所有请求。每个 Controller 都可以覆盖它并使其他方法可用(等待授权检查)。
数据可以随心所欲地传送到任何地方。我的 api 的大部分资源都存储在数据库中。我的资源之一实际上是通过搜索文件编译的。您的服务器端语言可以获得或创建的任何数据 - 您都可以使用。随心所欲。
正如我提到的,一定不要将您的 uri 视为操作。您希望将请求视为一个集合或集合中的一个项目。您可以按照自己的方式识别它们,但我发现 id 最好,因为 id 永远不应该改变。以下是一些示例。
api/articles
api/articles/15
api/users
api/user/4
查看 Zend、Symfony、Laravel 非常流行(可能还有其他不错的选择)。如果您想使用框架构建自己的框架,您可以在谷歌上搜索“REST api with __”并找到好的结果来帮助您入门。
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);
}
{
"id":"item1",
"name":"name1",
"category":"cat1"
}
urlRoot
属性只是设置请求 url 的基础部分。想一想我是如何解释 api/juices/apple
的。如果我们有一个 Juices
模型,urlRoot 可以设置为 api/Juices
。这不会出现在您的示例代码中,因为请求将是 itemList.json/def%20Item
。
关于php - Rest Api 的服务器端实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21212978/
我在使用 Jade 和 express 时遇到了一些问题。这是 serder 端: router.get('/login', function (req, res) { res.status(2
是否可以使用 JavaScript 服务器端,从而在某些核心计算中不会显示在页面源代码中? 我正在开发一款游戏,代码的一个关键部分只需要在服务器端计算然后传回客户端。 我的整个游戏都是用 Javasc
我正在寻找有关如何使用 ExtJS 4 实现安全页面的信息。我所说的安全页面是指用户将使用 Siteminder (SSO) 登录我们的网站,因此我们将拥有用户的身份。然后我们将通过进行数据库/LDA
我的 Centos 7 服务器正在运行 apache 2.4.6,并且正在使用 mod_wsgi 提供 django webapp。我的问题是我无法从另一台计算机的浏览器访问服务器 url。我没有从
我们收到了客户的请求,要求我们基于 ExtJS 框架构建 Web 应用程序。我查看了互联网,发现 ExtJs 只是一个客户端 javascript 控件,但我认为 Web 应用程序也必须具有服务器端
我有三个组件。 组件一包含组件二和三。 组件二是一个列表。 组件三用于向数据库添加项目。 当我将一个项目保存到数据库时,我想更新组件二中的列表。 我怎么做? 最佳答案 设想 让我们假设:
欢迎, 我正在寻找能使我以尽可能高的格式下载youtube视频的youtube api。 几年前,这项工作更为简单,因为url拥有关于质量的信息,例如“fmt = 22”或“fmt = 6”,我们现在
我想将电子邮件 x@x.com 的用户密码设置为“an”。但代码不起作用。这是我的云代码: Parse.Cloud.define('testSetPasswordForUser', functio
正在阅读http://cocoawithlove.com/2010/03/streaming-mp3aac-audio-again.html这篇文章,想知道如何在服务器端实现它,是否像将文件放在htd
我有一个使用一些 css/javascript 选项卡的 php 脚本,它们在我的本地服务器上运行,但当我上传到我的在线服务器时则不起作用。 只是想知道是否有人知道为什么会出现这种情况?所有路径都
是否可以从 JavaScript 脚本获取服务器端页面的源代码?我希望能够获取服务器上同一文件夹中的页面的源代码。除了javascript之外,是否可以不使用任何其他东西? 最佳答案 如果您想从 ja
.NET 4.0 我正在寻找在我们的服务器上生成Word文档的最简单方法。 局限性: 服务器端 我不想在服务器上安装word 数据源是XML 我试图用XSLT生成快速简单的DOCX,但是我可以找到的用
我正在使用 native jQuery 验证库来验证在联系表单中输入的电子邮件地址。由于这是一个表达式引擎站点,因此我使用其电子邮件验证器作为服务器端备份。 当我输入 test@b.c 时,jQuer
我使用带有服务器端处理的数据表来显示数万行。我需要通过复选框过滤这些数据。我能够制作一个工作正常的复选框,但我不知道如何添加多个复选框以协同工作。我找到了 similar solution在这里,但我
我正在尝试编写一个消息传递应用程序,并且我能够发送消息(显示为服务器客户端正确显示消息)但随后将我的客户端踢出服务器。服务器打印以下错误: java.io.EOFException at java.i
如果设备是移动设备,如何防止侧边栏加载服务器端资源?我了解如何通过 CSS 隐藏,但我更感兴趣的是防止对服务器的调用。 最佳答案 WordPress有一个名为wp_is_mobile()的函数它将检查
我有一个返回 text/event-stream 数据的网址,因此我尝试连接并打印我找到的所有内容: var url = "..." var source = new EventSource(url)
我得到这样的错误列表:{ error: [ "Email is required", "First Name is required"] } 我需要如何修改它,以获取包含字段名称的列表? public
我正在尝试使用 ASIFormDataRequest 将数据发送到 ASP.net 服务器端。我创建了一个aspx页面。目前我可以得到这两个纯文本。但是我不知道如何通过 Request.Form 在
我在 ${host}/api/graphql 有一个可通过 POST 访问的快速 graphql 端点。 在那条路线上,我有身份验证中间件,如果用户未登录,我想重定向到登录页面。 看起来有点像这样。
我是一名优秀的程序员,十分优秀!