Làm cách nào để nhận tiêu đề phản hồi trong PHP?

Với phương thức curl_setopt(), khi CURLOPT_HEADER được đặt thành true, curl_exec  sẽ xuất ra tiêu đề phản hồi. Tại thời điểm này, nếu CURLOPT_NOBODY được đặt thành false, thì curl_setopt() sẽ trả về tiêu đề phản hồi và nội dung nội dung, nếu không thì chỉ trả về tiêu đề phản hồi

Chúng ta có thể sử dụng phương thức curl_getinfo($ch, CURLINFO_HEADER_SIZE) để trả về tổng kích thước của tất cả các tiêu đề nhận được

đầu ra

HTTP/1.1 200 OK
Date: Tue, 28 Apr 2020 15:11:27 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=ISO-8859-1
P3P: CP="This is not a P3P policy! See g.co/p3phelp for more info."
Server: gws
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN
Set-Cookie: 1P_JAR=2020-04-28-15; expires=Thu, 28-May-2020 15:11:27 GMT; path=/; domain=.google.com; Secure
Set-Cookie: NID=203=DasuCttFxUVDirSokzwSf91r3PD60lDxlFogt2-rg5m0BCbhSeCpWcIlJVAmuLiDUkXmBTXuVbKEcP8gT0ifJzTu1MW-9UfriAyIqPESXl2H6fOsb9mvDZH8ng4Nb_YQk4Xv1uMFpCMiVf6GSHZS7dje2cjq1qvgyFiQfb3bOTA; expires=Wed, 28-Oct-2020 15:11:27 GMT; path=/; domain=.google.com; HttpOnly
Alt-Svc: quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,h3-T050=":443"; ma=2592000
Accept-Ranges: none
Vary: Accept-Encoding
Transfer-Encoding: chunked

Với tùy chọn CURLOPT_HEADERFUNCTION, chúng ta có thể đặt chức năng gọi lại

đầu ra

Array
(
    [date] => Array
        (
            [0] => Tue, 28 Apr 2020 15:12:50 GMT
        )

    [expires] => Array
        (
            [0] => -1
        )

    [cache-control] => Array
        (
            [0] => private, max-age=0
        )

    [content-type] => Array
        (
            [0] => text/html; charset=ISO-8859-1
        )

    [p3p] => Array
        (
            [0] => CP="This is not a P3P policy! See g.co/p3phelp for more info."
        )

    [server] => Array
        (
            [0] => gws
        )

    [x-xss-protection] => Array
        (
            [0] => 0
        )

    [x-frame-options] => Array
        (
            [0] => SAMEORIGIN
        )

    [set-cookie] => Array
        (
            [0] => 1P_JAR=2020-04-28-15; expires=Thu, 28-May-2020 15:12:50 GMT; path=/; domain=.google.com; Secure
            [1] => NID=203=ZC5X9W1OFIFk7p_y1HUQ1ZhluIAq1QMJcoiaWNvjtggga9w0By1ULn01BaSxfswmYixQ8arShOwTpHMWyDRXu6vy5xdS19FmFYLyUsdz0n5wOs9_dkb4xBPLOc4SRKdZN7QhcgS8sMVwugrM-CEyg2ENJq_t__UJlwM2cgOdyfg; expires=Wed, 28-Oct-2020 15:12:50 GMT; path=/; domain=.google.com; HttpOnly
        )

    [alt-svc] => Array
        (
            [0] => quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,h3-T050=":443"; ma=2592000
        )

    [accept-ranges] => Array
        (
            [0] => none
        )

    [vary] => Array
        (
            [0] => Accept-Encoding
        )

    [transfer-encoding] => Array
        (
            [0] => chunked
        )

)

❮ Tham khảo mạng PHP

Thí dụ

Trả về danh sách các tiêu đề phản hồi đã gửi

setcookie("TestCookie","SomeValue");
tiêu đề ("Kiểm tra mẫu X. foo");
header("Kiểu nội dung. văn bản/đồng bằng");
?>


var_dump(headers_list());
?>


Đầu ra của đoạn mã trên có thể là

mảng(4)
{
[0]=> chuỗi(23) "X-Powered-By. PHP/7. 1. 1"
[1]=> string(19) "Set-Cookie. TestCookie=SomeValue"
[2]=> string(18) "X-Sample-Test. foo"
[3]=> string(24) "Kiểu nội dung. văn bản/đồng bằng"
}


Định nghĩa và cách sử dụng

Hàm headers_list() trả về danh sách các tiêu đề phản hồi sẽ được gửi tới trình duyệt

Mẹo. Để xác định xem tiêu đề đã được gửi hay chưa, hãy sử dụng hàm headers_sent()

cú pháp



chi tiết kỹ thuật

Giá trị trả về. Một mảng các tiêu đề được lập chỉ mục bằng số trên Phiên bản PHP thành công. 5. 0+
❮ Tham khảo mạng PHP

Nhận các tiêu đề phản hồi HTTP bằng cURL trong PHP không đơn giản. Không có cách tích hợp nào để thực hiện việc này, nhưng chúng tôi vẫn có thể cắt bỏ các tiêu đề khỏi thông báo phản hồi, nếu CURLOPT_HEADER là đúng

47086 lượt xem

Làm cách nào để nhận tiêu đề phản hồi trong PHP?

Bởi. Jacob

Đã chỉnh sửa. 2021-04-12 11. 12

Làm cách nào để nhận tiêu đề phản hồi trong PHP?

Khi máy chủ nhận được một yêu cầu HTTP, thông thường, một phản hồi sẽ được gửi lại cho máy khách và phản hồi của máy chủ thường sẽ bao gồm hai phần;

Phần tiêu đề của phản hồi chứa tất cả các tiêu đề phản hồi, bao gồm cookie (nếu có) và thông tin về loại mime của nội dung. Nội dung phản hồi chứa nội dung, nội dung này phải khớp với loại của tôi trong tiêu đề. Ví dụ: các loại mime phổ biến có thể là văn bản/html cho trang HTML và văn bản/css cho Biểu định kiểu bên ngoài

Để hiển thị các tiêu đề phản hồi cho một yêu cầu nhất định, chúng ta chỉ cần cắt bỏ các tiêu đề bằng cách sử dụng kết hợp các tùy chọn và chức năng. Một lời giải thích chi tiết hơn về điều này có sẵn trong phần tiếp theo của bài viết, dành cho những người quan tâm

Một ví dụ đầy đủ nhanh chóng được bao gồm dưới đây

$url = "https://beamtic.com/api/user-agent";

$ch = curl_init();

  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_HEADER, 1);

  $response = curl_exec($ch);
  
  // Retudn headers seperatly from the Response Body
  $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
  $headers = substr($response, 0, $header_size);
  $body = substr($response, $header_size);
  
curl_close($ch);

header("Content-Type:text/plain; charset=UTF-8");
echo $headers;
echo $body;

Ở trên sẽ xuất ra một cái gì đó như

HTTP/1.1 200 OK
date: Sun, 21 Feb 2021 12:11:57 GMT
server: 0
cache-control: no-cache
expires: -1
allow: GET, HEAD
strict-transport-security: max-age=31536000; includeSubDomains
vary: Accept-Encoding
content-encoding: br
x-frame-options: SAMEORIGIN
content-length: 10252
content-type: text/html; charset=utf-8

Mã phản hồi luôn là dòng đầu tiên được trả về trong phần đầu phản hồi

Lấy tiêu đề làm khóa. cặp giá trị

Như đã thảo luận trong bài viết về phân tích cú pháp các tiêu đề phản hồi trong PHP, chúng ta cũng có thể tạo một mảng kết hợp chứa khóa. cặp giá trị. Vì chúng tôi đã có các tiêu đề, chúng tôi có thể làm như thế này

// Convert the $headers string to an indexed array
$headers_indexed_arr = explode("\r\n", $headers);

// Define as array before using in loop
$headers_arr = array();
// Remember the status message in a separate variable
$status_message = array_shift($headers_indexed_arr);

// Create an associative array containing the response headers
foreach ($headers_indexed_arr as $value) {
  if(false !== ($matches = explode(':', $value, 2))) {
    $headers_arr["{$matches[0]}"] = trim($matches[1]);
  }                
}

// Show that it works
header('content-type: text/plain; charset=utf-8');
print_r($headers_arr);exit();

Truy xuất các tiêu đề phản hồi

Không có cách tích hợp nào để chỉ trả về các tiêu đề phản hồi bằng cách sử dụng cURL trong PHP. Tuy nhiên, chúng ta vẫn có thể "cắt" chúng khỏi phản hồi đầy đủ. Để làm điều này, trước tiên chúng tôi xác định kích thước của tiêu đề phản hồi, sau đó chỉ cần cắt nó khỏi phản hồi bằng cách sử dụng hàm substr()

Trước tiên, chúng tôi đặt tùy chọn CURLOPT_HEADER là true. Làm điều này sẽ bao gồm các tiêu đề trong phản hồi được tải xuống bởi cURL. Tiếp theo, chúng ta sẽ cần cắt bỏ các tiêu đề

Sử dụng phương thức này, chúng ta có thể trả về cả phần thân và phần đầu của phản hồi. Tuy nhiên, trước khi tách các thành phần của phản hồi, chúng ta cần lấy kích thước của tiêu đề. Điều này có thể được thực hiện bằng cách sử dụng curl_getinfo() với tùy chọn CURLINFO_HEADER_SIZE, như hình bên dưới

$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);

Cuối cùng, chúng ta có thể sử dụng giá trị được trả về bởi curl_getinfo() với substr() để tách các tiêu đề khỏi thông báo phản hồi

$headers = substr($response, 0, $header_size);
$body = substr($response, $header_size);

Tạo một mảng chứa mỗi tiêu đề

Để làm việc tốt hơn với các tiêu đề riêng lẻ, chúng ta nên đặt chúng trong một mảng. Các tiêu đề HTTP được phân tách bằng Trả về vận chuyển và Nguồn cấp dữ liệu theo dòng, còn được gọi là CRLF (Đôi khi còn được biểu thị là. [CR][LF]). Khi biết được điều này, chúng ta có thể tạo một mảng từ các tiêu đề thô bằng cách sử dụng hàm phát nổ PHP()

$headers_arr = explode("\r\n", $headers); // The separator used in the Response Header is CRLF (Aka. \r\n)
print_r($headers_arr); // Shows the content of the $headers_arr array

Như bạn có thể thấy, chúng tôi cũng có một vài mục trống. Để loại bỏ chúng, chúng ta có thể truyền mảng cho hàm array_filter()

________số 8_______

Cuối cùng, chúng ta có thể dễ dàng làm việc trên mảng trong một vòng lặp

$html = '';
foreach ($headers as &$value) {
    $html .= '
  • ' . $value . '
  • '
    ; } $html = '
      ' . $html . '
    '
    ;

    hoàn thành ví dụ

    // URL to fetch
    $url = "https://beamtic.com/";
    
    $ch = curl_init();
    
      curl_setopt($ch, CURLOPT_URL, $url);
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
      curl_setopt($ch, CURLOPT_HEADER, 1);
    
      $response = curl_exec($ch);
      
      // Retudn headers seperatly from the Response Body
      $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
      $headers = substr($response, 0, $header_size);
      $body = substr($response, $header_size);
      
    curl_close($ch);
    
    $headers = explode("\r\n", $headers); // The seperator used in the Response Header is CRLF (Aka. \r\n) 
    
    $headers = array_filter($headers);
    
    $html = '';
    foreach ($headers as &$value) {
        $html .= '
  • ' . $value . '
  • '
    ; } $html = '
      ' . $html . '
    '
    ; header("Content-Type:text/html; charset=UTF-8"); echo $html;

    Công cụ

    • Tác nhân người dùng của bạn
    • Tiêu đề yêu cầu của bạn

    Bạn có thể sử dụng các điểm cuối API sau cho mục đích thử nghiệm

    https://beamtic.com/api/user-agent
    
    HTTP/1.1 200 OK
    date: Sun, 21 Feb 2021 12:11:57 GMT
    server: 0
    cache-control: no-cache
    expires: -1
    allow: GET, HEAD
    strict-transport-security: max-age=31536000; includeSubDomains
    vary: Accept-Encoding
    content-encoding: br
    x-frame-options: SAMEORIGIN
    content-length: 10252
    content-type: text/html; charset=utf-8
    
    0

    Chia sẻ với bạn bè của bạn

    Hãy cho chúng tôi biết bạn nghĩ gì
    Làm cách nào để nhận tiêu đề phản hồi trong PHP?
    Alonso Quinones

    Hướng dẫn tuyệt vời, cảm ơn
    Có lẽ bạn cũng có thể thêm cách chia kết quả thành các cặp khóa/giá trị - vì hiện tại mỗi đối tượng mảng là một chuỗi dài
    /Trân trọng, Alonso

    Làm cách nào để nhận tiêu đề phản hồi trong PHP?
    timilica

    Xin chào,
    Tôi gặp sự cố lớn với cURL khi cố vượt qua trang đăng nhập
    Tôi đã sử dụng tất cả các tùy chọn cURL cần thiết (CURLOPT_COOKIEJAR, CURLOPT_COOKIEFILE, CURLOPT_FOLLOWLOCATION) để cURL vượt qua trang đăng nhập nhưng không gặp may. Tôi đang cố vượt qua thông tin đăng nhập trên http. // ứng dụng. thuật đối chiếu. ro và nhận một số bản ghi trên một trang khác. Trang đăng nhập có chuyển hướng

    Tôi tạo một yêu cầu POST trên trang đăng nhập và tôi lưu cookie trong cookie. txt với CURLOPT_COOKIEJAR và CURLOPT_COOKIEFILE. Tôi thấy rằng sau yêu cầu POST, một yêu cầu GET khác được bắt đầu trong quá trình đăng nhập. Tôi đã thử mọi thứ tôi đọc nhưng tất cả những gì tôi có thể thấy từ cURL là trang đăng nhập với tên người dùng/mật khẩu trống (không đăng nhập) ngay cả khi phản hồi là 200 OK

    Bạn có thể xin vui lòng cho tôi một lời khuyên?

    Trân trọng

    Làm cách nào để nhận tiêu đề phản hồi trong PHP?
    Lawrence Kennon

    Đây là một bài viết hữu ích. Tôi đã đóng gói rất nhiều mã này vào một chức năng mà tôi đang sử dụng trong nhiều tập lệnh dòng lệnh trên Mac cho một số mục đích tại nơi làm việc. Thanks

    Làm cách nào để kiểm tra tiêu đề từ phản hồi trong PHP?

    Điều này có thể được thực hiện với tham số CURLINFO_HEADER_SIZE trong hàm curl_getinfo() , hàm này sẽ cho chúng tôi biết độ dài của tiêu đề và chúng tôi có thể .

    Làm cách nào để lấy tiêu đề trong PHP?

    Hàm get_headers() trong PHP được sử dụng để tìm nạp tất cả các tiêu đề do máy chủ gửi theo phản hồi của một yêu cầu HTTP. .
    $url. Nó là tham số bắt buộc của kiểu string. .
    định dạng $. Nó là một tham số tùy chọn kiểu int

    Làm cách nào để đặt tiêu đề phản hồi trong PHP?

    Dành cho phiên bản PHP 4. 0. Để gửi mã phản hồi HTTP, chúng tôi cần tập hợp mã phản hồi. Để đạt được điều này, hãy sử dụng hàm header() . Hàm header() chứa trường hợp sử dụng đặc biệt có thể phát hiện dòng phản hồi HTTP và thay thế bằng dòng tùy chỉnh. tiêu đề ("HTTP/1. 1 404 Không tìm thấy" );

    Tiêu đề phản hồi HTTP trong PHP là gì?

    Giải thích bằng cú pháp. Tiêu đề trong PHP là hàm PHP tích hợp để gửi tiêu đề HTTP thô . Các chức năng HTTP là những chức năng thao tác thông tin do máy chủ web gửi đến máy khách hoặc trình duyệt trước khi nó gửi thêm bất kỳ đầu ra nào. Hàm header() trong PHP gửi tiêu đề HTTP thô tới máy khách hoặc trình duyệt.