2012-12-12 96 views
2

我有一個調用REST修身服務骨幹腳本。 GET請求正常工作,PUT請求返回404 Not Found。注:這是工作,直到我的代碼是最近移動到另一臺服務器(和它的作品在本地),所以我猜它是與Apache的配置設置。這裏的骨幹腳本的一個片段:PUT請求導致404未找到

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() { 

        } 
       } 
      ); 
     } 

這裏的修身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仍然失敗。

回答

3

我發現這不是太罕見,有些服務器只有GET,POST,HEAD啓用,PUT,DELETE時需要的REST未啓用。情況可能如此。

爲了測試這一點,你可以告訴骨幹通過你的代碼之前調用此用「emulatated HTTP」:

Backbone.emulateHTTP = true; 

這將使骨幹只使用GET/POST請求,但是它會追加到查詢字符串「 _method = PUT」或‘_method = DELETE’,其可以使用在服務器側,以檢測預期的HTTP動詞。

所以你需要做這樣的事情一樣爲你的index.php文件的第一行中的服務器端(之前的任何框架的負載):

if (isset($_REQUEST['_method'])) $_SERVER['REQUEST_METHOD'] = $_REQUEST['_method']; 
相關問題