2

我有一个调用 Slim REST 服务的主干脚本。GET 请求工作正常,PUT 请求返回 404 Not Found。注意:这一直有效,直到我的代码最近被移动到不同的服务器(并且它在本地工作),所以我猜它与 Apache 配置设置有关。这是主干脚本的片段:

jQuery(document).ready(function ($) {

    //define box model
    var Box = Backbone.Model.extend({
        url: function () {
            var urlId = (this.id) ? this.id : "";
            var myUrl = "/wp-includes/api/service.php/box/" + urlId;
            return myUrl;   
        }
    });

        var BoxView = Backbone.View.extend({
        tagName: "div",
        template: $("#boxTemplate").html(),

        initialize: function () {
            this.model = new Box(box);
            this.render();
        },

        saveBox: function(e){
            e.preventDefault();
            $("#boxMessage").empty();
            var formData = {},
                prev = this.model.previousAttributes();

            $(e.target).closest("form").find(":input").not("button").each(function (){          
                var el = $(this);
                formData[el.attr("id")] = el.val();
            });

            this.model.set(formData);
            this.model.save(
                { },
                {
                    success: function() {
                        $("#boxMessage").html("Box information saved.");
                    },
                    error: function() {

                    }
                }
            );
        }

下面是 Slim REST 服务的一个片段:

<?php

require 'Slim/Slim.php';

$app = new Slim();

$app->get('/workouts/:id',  'getWorkout');
$app->put('/box/:id', 'updateEventBox');

$app->run();

function getWorkout($id) {
    echo json_encode(GetEventCompetitorWorkout($id));
}

function updateEventBox($id) {
    $request = Slim::getInstance()->request();
    $body = $request->getBody();
    $eventBox = new EventBox(null);
    $eventBox->TakeJson($body);
    $eventBox->Save();
}

这是请求的标头信息:

Request URL:http://www.mydomain.com/wp-includes/api/service.php/box/1
Request Method:PUT
Status Code:404 Not Found

更新:刚刚测试了同一服务的 POST 并且效果很好。PUT 仍然失败。

4

1 回答 1

3

我发现某些服务器只启用了 GET、POST、HEAD 并且未启用 REST 所需的 PUT、DELETE 并不少见。情况可能是这样。

要对此进行测试,您可以通过在代码之前调用它来告诉 Backbone 使用“模拟 HTTP”:

Backbone.emulateHTTP = true;

这将使骨干网仅使用 GET/POST 请求,但是它将附加到查询字符串“_method=PUT”或“_method=DELETE”,您可以在服务器端使用它们来检测预期的 HTTP 动词。

因此,在服务器端,您需要像 index.php 文件的第一行那样做这样的事情(在任何框架加载之前):

if (isset($_REQUEST['_method'])) $_SERVER['REQUEST_METHOD'] = $_REQUEST['_method'];
于 2012-12-14T02:45:05.523 回答