0

我创建了一个 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() {

4

2 回答 2

1

我也使用 SlimPHP 并且有一个和你一样的设置。

你用的是什么PHP?如果您使用的版本 >= 5.3,那么您定义路线的方式将不正确。对于较新的 PHP,试试这个:

$app->get('/websites', function () {
    // your code to execute
});

关于你的设置的其他一切对我来说都很正常。

于 2012-09-05T08:32:29.203 回答
1

由于 orangewarp 和这个问题,问题得以解决:

为什么我得到一个 301 重定向到带有斜杠的文件夹名称?

DirectorySlash Off解决方案是在 .htaccess中添加:

我更新的 .htaccess(应用程序调用 Slim.php):

RewriteEngine On
DirectorySlash Off
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [QSA,L]
于 2012-09-07T06:25:39.760 回答