Giới thiệu Request / Response

Hai lớp RequestResponse để 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).

Đăng ký nhận bài viết mới