File_get_contents cong đầu vào php

Đôi khi tôi buộc phải thiết kế theo hướng tạo một Dịch vụ web trung gian (A) giữa Máy khách và một Dịch vụ web khác (gọi là B)

File_get_contents cong đầu vào php
File_get_contents cong đầu vào php
Hướng chuyển tiếp yêu cầu HTTP tới một Dịch vụ Web khác

Lý do tôi phải sử dụng hướng thiết kế này thì có nhiều, tuy nhiên thường gặp nhất là những vấn đề sau

  • Web Service B của các bên khác thường xuyên thay đổi API, trong khi công việc cập nhật phần mềm ở máy khách (ví dụ: thiết bị IoT đã ra thị trường) mất nhiều thời gian
  • Dịch vụ web B xử lý dữ liệu nghiêm trọng nên cần một Dịch vụ web để lưu trữ dữ liệu vào bộ đệm để tăng tốc độ truy xuất
  • Dịch vụ web B của bên khác không hỗ trợ CORS (Chia sẻ tài nguyên nguồn gốc chéo), trình duyệt sẽ chặn nếu sử dụng JavaScript gọi trực tiếp Dịch vụ web này
  • Dịch vụ web B chặn khách hàng theo địa phương, Dịch vụ web A được cài đặt trên máy chủ bên ngoài địa phương đó để chuyển tiếp dữ liệu
  • Dịch vụ web B được sử dụng nội bộ, tuy nhiên một phần dữ liệu lại cần xuất bản bên ngoài nhưng không cho phép truy cập trực tiếp B

Cách thiết kế này được gọi là “proxy”, ưu điểm là mềm dẻo và giải quyết triệt để các vấn đề trên. Tuy nhiên cũng có nhược điểm

  • khoảng trống làm phải thực hiện 2 lần yêu cầu. Máy khách ⇌ Dịch vụ web A ⇌ Dịch vụ web B. Xử lý dữ liệu trên Dịch vụ web A nếu có thì phải thật đơn giản
  • Nếu Dịch vụ web B có giới hạn tốc độ theo địa chỉ IP thì sẽ làm giới hạn quy định sử dụng của Dịch vụ web A

Sau đây là một ví dụ đơn giản. Dịch vụ web A chuyển tiếp tiêu đề & dữ liệu từ Máy khách đến Dịch vụ web B, sau đó trả về các tiêu đề và dữ liệu phản hồi của Máy khách từ Dịch vụ web B

người giao nhận. php

 $value) {
    $req_hdr[] = "$name: $value"; 
}

$curl = curl_init();
curl_setopt_array($curl, array(
    CURLOPT_URL => $url,
    // Keep the request method
    CURLOPT_CUSTOMREQUEST => $_SERVER['REQUEST_METHOD'],
    // Forward necessary headers from the Client. Content-Type is mandatory.
    CURLOPT_HTTPHEADER => $req_hdr,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_SSL_VERIFYPEER => true,
    CURLOPT_FAILONERROR => true
) );

// Forward the POST data from the Client to Web Service B
if ( 'POST' === $_SERVER['REQUEST_METHOD'] ) :
    $body = file_get_contents("php://input");
    curl_setopt($curl, CURLOPT_POSTFIELDS, $body);
endif;

// Gather all response headers from Web Service B.
$response_headers = array();
curl_setopt( $curl, CURLOPT_HEADERFUNCTION,
    function( $curl, $header ) use(&$res_hdr) {
        $h = explode( ": ", $header );
        $res_hdr[$h[0]] = $h[1];
        return strlen( $header );
    }
);

// Call the target URL
$response  = curl_exec($ch);
$error_no  = curl_errno($ch);
$error_msg = curl_error($ch);
$info      = curl_getinfo($curl);
curl_close($ch);

if ( $response === false ) {
    http_response_code($info['http_code']);
    die( "Error {$error_no}: {$error_msg}" );
} else {
    // Forward some response headers from Server B to the client
    foreach ( array(
          'Content-Type',
          'Content-Transfer-Encoding',
          'Content-Disposition',
          'Accept-Ranges',
          /* ...other headers if any.. */
        ) as $header )
        if ( isset($res_hdr[$header]) )
            header( "{$header}: {$res_hdr[$header]}" );

    echo $response;
}
?>

Configure .htaccess to have a nice URL

htaccess


RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^wsb/([a-zA-Z0-9-\._\/]+)/?$ forwarder.php?wsb_uri=https://web-service-b/$1 [NC,L,QSA]

Và ta có thể sử dụng API REST của Dịch vụ B từ JavaScript trung gian qua Dịch vụ web A qua URL, ví dụ

PHP là ngôn ngữ kịch bản máy chủ và là công cụ mạnh mẽ để tạo các trang Web động và tương tác

PHP là một giải pháp thay thế được sử dụng rộng rãi, miễn phí và hiệu quả cho các đối thủ cạnh tranh như ASP của Microsoft

Bắt đầu học PHP ngay bây giờ »

Học dễ dàng với "PHP Tryit"

Với trình chỉnh sửa "PHP Tryit" trực tuyến của chúng tôi, bạn có thể chỉnh sửa mã PHP và nhấp vào nút để xem kết quả

Ví dụ



echo "Tập lệnh PHP đầu tiên của tôi. ";
?>


Tự mình thử »

Nhấp vào nút "Tự dùng thử" để xem nó hoạt động như thế nào


Bài tập PHP

Kiểm tra bản thân với các bài tập

Tập thể dục

Chèn phần còn thiếu của mã bên dưới để xuất "Xin chào thế giới"


Cung cấp câu trả lời "



Ví dụ PHP

Tìm hiểu bằng các ví dụ. Hướng dẫn này bổ sung tất cả các giải thích với các ví dụ rõ ràng

Xem tất cả các ví dụ về PHP


Bài kiểm tra PHP

Học bằng cách làm bài kiểm tra. Bài kiểm tra này sẽ cung cấp cho bạn tín hiệu về mức độ bạn biết hoặc không biết về PHP

Bắt đầu bài kiểm tra PHP


Việc học của tôi

Theo dõi tiến trình của bạn với chương trình "Học tập của tôi" miễn phí tại W3Schools

Đăng nhập vào tài khoản của bạn và bắt đầu kiếm điểm

Đây là một tính năng tùy chọn. Bạn có thể học W3Schools mà không cần sử dụng My Learning

File_get_contents cong đầu vào php


Tài liệu tham khảo PHP

Tài liệu tham khảo PHP của W3Schools chứa các danh mục khác nhau của tất cả các hàm, từ khóa và hằng số PHP, cùng với các ví dụ