从 HTML 页面发送请求有两种常用方法,使用 GET 或 POST 之外的 http 方法。
#1:使用 html 表单发送 POST 请求,但包含一个隐藏的表单字段,告诉服务器将请求视为使用不同的方法。这是@xdazz 概述的方法。
<form method="post" action="my_resource.php">
...
<input type="hidden" name="REQUEST_METHOD" value="PUT" />
<form>
在您的 PHP 脚本中"my_resource.php"
,您必须同时查看真正的请求方法和提交的表单字段,以确定调用哪个逻辑:
/* my_resource.php */
$method = strtolower($_SERVER['REQUEST_METHOD']);
if( $method === 'post' && isset($_REQUEST['REQUEST_METHOD'])) {
$tmp = strtolower((string)$_REQUEST['REQUEST_METHOD']);
if( in_array( $tmp, array( 'put', 'delete', 'head', 'options' ))) {
$method = $tmp;
}
unset($tmp);
}
// now, just run the logic that's appropriate for the requested method
switch( $method ) {
case "get":
// logic for GET here
break;
case "put":
// logic for PUT here
break;
case "post":
// logic for POST here
break;
case "delete":
// logic for DELETE here
break;
case "head":
// logic for DELETE here
break;
case "options":
// logic for DELETE here
break;
default:
header('HTTP/1.0 501 Not Implemented');
die();
}
注意:您可以将上述逻辑放入每个页面(或从每个页面调用)。另一种方法是构建代理脚本(例如"rest-form-proxy.php"
)。然后,您站点中的所有表单都将提交给代理,包括 request_method和目标 url。代理将提取提供的信息,并使用正确请求的 http 方法将请求转发到所需的 url。
代理方法是在每个脚本中嵌入逻辑的绝佳替代方案。但是,如果您确实构建了代理,请务必检查请求的 URL,并禁止任何不指向您自己站点的 url。不进行此项检查将允许他人使用您的代理对其他网站发起恶意攻击;它还可能危及您网站上的安全和/或隐私。
--
#2:在您的 HTML 页面中使用 Javascript 来启动XMLHttpRequest。这是一种更复杂的方法,需要一点 javascript,但在某些情况下它可以更灵活。它允许您在不重新加载页面的情况下向服务器发送请求。它还允许您以多种不同格式发送数据(您不仅限于从 html 表单发送数据)。例如:
<button onclick="doSave()">Save</button>
<script>
var myObject = {
// ... some object properties that
// that you'll eventually want to save ...
};
function doSave() {
var xhr = createxmlhttprequest();
// initialize the request by specifying the method
// (ie: "get", "put", "post", "delete", etc.), and the
// url (in this case, "my_resource.php"). The last param
// should always be `true`.
xhr.open("put", "my_resource.php", true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.onreadystatechange = function() {
if (xhr.readystate != 4) { return; }
var serverresponse = xhr.responsetext;
// ... this code runs when the response comes back
// from the server. you'll have to check for success
// and handle the response document (if any).
};
// this initiates the request, sending the contents
// of `myObject` as a JSON string.
xhr.send(JSON.stringify(myObject));
// The request runs in the background
// The `onreadystatechange` function above
// detects and handles the completed response.
}
</script>
XMLHttpRequest 比我在上面的基本示例中展示的要多得多。如果您选择此路线,请仔细研究。除其他事项外,请确保正确处理各种错误情况。跨浏览器兼容性也存在许多问题,其中许多问题可以通过使用中介来解决,例如jQuery 的 $.ajax() 函数。
最后,我应该注意,上述两种方法并不相互排斥。很可能对某些请求使用表单,对其他请求使用 XMLHttpRequest,只要您构建服务器以便它可以处理任何一种请求(如上面的 #1 所示)。