2012-12-12 2 views
2

슬림 한 REST 서비스를 호출하는 백본 스크립트가 있습니다. GET 요청이 정상적으로 작동하고 PUT 요청이 404를 찾을 수 없습니다. 참고 :이 코드는 최근에 다른 서버로 옮겨져 (그리고 로컬에서 작동 할 때까지) 작동하기 때문에 Apache 설정과 관련이 있다고 생각합니다. 여기 백본에서 슬림 REST 서비스로의 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 

UPDATE 여기 백본 스크립트의 코드 조각입니다 : 그냥 같은 서비스에 POST를 테스트하고 괜찮 았는데. PUT은 여전히 ​​실패합니다.

답변

3

일부 서버는 GET, POST, HEAD를 사용할 수 있으며 REST에 필요한 PUT, DELETE는 사용할 수 없다는 것을 발견했습니다. 그럴 수도 있습니다.

하면이 테스트하려면 코드 전에이를 호출하여 "emulatated HTTP"를 사용하는 백본을 알 수 있습니다 :

Backbone.emulateHTTP = true; 
는 쿼리 문자열 "을 추가합니다 그러나 이것은 백본 용으로 만 GET/POST 요청을 할 것입니다

_method = PUT "또는"_method = DELETE "를 사용하여 서버 측에서 의도 한 HTTP 동사를 검색 할 수 있습니다.

그래서 당신은 당신의 index.php 파일의 첫 번째 행과 같이 같은 것을 할 필요가 서버 측 (프레임 워크로드의 전) :

if (isset($_REQUEST['_method'])) $_SERVER['REQUEST_METHOD'] = $_REQUEST['_method']; 
관련 문제