Cakephp REST API - 放置和删除不起作用?

时间:2014-03-19 08:52:51

标签: javascript php jquery api cakephp

您好我有一个简单的jquery代码请求put to cakephp

$("#putBtn").click(function(){
    var id = $("#searchTxt").val();
    $.ajax({
        url: 'http://localhost/cakephp/recipes/'+id,
        type: 'PUT',
        async: false,
        cache: false,
        dataType:'json',
        data:{
            name:"777",
            number:"777"
        },
        success: function(data) {
           console.log(data);
        },
        error: function(textStatus, errorThrown) {
            console.log("error");
        }
    });
});

问题是当运行此命令并将其发送到cakephp时 这是错误的

/ cakephp中/食谱/ 1。 No' Access-Control-Allow-Origin'标头出现在请求的资源上。起源' null'因此不允许访问。 jQuery的2.1.0.js:8556 错误

在我的cakephp中,我只是按照本教程 //book.cakephp.org/2.0/en/development/rest.html

public function edit($id) {
    header("Access-Control-Allow-Origin: *");
    header('Content-Type: application/json');
    header("Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, DELETE");
    header("Access-Control-Allow-Headers: Content-Type");
    $this->viewClass = 'json';
    if ($this->Recipe->save($this->data)) {
        $message = 'Saved';
    } else {
        $message = 'Error';
    }
    $this->set(array(
        'message' => $message,
        '_serialize' => array('message')
    ));
}

我还添加了router.php和

Router::resourceMap(array(
    array('action' => 'index', 'method' => 'GET', 'id' => false),
    array('action' => 'view', 'method' => 'GET', 'id' => true),
    array('action' => 'add', 'method' => 'POST', 'id' => false),
    array('action' => 'edit', 'method' => 'PUT', 'id' => true),
    array('action' => 'delete', 'method' => 'DELETE', 'id' => true),
    array('action' => 'update', 'method' => 'POST', 'id' => true)
));

Router::mapResources('recipes');
Router::parseExtensions();

我不知道为什么cakephp不接受我的PUT或DELETE命令请求。 有什么建议或意见吗?或者我做错了什么。 thx提前。

1 个答案:

答案 0 :(得分:1)

我遇到与 CakePHP版本2.5.4 类似的问题,用于解析PUT调用。

不优雅,但确实有效。

前端代码:

$("#myButton").click(function() {

    $.ajax({
          type      : 'PUT',
          url       : '/projects/foo',
          dataType  : 'json',
          data      : JSON.stringify({
              'projectId'   : 789,
              'desc'        : "cheese cake",
          }),
          success: function(return_data) {
            alert("success");
            console.log(JSON.stringify(return_data));
          },
          error: function(return_data) {
            alert("error");
            console.log(JSON.stringify(return_data));
          });
});

后端代码(app / Controller / ProjectsController.php)

public function foo() {

        $this->autoRender = false;

        if($this->request->is('PUT')) {

            $in = $this->request->data;
            reset($in);
            $in = json_decode(key($in), true);

            $project_id = $in['projectId'];
            $desc = $in['desc'];
        }

        $response = array(
            'project_id'    => $project_id,
            'desc'          => $desc,
            );

        echo json_encode($response);
        exit;
}

结果:

测试此代码时检查控制台。它将首先发回您发送的内容,但会保证CakePHP中的后端代码现在可以解析这些JSON PUT请求。