gpt4 book ai didi

php - Rest Api 的服务器端实现

转载 作者:搜寻专家 更新时间:2023-10-31 20:41:10 24 4
gpt4 key购买 nike

我正在学习 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。该文件将负责确定请求的数据、检索数据并打印结果。

索引.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 的大部分资源都存储在数据库中。我的资源之一实际上是通过搜索文件编译的。您的服务器端语言可以获得或创建的任何数据 - 您都可以使用。随心所欲。

RESTful uri 的

正如我提到的,一定不要将您的 uri 视为操作。您希望将请求视为一个集合或集合中的一个项目。您可以按照自己的方式识别它们,但我发现 id 最好,因为 id 永远不应该改变。以下是一些示例。

api/articles
api/articles/15
api/users
api/user/4

有用的框架:

查看 Zend、Symfony、Laravel 非常流行(可能还有其他不错的选择)。如果您想使用框架构建自己的框架,您可以在谷歌上搜索“REST api with __”并找到好的结果来帮助您入门。

您的 Backbone 代码:

Live demo (click).

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%20Item

关于php - Rest Api 的服务器端实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21212978/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com