400 Yêu cầu Không hợp lệ - Giải nén

Bạn đang xem tài liệu về Apigee Edge.
Chuyển đến Tài liệu về Apigee X.
thông tin

Triệu chứng

Ứng dụng khách sẽ nhận được mã trạng thái HTTP 400 Bad Request kèm theo mã lỗi messaging.adaptors.http.flow.DecompressionFailureAtRequest làm phản hồi cho API cuộc gọi.

Thông báo lỗi

Ứng dụng sẽ nhận được mã phản hồi sau đây:

HTTP/1.1 400 Bad Request

Ngoài ra, bạn có thể thấy một thông báo lỗi tương tự như thông báo dưới đây:

{
   "fault":{
      "faultstring":"Decompression failure at request",
      "detail":{
         "errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtRequest"
      }
   }
}

Các nguyên nhân có thể

Lỗi này chỉ xảy ra nếu:

  • Phương thức mã hoá được chỉ định trong tiêu đề yêu cầu HTTP Content-Encoding là hợp lệ và được hỗ trợ bởi Apigee Edge,
  • NHƯNG

  • Định dạng tải trọng do ứng dụng gửi như một phần của yêu cầu HTTP không khớp với định dạng mã hoá được chỉ định trong tiêu đề Content-Encoding

Điều này là do Apigee Edge không thể giải mã tải trọng bằng phương thức mã hoá đã chỉ định kể từ khi định dạng của tải trọng không cùng định dạng với định dạng mã hoá được chỉ định trong Tiêu đề Content-Encoding.

Dưới đây là một vài ví dụ về các giá trị Content-Encoding được hỗ trợ và cách Apigee Edge mong đợi định dạng tải trọng nằm trong các trường hợp đó:

Trường hợp Content-Encoding Định dạng tải trọng dự kiến
Mã hoá đơn gzip

Định dạng gzip của Unix.

Xem Định dạng GZIP RFC1952.

Mã hoá đơn giảm

Định dạng này sử dụng cấu trúc zlib với thuật toán nén giảm bớt.

Xem RFC1950 RFC1951.

Nhiều mã hoá

Nhiều mã hoá

Ví dụ: trong trường hợp quá trình mã hoá được thực hiện hai lần, thì có thể:

  • gzip, deflate
  • gzip, gzip
  • giảm, gzip
  • giảm, giảm
Nhiều phương thức mã hoá được áp dụng cho tải trọng theo thứ tự nhất định khi xuất hiện trong tiêu đề.

Sau đây là các nguyên nhân có thể gây ra lỗi này:

Nguyên nhân Mô tả Hướng dẫn khắc phục sự cố áp dụng cho
Định dạng tải trọng yêu cầu không khớp với phương thức mã hoá được chỉ định trong tiêu đề Content-Encoding Định dạng của tải trọng yêu cầu do ứng dụng gửi không được mã hoá hoặc không khớp với phương thức mã hoá được chỉ định trong tiêu đề Content-Encoding. Người dùng Edge công khai và riêng tư

Các bước chẩn đoán phổ biến

Hãy sử dụng một trong các công cụ/kỹ thuật sau để chẩn đoán lỗi này:

Giám sát API

Cách chẩn đoán lỗi bằng tính năng Giám sát API:

  1. Đăng nhập vào giao diện người dùng Apigee Edge với tư cách là người dùng có vai trò thích hợp.
  2. Chuyển sang tổ chức mà bạn muốn điều tra vấn đề này.

  3. Chuyển đến thẻ Analyze (Phân tích) > Giám sát API > Điều tra.
  4. Chọn khung thời gian cụ thể mà bạn phát hiện thấy lỗi.
  5. Đảm bảo rằng bộ lọc Proxy được đặt thành Tất cả.
  6. Vẽ Mã lỗi theo Thời gian.
  7. Chọn một ô có mã lỗi messaging.adaptors.http.flow.DecompressionFailureAtRequest là được hiển thị bên dưới:

    ( xem hình ảnh lớn hơn)

  8. Thông tin về mã lỗi messaging.adaptors.http.flow.DecompressionFailureAtRequest được hiển thị như minh hoạ dưới đây:

    ( xem hình ảnh lớn hơn)

  9. Nhấp vào Xem nhật ký rồi mở rộng hàng không thành công do lỗi 400.

    ( xem hình ảnh lớn hơn)

  10. Từ cửa sổ Logs (Nhật ký), hãy lưu ý những thông tin chi tiết sau:
    • Mã trạng thái: 400
    • Nguồn lỗi: proxy
    • Mã lỗi: messaging.adaptors.http.flow.DecompressionFailureAtRequest.
  11. Nếu Nguồn lỗi có giá trị proxy, thì điều đó cho biết rằng định dạng tải trọng yêu cầu không khớp với mã hoá được hỗ trợ đã chỉ định trong tiêu đề Content-Encoding.

Công cụ theo dõi

Cách chẩn đoán lỗi bằng công cụ Theo dõi:

  1. Bật phiên theo dõi và:
    1. Chờ lỗi 400 Bad Request xảy ra, hoặc
    2. Nếu bạn có thể tái hiện vấn đề, hãy thực hiện lệnh gọi API và tái tạo 400 Bad Request.
  2. Đảm bảo bạn đã bật chế độ Show all FlowInfos (Hiện tất cả FlowInfos):

  3. Chọn một trong các yêu cầu không thành công rồi kiểm tra dấu vết.
  4. Di chuyển qua các giai đoạn của quá trình theo dõi và xác định vị trí lỗi đã xảy ra.
  5. Thông thường, bạn sẽ thấy lỗi trong luồng ngay sau Giai đoạn Đã nhận yêu cầu từ khách hàng như sau:

    ( xem hình ảnh lớn hơn)

  6. Lưu ý các giá trị của các thuộc tính trong dấu vết:

    • lỗi: Decompression failure at request
    • error.class: com.apigee.rest.framework.BadRequestException
    • error.cause: Not in GZIP format

    Lỗi error.cause cho biết rằng tải trọng yêu cầu KHÔNG ở định dạng GZIP. Điều này có nghĩa là Apigee Edge dự kiến tải trọng yêu cầu sẽ ở định dạng GZIP như đã được chỉ định trong tiêu đề Content-Encoding.

  7. Xác định giá trị của tiêu đề yêu cầu Content-Encoding. Để làm được việc này, hãy chuyển đến giai đoạn Đã nhận được yêu cầu từ ứng dụng như minh hoạ dưới đây:

    ( xem hình ảnh lớn hơn)

    Lưu ý rằng giá trị của tiêu đề yêu cầu Content-Encoding thực sự gzip.

    Dấu vết mẫu ở trên cho thấy phương thức mã hoá được chỉ định trong tiêu đề của yêu cầu Content-Encodinggzip; tuy nhiên, tải trọng yêu cầu không ở định dạng GZIP. Do đó, Apigee không thể giải nén tải trọng bằng cách sử dụng gzip và trả về lỗi Decompression failure at request.

  8. Ghi lại mã trạng thái và thông báo lỗi mà Apigee Edge trả về bằng cách đi theo chỉ dẫn

    đến giai đoạn Phản hồi đã gửi cho khách hàng trong dấu vết như sau:

    ( xem hình ảnh lớn hơn)

    Hãy ghi lại các chi tiết sau đây trong dấu vết:

    • Mã trạng thái: 400 Bad Request.
    • Nội dung lỗi: {"fault":{"faultstring":"Decompression failure at request","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtRequest"}}}
  9. Chuyển đến giai đoạn AX (Đã ghi dữ liệu Analytics) trong dấu vết và nhấp vào đó.

  10. Cuộn xuống phần Chi tiết giai đoạn, Tiêu đề lỗi và xác định giá trị của X-Apigee-fault-codeX-Apigee-fault-source như minh hoạ dưới đây:

    ( xem hình ảnh lớn hơn)

  11. Bạn sẽ thấy các giá trị của X-Apigee-fault-codeX-Apigee-fault-source dưới tên messaging.adaptors.http.flow.DecompressionFailureAtRequestpolicy, cho biết rằng định dạng tải trọng yêu cầu không khớp với mã hoá được chỉ định trong tiêu đề Content-Encoding.
    Tiêu đề phản hồi Giá trị
    X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequest
    X-Apigee-fault-source policy

NGINX

Cách chẩn đoán lỗi bằng nhật ký truy cập NGINX:

  1. Nếu là người dùng Đám mây riêng tư, bạn có thể sử dụng nhật ký truy cập NGINX để xác định thông tin chính về lỗi HTTP 400.
  2. Kiểm tra nhật ký truy cập NGINX:

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    Trong đó: ORG, ENVPORT# được thay thế bằng các giá trị thực tế.

  3. Tìm kiếm để xem có lỗi 400 nào trong một khoảng thời gian cụ thể hay không (nếu sự cố đã xảy ra trong quá khứ) hoặc nếu có bất kỳ yêu cầu nào vẫn không thành công với 400.
  4. Nếu bạn tìm thấy bất kỳ lỗi 400 nào với X-Apigee-fault-code khớp với giá trị của messaging.adaptors.http.flow.DecompressionFailureAtRequest, sau đó xác định giá trị của X-Apigee-fault-source..

    Lỗi 400 mẫu trong nhật ký truy cập NGINX:

    Mục nhập mẫu ở trên từ nhật ký truy cập NGINX có các giá trị sau cho X-Apigee-fault-code X-Apigee-fault-code

    Tiêu đề phản hồi Giá trị
    X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequest
    X-Apigee-fault-source policy

Nguyên nhân: Định dạng tải trọng yêu cầu không khớp với mã hoá được chỉ định trong tiêu đề Content-Encoding

Theo mặc định, Apigee Edge luôn giải nén tải trọng nếu tiêu đề yêu cầu Content-Encoding chứa dữ liệu hợp lệ và mã hoá được hỗ trợ. Do đó, dự kiến rằng định dạng của tải trọng yêu cầu phải khớp với phương thức mã hoá được chỉ định trong tiêu đề yêu cầu Content-Encoding. Nếu thông tin không khớp, bạn sẽ gặp lỗi này.

Chẩn đoán

  1. Xác định Mã lỗiNguồn lỗi cho lỗi phát hiện được bằng API Công cụ giám sát, công cụ theo dõi hoặc nhật ký truy cập NGINX như giải thích trong Các bước chẩn đoán thường gặp.
  2. Nếu Mã lỗimessaging.adaptors.http.flow.DecompressionFailureAtRequestNguồn lỗi có giá trị policy hoặc proxy, sau đó cho biết yêu cầu do ứng dụng khách gửi có tải trọng không khớp với mã hoá được hỗ trợ được chỉ định trong tiêu đề của yêu cầu Content-Encoding.
  3. Bạn có thể xác định trường hợp không khớp là một phần của yêu cầu HTTP bằng một trong các cách sau phương thức:

    Thông báo lỗi

    Cách xác thực bằng thông báo lỗi:

    1. Nếu bạn có quyền xem thông báo lỗi hoàn chỉnh nhận được từ Apigee Edge, thì tham khảo faultstring.

      Thông báo lỗi mẫu:

      "faultstring":"Decompression failure at request"
      
    2. Trong thông báo lỗi ở trên, thông báo lỗi này hiển thị "Decompression failure at request" ngụ ý rằng yêu cầu không thể giải nén bằng mã hoá được chỉ định trong Tiêu đề Content-Encoding.

    Trace

    Cách xác thực bằng tính năng Theo dõi:

    1. Xác định giá trị của tiêu đề yêu cầu Content-Encoding và thuộc tính error.cause bằng cách sử dụng Trace như giải thích trong Các bước chẩn đoán phổ biến.
    2. Sau đây là các giá trị trong dấu vết mẫu:

      • Mã hoá nội dung: gzip
      • error.cause: Not in GZIP format

      Giá trị trong tiêu đề yêu cầu Content-Encodinggzip; tuy nhiên, tải trọng yêu cầu không ở định dạng GZIP (như được biểu thị bằng error.cause). Do đó, Apigee Edge sẽ phản hồi bằng 400 Bad Request và mã lỗi messaging.adaptors.http.flow.DecompressionFailureAtRequest.

    Yêu cầu thực tế

    Cách xác thực bằng yêu cầu thực tế:

    Nếu bạn có quyền truy cập vào yêu cầu thực tế mà khách hàng đưa ra ứng dụng, sau đó thực hiện các bước sau:

    1. Xác định giá trị được truyền đến tiêu đề của yêu cầu Content-Encoding.
    2. Xác định định dạng của tải trọng được gửi trong yêu cầu.
    3. Nếu giá trị của tiêu đề Content-Encoding nằm trong danh sách các phương thức mã hoá được hỗ trợ nhưng định dạng của tải trọng yêu cầu không khớp với phương thức mã hoá được chỉ định trong tiêu đề Content-Encoding, thì đó là nguyên nhân của vấn đề.

      Yêu cầu mẫu:

      curl -v "http://HOSTALIAS/v1/testgzip" -H "Content-Encoding: gzip" -X POST -d @request_payload.zip
      

      Yêu cầu mẫu ở trên gửi giá trị gzip đến Tiêu đề Content-Encoding là một hỗ trợ mã hoá trong Apigee Edge. Tuy nhiên, tải trọng yêu cầu request_payload.zip ở định dạng ZIP. Do đó, yêu cầu này không thành công với mã trạng thái 400 Bad Request và mã lỗi: messaging.adaptors.http.flow.DecompressionFailureAtRequest.

    Nhật ký Trình xử lý thư

    Để xác thực bằng nhật ký Trình xử lý thư:

    Nếu là người dùng Đám mây riêng tư, bạn có thể sử dụng nhật ký Trình xử lý thư để xác định thông tin chính về lỗi HTTP 400.

    1. Xác định mã nhận dạng thông báo của yêu cầu không thành công bằng cách sử dụng API Giám sát, công cụ Theo dõi, hoặc nhật ký truy cập NGINX như giải thích trong Các bước chẩn đoán phổ biến.
    2. Tìm mã nhận dạng thư trong nhật ký Trình xử lý thư:

      /opt/apigee/var/log/edge-message-processor/logs/system.log

    3. Bạn sẽ thấy một trong các trường hợp ngoại lệ sau:

      Tình huống #1

      Tình huống 1: Khi yêu cầu API có tiêu đề Content-Encoding: gzip

      2021-07-28 10:21:16,861  NIOThread@0 ERROR HTTP.SERVER -
      HTTPServer$Context.onInputException() : Message id:rt-57-1
      SSLClientChannel[Accepted: Remote:192.168.199.8:8443
      Local:192.168.80.234:44284]@28469 useCount=1 bytesRead=0
      bytesWritten=28764 age=2739893ms  lastIO=0ms
      isOpen=true.onExceptionRead exception: {}
      java.util.zip.ZipException: Not in GZIP format
      
      2021-07-28 10:21:16,862  NIOThread@0 ERROR ADAPTORS.HTTP.FLOW -
      AbstractRequestListener.onException() : Request:POST, uri:/test,
      message Id:rt-57-1, exception:java.util.zip.ZipException: Not in GZIP format,
      context:Context@71ea5ac input=ClientInputChannel(SSLClientChannel[Accepted:
      Remote:192.168.199.8:8443 Local:192.168.80.234:44284]@28469 useCount=1
      bytesRead=0 bytesWritten=28764 age=2739894ms  lastIO=0ms  isOpen=true)
      2021-07-28 10:21:16,862  NIOThread@0 INFO  HTTP.SERVICE -
      ExceptionHandler.handleException() :
      Exception java.util.zip.ZipException: Not in GZIP format occurred while writing
      to channel null
      2021-07-28 10:21:16,863  NIOThread@0 INFO  HTTP.SERVICE -
      ExceptionHandler.handleException() : Exception trace:
      java.util.zip.ZipException: Not in GZIP format
      

      Dòng java.util.zip.ZipException: Not in GZIP format trong thông báo lỗi ở trên cho biết yêu cầu tải trọng không được gửi ở định dạng GZIP mặc dù Content-Encoding được chỉ định là gzip. Do đó, Apigee Edge sẽ đưa ra trường hợp ngoại lệ và trả về mã trạng thái 400 có mã lỗi messaging.adaptors.http.flow.DecompressionFailureAtRequest cho ứng dụng khách.

      Tình huống #2

      Tình huống 2: Khi yêu cầu API có tiêu đề Content-Encoding: deflate

      2021-07-28 15:26:31,893  NIOThread@1 ERROR HTTP.SERVER -
      HTTPServer$Context.onInputException() : Message id:rt-47875-1
      SSLClientChannel[Accepted: Remote:192.168.199.8:8443
      Local:192.168.81.72:45954]@29276 useCount=1 bytesRead=0
      bytesWritten=37230 age=3498856ms  lastIO=1ms
      isOpen=true.onExceptionRead exception: {}
      java.util.zip.ZipException: incorrect header check
                        ….
      Caused by: java.util.zip.DataFormatException: incorrect header check
             ..
      2021-07-28 15:26:31,894  NIOThread@1 ERROR ADAPTORS.HTTP.FLOW -
      AbstractRequestListener.onException() : Request:POST, uri:/test,
      message Id:rrt-47875-1, exception:java.util.zip.ZipException:
      incorrect header check, context:Context@69b3ac45
      input=ClientInputChannel(SSLClientChannel[Accepted:
      Remote:192.168.199.8:8443 Local:192.168.81.72:45954]@29276
      useCount=1 byt	esRead=0 bytesWritten=37230 age=3498856ms
      lastIO=1ms  isOpen=true)
      

      Đường kẻ java.util.zip.ZipException: incorrect header checkCaused by: java.util.zip.DataFormatException: incorrect header check trong thông báo lỗi ở trên, cho biết rằng tải trọng yêu cầu không được gửi trong và không phù hợp với mã hoá được chỉ định trong Tiêu đề Content-Encoding giảm bớt. Do đó, Apigee Edge gửi ngoại lệ và trả về mã trạng thái 400 có mã lỗi messaging.adaptors.http.flow.DecompressionFailureAtRequest cho ứng dụng khách.

Độ phân giải

  1. Trường hợp không cần tải tải yêu cầu đã nén vào quy trình proxy API trong Apigee Edge và trong máy chủ phụ trợ, thì không truyền tiêu đề Content-Encoding. Nếu cần nén tải trọng yêu cầu, hãy chuyển sang bước 2.
  2. Hãy đảm bảo rằng ứng dụng luôn gửi các thông tin sau:
    • Bất kỳ mã hoá được hỗ trợ làm giá trị cho tiêu đề Content-Encoding trong yêu cầu
    • Tải trọng yêu cầu ở định dạng được hỗ trợ cho Apigee Edge khớp với phương thức mã hoá định dạng được chỉ định trong tiêu đề Content-Encoding
  3. Trong ví dụ được thảo luận ở trên, tải trọng yêu cầu ở định dạng ZIP nhưng tiêu đề yêu cầu chỉ định Content-Encoding: gzip. Bạn có thể khắc phục vấn đề bằng cách gửi yêu cầu tiêu đề dưới dạng Content-Encoding: gzip và tải trọng yêu cầu cũng nằm trong gzip định dạng:
    curl -v "https://HOSTALIAS/v1/testgzip" -H "Content-Encoding: gzip" -X POST -d @request_payload.gz
    

Thông số kỹ thuật

Apigee Edge phản hồi bằng mã trạng thái 400 Bad Request kèm theo mã lỗi messaging.adaptors.http.flow.DecompressionFailureAtRequest theo RFC sau đây thông số kỹ thuật:

Thông số kỹ thuật
RFC 7231, mục 6.5.1
RFC 7231, mục 3.1.2.2

Nếu bạn vẫn cần hỗ trợ từ Nhóm hỗ trợ Apigee, hãy truy cập vào Phải thu thập thông tin chẩn đoán.

Phải thu thập thông tin chẩn đoán

Thu thập những thông tin chẩn đoán sau đây rồi liên hệ với Bộ phận hỗ trợ Apigee Edge:

Nếu bạn là người dùng Cloud Public, hãy cung cấp những thông tin sau:

  • Tên tổ chức
  • Tên môi trường
  • Tên proxy API
  • Hoàn tất lệnh curl dùng để tái hiện lỗi 400
  • Tệp theo dõi cho các yêu cầu API

Nếu bạn là người dùng Đám mây riêng tư, hãy cung cấp các thông tin sau:

  • Đã nhận thấy thông báo lỗi hoàn chỉnh đối với các yêu cầu không thực hiện được
  • Tên môi trường
  • Gói Proxy API
  • Tệp theo dõi cho các yêu cầu API
  • Nhật ký truy cập NGINX /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    Vị trí: ORG, ENVPORT# được thay thế bằng giá trị thực tế.

  • Nhật ký hệ thống của Trình xử lý thư /opt/apigee/var/log/edge-message-processor/logs/system.log