HTTP Basics - The Web
The internet is a massive distributed Client-Server system.
HTTP Stateless Protocol
HTTP allows a variety of hosts and clients to communicate.
In order to make this possible each request knows nothing about previous requests (Stateless).
HTTP - Request - Response
Communication between client and host starts when the client sends a request to the server.
The server processes the request and generates a response that is sent back to the client.
Request
The request is a message sent from the client to an HTTP server "requesting" access to a resource.
A resource is information that can be identified by a URL, e.g. an image, file, html, etc.
Response
The response is a message sent by the HTTP server back to the client usually containing the resource
that was requested.
The Uniform Resource Locator (URL)
Structure of HTTP Messages
Request and Response messages are similar:
- Initial Line: Request/Response line
- Request/Response Headers
- An empty line
- Optional message body
Request Message
GET /profile/me.html HTTP/1.1
Host: www.website.com
Accept: text/html
The Request line is the most important in the message and it contains:
- HTTP Method (GET)
- URI
- HTTP Version
The client MUST include the Host header field in all HTTP/1.1 requests.
Response Message
HTTP/1.1 200 OK
Date: Sat, 02 Apr 2011 21:05:05 GMT
Server: lighttpd/1.4.19
Content-Type: text/html; charset=UTF-8
The Response line, AKA Status Line, contains:
- HTTP Version
- Response Status Code
- Reason Phrase
The response headers indicate the date, server type and the response body type.
Header types
Not all headers are made equal:
- General header: can be used in both request and response
- Request header: only applicable to request messages
- Response header: only applicable to response messages
- Entity header: define meta-information about the body
HTTP Verbs
The action that should be performed in the host server is set using HTTP verbs.
-
GET: get an existing resource (Safe and Idempotent Method)
-
POST: send data to the server e.g. create new resource (Not Safe nor Idempotent)
-
PUT: Update or create an resource (Not Safe but Idempotent)
-
DELETE: Delete a resource (Not Safe but Idempotent)
Status Codes
All Responses contains status codes. Codes are important because they have a meaning
-
Informational 1xx: Indicate a provisional response
-
Successful 2xx: Indicate that the client request was successful
-
Redirection 3xx: Indicates that further action is needed
-
Client Error 4xx Indicates when the client seems to have erred
-
Internal Server Error 5xx: Indicates cases in which the server is aware that it has erred
Handling request in PHP
All request information will be contained within the $_REQUEST super-global.
GET /test.php?hello=hola&world=mundo! HTTP/1.1
Host: dev.sandbox.io:8080
Accept: application/json
Cache-Control: no-cache
print_r($_REQUEST);
print_r(parseRequestHeaders());
function parseRequestHeaders() {
$headers = array();
foreach($_SERVER as $key => $value) {
if (substr($key, 0, 5) != 'HTTP_') {continue;}
$header = str_replace(' ', '-', ucwords(str_replace('_', ' ', strtolower(substr($key, 5)))));
$headers[$header] = $value;
}
return $headers;
}
The results
Array
(
[hello] => hola
[world] => mundo!
)
Array
(
[Host] => dev.sandbox.io:8080
[Connection] => keep-alive
[Accept] => application/json
[Cache-Control] => no-cache
[User-Agent] => Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36
[Accept-Encoding] => gzip,deflate,sdch
[Accept-Language] => en-US,en;q=0.8,es;q=0.6
)
Request/Response application
Using Symfony HTTP Foundation
The gola of the HttpFoundation is to "replace the default PHP global variables and functions by an Object-Oriented
layer"[13]
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
$request = Request::createFromGlobals();
$hello = $request->query->get('hello');
$world = $request->query->get('world');
$response = new Response(
$hello . ' ' . $world .'!',
Response::HTTP_OK,
['content-type' => 'text/html']
);
$response->send();
Request Methods
// the URI being requested (e.g. /about) minus any query parameters
$request->getPathInfo();
// retrieve GET and POST variables respectively
$request->query->get('foo');
$request->request->get('bar', 'default value if bar does not exist');
// retrieve SERVER variables
$request->server->get('HTTP_HOST');
// retrieves an instance of UploadedFile identified by foo
$request->files->get('foo');
// retrieve a COOKIE value
$request->cookies->get('PHPSESSID');
// retrieve an HTTP request header, with normalized, lowercase keys
$request->headers->get('host');
$request->headers->get('content_type');
$request->getMethod(); // GET, POST, PUT, DELETE, HEAD
$request->getLanguages(); // an array of languages the client accepts
Response methods
use Symfony\Component\HttpFoundation\Response;
$response = new Response();
$response->setContent('<html><body><h1>Hello world!</h1></body></html>');
$response->setStatusCode(Response::HTTP_OK);
$response->headers->set('Content-Type', 'text/html');
// prints the HTTP headers followed by the content
$response->send();
Next time Symfony2 Kernel
THE END
BY Juan Manuel Torres / onema.io / @onema
References
[1] http://tools.ietf.org/html/rfc2616#section-9.5
[2]http://tools.ietf.org/html/rfc2616#page-128
[3]http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html
[4]http://www.ntu.edu.sg/home/ehchua/programming/webprogramming/HTTP_Basics.html
[5] http://code.tutsplus.com/tutorials/http-the-protocol-every-web-developer-must-know-part-1--net-31177
[6] http://symfony.com/doc/current/book/http_fundamentals.html
[7] http://www.jmarshall.com/easy/http/
[8] http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol
[9] http://www.tutorialspoint.com/http/http_requests.htm
[10] http://symfony.com/doc/current/components/http_foundation/introduction.html
[11] http://php.net/manual/en/reserved.variables.request.php
[12] http://stackoverflow.com/questions/541430/how-do-i-read-any-request-header-in-php
[13] http://fabien.potencier.org/article/51/create-your-own-framework-on-top-of-the-symfony2-components-part-2