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リクエストのみを使用しますが、サーバー側で目的のHTTP動詞を検出するために使用できるクエリ文字列「_method=PUT」または「_method=DELETE」に追加されます。

したがって、サーバー側では、index.phpファイルの最初の行(フレームワークが読み込まれる前)のように、次のようなことを行う必要があります。

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