phphttphttp-deletehttp-puthttp-options-method

HTTP protocol's PUT and DELETE and their usage in PHP


Introduction

I've read the following:

Hypertext Transfer Protocol (HTTP) is the life of the web. It's used every time you transfer a document, or make an AJAX request. But HTTP is surprisingly a relative unknown among some web developers.

The HTTP verbs comprise a major portion of our “uniform interface” constraint and provide us the action counterpart to the noun-based resource. The primary or most-commonly-used HTTP verbs (or methods, as they are properly called) are POST, GET, PUT, and DELETE.

Huh?

Well, we came to the point I lost track of things.

PUT and DELETE, they say. I've only ever heard of POST and GET and never saw something like $_PUT or $_DELETE passing by in any PHP code I've ever viewed.

My question

What are these methods (PUT) and (DELETE) for and if it's possible to use them in PHP, how would I go about this.

Note: I know this is not really a problem but I always grab a learning opportunity if I see one and would very much like to learn to use these methods in PHP if this is possible.


Solution

  • What are these methods (PUT) and (DELETE) for...

    There are a lot of words to spend to explain this, and I'm not skilled enough to do it, but as already posted, a quick recap of what the HTTP specification describes.

    The protocol basically says this:

    Basically a protocol is a set of rules you should use from your application to adhere to it.


    ... and if it's possible to use them in PHP, how would I go about this.

    From your php application you can retrieve which method was used by looking into the super global array $_SERVER and check the value of the field REQUEST_METHOD.

    So from your php application you're now able to recognize if this is a DELETE or a PUT request, ex. $_SERVER['REQUEST_METHOD'] === 'DELETE' or $_SERVER['REQUEST_METHOD'] === 'PUT'.

    * Please be also aware that some applications dealing with browsers that don't support PUT or DELETE methods use the following trick, a hidden field from the html form with the verb specified in its value attribute, ex.:

    <input name="_method" type="hidden" value="delete" />
    

    Follow an example with a small description on a possible way to handle those 2 http requests

    When you (your browser, your client) request a resource to an HTTP server you must use one of the method that the protocol (HTTP) accepts. So your request needs to pass:

    Now, while you would be able to get data from POST and GET requests with the respective globals ($_GET, $_POST), in case of PUT and DELETE requests PHP doesn't provide these fast access globals; But you can use the value of $_SERVER['REQUEST_METHOD'] to check the method in the request and handle your logic consequently.

    So a PUT request would look like:

    PUT /something/index.php
    
    (body) maybe=aparameter
    

    and you can access those data in PHP by reading the php://input stream, ex. with something like:

    if ($_SERVER['REQUEST_METHOD'] === 'PUT') { 
        $myEntireBody = file_get_contents('php://input'); //Be aware that the stream can only be read once
    }
    

    and a DELETE request would look like:

    DELETE /something/index.php?maybe=aparameter
    

    and again you can build your logic after have checked the method:

    if ($_SERVER['REQUEST_METHOD'] === 'DELETE') { 
        // do something
    }
    

    Please pay attention that a DELETE request has no Body and pay very attention to Response Status Code too (ex. if you received a PUT request and you've updated that resource without error you should return a 204 status -No content-).