我创建了一个 Backbone.js 模型并希望将一个实例保存到我的 MySql 数据库中。
var Website = Backbone.Model.extend({
defaults: {
"title":"default title"
},
urlRoot : './websites'
});
var website = new Website();
website.save();
我正在使用Slim.php为我的数据库创建一个 Restful API。这是 website\index.php 的开头:
<?php
require 'Slim/Slim.php';
$app = new Slim();
$app->get('/websites', 'getWebsites');
$app->get('/websites/:id', 'getWebsite');
$app->post('/websites', 'addWebsite');
$app->put('/websites/:id', 'updateWebsite');
$app->delete('/websites/:id', 'deleteWebsite');
$app->run();
我的 save() 触发了一个“永久移动”的 POST:
请求 URL:localhost/SAMPLE-CODES/backbone.js-mysql-reading-json/websites 请求方法:POST 状态代码:301 永久移动
然后我看到发送了第二个 http 请求:
请求 URL:localhost/SAMPLE-CODES/backbone.js-mysql-reading-json/websites/ 请求方法:GET 状态码:404 Not Found
我的问题是:为什么这个请求没有触发对“addWebsite”函数的调用?我看到第二个 http 请求是一个 GET,它应该是一个 POST,但即使这样,也有一个路由......
我有一个文件夹 /websites/
我还根据Slim 路由文档设置了 .htaccess 和 http.conf :
.htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [QSA,L]
http.conf
<VirtualHost *:80>
<Directory "c:/xampp/htdocs/SAMPLE-CODES/backbone.js-mysql-reading-json/websites/">
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
编辑:
对 model.save() 的调用会触发一个 http POST 到
localhost/SAMPLE-CODES/backbone-mysql-reading-json/websites
.
这会得到一个带有响应头的“301 Moved Permanently”:
localhost/SAMPLE-CODES/backbone-mysql-reading-json/websites/
.
我认为这是由于 Slim 推荐的 .htaccess 设置。
问题:这个“301 永久移动”是否可以,或者我在这里已经有问题了?
然后我看到第二个 http GET
localhost/SAMPLE-CODES/backbone-mysql-reading-json/websites/
更新:
我仍然收到301
localhost/SAMPLE-CODES/backbone-mysql-reading-json/websites
,然后 GET 到
localhost/SAMPLE-CODES/backbone-mysql-reading-json/websites/
第二个请求在浏览器上运行并返回
[{"id":"1","title":"标题站点 1"},{"id":"2","title":"标题站点 2"}]
所以这将是所有记录的响应,但我想保存 1 条记录。似乎重定向 301 是错误的。
我有一种感觉,这是由于 Slim 没有找到匹配的路由(Slim_Exception_RequestSlash 会触发 301)。
但是为什么我的 Slim 脚本找不到路由呢?
请求
localhost/SAMPLE-CODES/backbone-mysql-reading-json/websites
匹配:
$app->post('/网站', function() {