Giới thiệu Request / Response
Hai lớp Request và Response để biểu diễn HTTP Message với các thông tin:
- Dòng thông tin của và trạng thái tương ứng
- Các tham số (mà lấy được bằng POST, GET)
- Body của thông điệp
- Các headers
Để tích hợp vào dự án gõ lệnh Composer :
composer require zendframework/zend-http
Lớp Request
Zend\Http\Request giúp bạn làm việc với HTTP Request (các yêu cầu HTTP). Như đã biệt một HTTP Request (thông điệp HTTP, yêu cầu HTTP gửi đi, ví dụ trình duyệt gửi yêu cầu) là thông điệp dạng text có các thành phần như sau:
METHOD URI VERSION HEADERS BODY
Dòng đầu tiên:METHOD = GET, POST, DELETE ..., VERSION là phiên bản HTTP. Các dòng tiếp theo là phần header, mỗi header viết trên từng dòng, hết phần header cách ra một dòng là phần BODY
Phần BODY thường được sử dụng khi client muốn gửi dữ liệu lên Server như nó có thể là các tham số dạng urlencode, một JSON, một XML hoặc thậm chí một hoặc nhiều file
Ví dụ, đây là một HTTP Request
GET http://localhost/zf3/?aa=1 HTTP/1.1 Host: localhost Connection: keep-alive Cache-Control: max-age=0 Accept-Encoding: gzip, deflate, br Accept-Language: en-US,en;q=0.9,vi;q=0.8 name=xuanthulab.net
Tạo đối tượng Request
Bạn có thể tạo ra Request từ phương thức tạo đối tượng fromString() với tham số là chuỗi HTTP Message
use Zend\Http\Request; $request = Request::fromString(<<<STRINGPARAM POST /foo HTTP/1.1 HeaderField1: header-field-value1 HeaderField2: header-field-value2 foo=bar STRINGPARAM );
Hoặc bạn có thể ra ra Request bằng cách tạo ra đối tượng trống, rồi dùng các phương thức thích hợp để thiết lập
$request = new Request(); $request->setMethod(Request::METHOD_POST); $request->setUri('/foo'); $request->getHeaders()->addHeaders([ 'HeaderField1' => 'header-field-value1', 'HeaderField2' => 'header-field-value2', ]); $request->getPost()->set('foo', 'bar');
Một số phương thức trong Request
Phương thức | Chi tiết |
---|---|
static fromString(string $string) | Tạo Request từ chuỗi mô tả đúng chuẩn HTTP Message. |
setMethod($method) / getMethod() | Thiết lập / lấy phương thức của Request (POST, GET ...) |
setUri($uri) / getUri() | thiết lập hoặc lấy URI/URL |
getUriString() | Lấy URI |
setVersion($version) /getVersion() | Thiết lập Version, lấy Version |
setQuery(Parameters $query) | Thiết lập Query |
getQuery($name, $default) | getQuery() - trả về đối tượng chứa các tham số query, getQuery($tenthamso) lấy giá trị tham số query, getQuery($tenthamso, $default) lấy tham số query nếu không có tham số này sẽ trả về giá trị $default |
setPost(Parameters $post) | Thiết lập tham số post |
getPost($name, $default) | Lấy tham số post (xem qetQuery) |
getCookie() | Lấy cookie |
setFiles(Parameters $files) | Thiết lập FILE |
getFiles($name, $default) | Lấy file |
setHeaders(Headers $headers) | Thiết lập Header |
getHeaders($name, $default) | Lấy Header |
setContent($value) | Thiết lập phần body |
getContent() | Lấy phần body. |
isOptions(), isGet(), isHead(), isPost(), isPut(), isDelete(), isTrace(), isConnect(), isPatch() | Kiểm tra xem có phải là phương thức POST, GET, DELETE, PUT ...? |
isXmlHttpRequest() | Có phải XMLHttpRequest gửi từ JavaScript? |
isFlashRequest() | Có phải Flash request? |
renderRequestLine() | Trả về dòng đầu tiên của HTTP Request |
toString() | Xuất HTTP Request thành dạng text |
Lấy Request trong Controller
Với các Action trong Controller bạn có thể lấy đối tượng Request gửi đến và dùng nó lấy các tham số tùy thuộc vào GET / POST ...
Ví dụ trong một Action controller
public function indexAction() { $request = $this->getRequest(); //lấy id sản phẩm biểu diễn trong URL //ví dụ http://sample.com?productid=5000 thì $pid = 5000 $pid = $request->getQuery("productid",1); $uri = $request->getUri(); if ($request->isPost()) { //lấy dữ liệu form post đến $name = $request->getPost("name", null); } return new ViewModel(); }
Lớp Response
Zend\Http\Response biểu diễn HTTP Response, là thông điệp dạng text mà Server gửi trả về cho khách (trình duyệt), một HTTP Response có dạng Text như sau:
VERSION CODE REASON HEADERS BODY
Tương tự Request bạn cũng có thể tạo Response từ hàm factory fromString()
use Zend\Http\Response; $response = Response::fromString(<<<EOS HTTP/1.0 200 OK HeaderField1: header-field-value HeaderField2: header-field-value2 <html< <body<Hello World</body< </html< EOS);
Hoặc bằng cách sử dụng các phương thức:
$response = new Response(); $response->setStatusCode(Response::STATUS_CODE_200); $response->getHeaders()->addHeaders([ 'HeaderField1' => 'header-field-value', 'HeaderField2' => 'header-field-value2', ]); $response->setContent(<<<EOS <html< <body<Hello World</body< </html< EOS );
Lấy Response trong Controller
Trong các controller có thể gọi getResponse() để lấy Response
Ví dụ
public function indexAction() { $response = $this->getResponse(); /* $content = $this->getContent(); $response->setStatusCode(404); $response->setReasonPhrase("Trang không thấy"); $response->setHeaders(['a'=>'b']); */ return $response->setContent("Hello"); }
Các phương thức trong Response
Method | Chi tiết |
---|---|
fromString($string) |
Tạo Response từ chuỗi theo cấu trúc HTTP Response |
toString() |
Chuyển thành chuỗi HTTP Response. |
setStatusCode($code) |
Mã trạng thái 200, 404 ... |
getStatusCode() |
Lấy mã trạng thái. |
setReasonPhrase($reasonPhrase) |
Thiết lập dòng text thông báo về trạng thái |
getReasonPhrase() |
Đọc dòng text thông báo về trạng thái |
isForbidden() |
Kiểm tra xem có phải bại cấm (403). |
isNotFound() |
Kiểm tra xem có phải không thấy trang (404). |
isOk() |
Kiểm tra xem trạng thái OK (200) |
isServerError() |
Kiểm tra thông báo lỗi Server (5xx). |
isRedirect() |
Kiểm tra xem có phải chuyển hướng (303) |
isSuccess() |
Kiểm tra có thành công (200) |
setHeaders(Headers $headers) |
Thiết lập Header |
getHeaders() |
Lấy các Header |
getCookie() |
Lấy Cookie. |
setContent($value) |
Thiết lập Cookie. |
getContent() |
Lấy nội dung trả về (RAW). |
getBody() |
Lấy nội dung trả về (đã decode). |