我决定以良好做法的名义开始使用RESTful URL。然而,与往常一样,在斗争开始之前不久。
所以根据我的理解,我应该使用PUT
进行更新,但PHP中没有$_PUT
超全局。因此,这导致了一个高度科学的实验,包括创建一个方法PUT
的表单,目的是找出如何发送PUT
数据。我很惊讶地发现了网址中的GET
个参数。
必须有一些我缺少的东西,因为我无法使用URL中的数据来更新数据库或其他东西。如果我要求用户输入密码以更新其设置,该怎么办?这是无法形容的。任何人都可以对我有所了解吗?
答案 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
目录
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]