RESTful:如何通过PUT和DELETE发送数据

时间:2014-08-26 09:56:49

标签: php rest

我决定以良好做法的名义开始使用RESTful URL。然而,与往常一样,在斗争开始之前不久。

所以根据我的理解,我应该使用PUT进行更新,但PHP中没有$_PUT超全局。因此,这导致了一个高度科学的实验,包括创建一个方法PUT的表单,目的是找出如何发送PUT数据。我很惊讶地发现了网址中的GET个参数。

必须有一些我缺少的东西,因为我无法使用URL中的数据来更新数据库或其他东西。如果我要求用户输入密码以更新其设置,该怎么办?这是无法形容的。任何人都可以对我有所了解吗?

1 个答案:

答案 0 :(得分:0)

正如我所想,我能够从HTML表单发送PUT和DELETE请求,但它没有产生PUT,但是在GET请求中。

为了使用HTML表单创建RESTful URL,我会使用POST请求和类似的东西

// JavaScript
window.onload = function(){

    var f = document.getElementById('form');
    f.button.onclick = function(){
        var username = f.username.value;
        var password = f.password.value;
        // in a final application I would use a form serializer

        xhr = new XMLHttpRequest();
        var url = "http://www.domain.com/restful/";
        xhr.open("POST", url, true);
        xhr.setRequestHeader("Content-type", "application/json");
        xhr.onreadystatechange = function () { 
            if (xhr.readyState == 4 && xhr.status == 200) {
                console.log(xhr.responseText);

                // you may return a JSON as well
                // var json = JSON.parse(xhr.responseText);
                // console.log(json.username);
            }
        }
        var data = JSON.stringify({"username":"" + username + "","password":"" + password + ""});
        xhr.send(data);

    }
}

<!-- HTML form -->
<form id="form" method="POST" action="">
    <input type="text" name="username" value="" />
    <input type="password" name="password" value="" />
    <input type="button" name="button" value="Submit" />
</form>

// PHP
header("Content-Type: application/json");
if($_SERVER['REQUEST_METHOD'] == 'POST'){
    $input = json_decode(stripslashes(file_get_contents("php://input")), true);
    echo $input['username'];

    // in case you return a JSON, encode data first
    // echo json_encode($input);
}

.htaccess保持不变


[初步答复]

这样您就可以构建PUT请求

$url = 'http://www.domain.com/restful/';
$data = array('username'=>'hey@mail.com','password'=>'101010');
$data_json = json_encode($data);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json','Content-Length: ' . strlen($data_json)));
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_json);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response  = curl_exec($ch);
curl_close($ch);

echo $response;

DELETE请求,就像这样

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_json);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response  = curl_exec($ch);
curl_close($ch);

这是restful目录

中的index.php文件
header("Content-Type: application/json");
if($_SERVER['REQUEST_METHOD'] == 'PUT') {
    $input = json_decode(file_get_contents("php://input")); 
    echo $input->username;
}elseif($_SERVER['REQUEST_METHOD'] == 'DELETE'){
    // ...
}

您可以在.htaccess目标中使用resful将所有内容重定向到index.php

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^?]*)$ /index.php?path=$1 [NC,L]