PHP REST 放置/删除选项

标签 php rest

试图了解在 PHP 中创建应用程序的 REST 方法。

我在理解如何从 php 脚本发送 put/delete 时遇到问题。

在网上我只能找到如何确定发送了哪个php方法。

if($_SERVER['REQUEST_METHOD'] == 'DELETE')

但是如何发送这个DELETE方法呢?

通常当我想从 DB 中删除一些记录时我会做什么 我有普通的 html 表单,方法设置为 post/get 并记录db id 然后我按提交按钮发送 post/get 表单。

如何创建此提交以发送delete/put 方法?

最佳答案

有两种常用的方法可以从 HTML 页面发送请求,即使用 GET 或 POST 之外的 http 方法。

#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、目标 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's $.ajax() function .

最后,我要注意的是,以上两种方法并不相互排斥。很可能对某些请求使用表单,对其他请求使用 XMLHttpRequest,只要您构建服务器使其能够处理任何一种请求(如上面的 #1 所示)。

关于PHP REST 放置/删除选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12085619/

相关文章:

php - 即使其状态正在运行,也无法访问在 Docker 中配置的 wordpress

javascript - 在 div 中显示 ajax 检索到的 HTML

java - Angular $http.get 总是在使用本地 Restful 服务时出现错误

reactjs - React 路由器不刷新页面

api - 请求的资源在 Salesforce 中不存在 [错误]。 Salesforce 有什么问题?

node.js - NodeJS 类型错误 : Cannot read property of undefined while accessing cloudant

mysql - NodeJS : Nested SQL query for custom REST API endpoint

php - 调用未定义函数 : Laravel 5. 1

javascript - 将 JavaScript 中的内容打印到 HTML/PHP 页面的表格中

php - 如何在 PHP 中修改函数外部的变量/更好的做某事的方法