我在理解如何从PHP脚本发送put / delete方面遇到了问题.
if($_SERVER['REQUEST_METHOD'] == 'DELETE')
但是如何发送这个DELETE方法呢?
Normaly当我想从DB中删除一些记录时我做了什么我有正常的html表单,方法设置为post / get并记录db id然后我按下提交按钮发送post / get表单.
#1:使用html表单发送POST请求,但包含一个隐藏的表单字段,告诉服务器将请求视为使用不同的方法.这是方法outlined by @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和目标网址.代理将提取所提供的信息,并使用正确请求的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’s $.ajax() function.
最后,我应该注意到上述两种方法并不相互排斥.只要您构建服务器以便它可以处理任何类型的请求(如上面的#1所示),就可以将表单用于某些请求,并将XMLHttpRequest用于其他请求.