Nội dung

    Phản hồi máy chủ 416 Range Not Satisfiable

    HTTP Trạng thái 416 (Range Not Satisfiable)

    HTTP trạng thái 416 là phản hồi từ máy chủ cho biết rằng dải dữ liệu được yêu cầu không thể được thỏa mãn. Điều này xảy ra khi khách hàng yêu cầu một phần của tài nguyên, nhưng dải được chỉ định vượt quá dữ liệu có sẵn. Trong bài viết này, chúng ta sẽ xem xét các nguyên nhân gây ra mã trạng thái này, các ví dụ thực tiễn, cũng như cách khắc phục lỗi trên nhiều ngôn ngữ lập trình khác nhau.

    416 - Range Not Satisfiable

    Nguyên nhân phát sinh mã trạng thái 416

    • Dải không chính xác

      Khách hàng có thể mắc lỗi khi chỉ định dải (ví dụ: yêu cầu dải vượt quá kích thước của tệp).

    • Thiếu dữ liệu trên máy chủ

      Các tình huống khi tài nguyên đã bị xóa hoặc thay đổi, và dải được yêu cầu lớn hơn dữ liệu có sẵn.

    • Tiêu đề không chính xác

      Cách mà tiêu đề Range được cấu hình sai có thể dẫn đến lỗi.

    Ví dụ thực tiễn

    1. Ví dụ với tệp âm thanh

      Khách hàng yêu cầu một dải vượt quá độ dài của tệp âm thanh. Dưới đây là cách mà yêu cầu và phản hồi của máy chủ sẽ trông như thế nào:

      GET /audio.mp3 HTTP/1.1
      Range: bytes=1000000-

      Phản hồi từ máy chủ sẽ là:

      HTTP/1.1 416 Range Not Satisfiable
    2. Ví dụ với hình ảnh

      Yêu cầu nhận một phần của hình ảnh đã bị thay đổi, và khách hàng không biết về kích thước mới:

      GET /image.jpg HTTP/1.1
      Range: bytes=500-1000
    3. Ví dụ với tệp văn bản

      Yêu cầu tới một tệp văn bản với dải vượt quá kích thước của tệp:

      GET /text.txt HTTP/1.1
      Range: bytes=200-300

    Khắc phục lỗi 416 trên các ngôn ngữ lập trình khác nhau

    • Python (sử dụng thư viện requests)

      Ví dụ mã để kiểm tra dải hợp lệ trước khi gửi yêu cầu:

      import requests
      
      url = "http://example.com/file"
      headers = {"Range": "bytes=1000-2000"}
      response = requests.get(url, headers=headers)
      
      if response.status_code == 416:
          print("Dải không thể thỏa mãn.")
    • JavaScript (sử dụng Fetch API)

      Ví dụ mã cho thấy cách yêu cầu dải và xử lý phản hồi 416:

      fetch("http://example.com/file", {
          headers: {
              "Range": "bytes=1000-2000"
          }
      })
      .then(response => {
          if (response.status === 416) {
              console.log("Dải không thể thỏa mãn.");
          }
      });
    • PHP (sử dụng cURL)

      Ví dụ mã để thực hiện yêu cầu với tiêu đề Range và xử lý trạng thái 416:

      $ch = curl_init();
      curl_setopt($ch, CURLOPT_URL, "http://example.com/file");
      curl_setopt($ch, CURLOPT_HTTPHEADER, array("Range: bytes=1000-2000"));
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
      $response = curl_exec($ch);
      
      if (curl_getinfo($ch, CURLINFO_HTTP_CODE) == 416) {
          echo "Dải không thể thỏa mãn.";
      }
      curl_close($ch);

    Bảng tóm tắt nguyên nhân và giải pháp

    Nguyên nhân Giải pháp
    Dải không chính xác Xác nhận kích thước tệp trước khi gửi yêu cầu.
    Thiếu dữ liệu trên máy chủ Kiểm tra xem tệp có tồn tại và chưa bị xóa hay không.
    Tiêu đề không chính xác Kiểm tra và định cấu hình tiêu đề Range đúng cách.

    Mã trạng thái 416 cho thấy có vấn đề với tính khả dụng của dải dữ liệu được yêu cầu. Để tránh trạng thái này, rất quan trọng để chỉ định các dải chính xác và xử lý các lỗi có thể xảy ra ở phía khách hàng.