Lỗi máy chủ nội bộ 500 - BadFormData

Bạn đang xem tài liệu về Apigee Edge.
Truy cập vào tài liệu Apigee X.
thông tin

Dấu hiệu

Ứng dụng khách nhận được mã trạng thái HTTP 500 Internal Server Error với mã lỗi protocol.http.BadFormData làm phản hồi cho các lệnh gọi API.

Thông báo lỗi

Ứng dụng khách nhận được mã phản hồi sau:

HTTP/1.1 500 Internal Server Error

Ngoài ra, bạn có thể thấy thông báo lỗi sau:

{
   "fault":{
      "faultstring":"Bad Form Data",
      "detail":{
         "errorcode":"protocol.http.BadFormData"
      }
   }
}

Dữ liệu biểu mẫu

Trước khi đi vào chi tiết về cách khắc phục vấn đề này, hãy tìm hiểu xem dữ liệu biểu mẫu là gì.

Dữ liệu biểu mẫu là thông tin do người dùng cung cấp, thường thông qua một biểu mẫu HTML có các phần tử như ô nhập dữ liệu, nút hoặc hộp kiểm. Dữ liệu biểu mẫu thường được gửi dưới dạng một loạt các cặp khoá-giá trị trong yêu cầu hoặc phản hồi HTTP.

Truyền dữ liệu biểu mẫu

  1. Content-Type: application/x-www-form-urlencoded
    • Nếu kích thước của dữ liệu biểu mẫu nhỏ, thì dữ liệu sẽ được gửi dưới dạng các cặp khoá-giá trị với:
      • Các ký tự trong cả hai khoá được mã hoá theo các quy tắc được giải thích trong Biểu mẫu – Phần 17.13.4.1
      • Tiêu đề Content-Type: application/x-www-form-urlencoded

      Yêu cầu mẫu có dữ liệu biểu mẫu:

      curl https://HOSTALIAS/somepath -H "Content-Type: application/x-www-form-urlencoded" -d "username=abc@google.com&pasword=secret123"
      
    • Mọi ký tự không phải chữ và số trong cả khoá và giá trị đều được mã hoá phần trăm, tức là chúng được biểu thị dưới dạng một bộ ba ký tự %HH, bao gồm một dấu phần trăm theo sau là hai chữ số thập lục phân biểu thị mã ASCII của ký tự cụ thể.
    • Do đó, mặc dù dấu phần trăm (%) được phép xuất hiện trong dữ liệu biểu mẫu, nhưng dấu này được diễn giải là điểm bắt đầu của một chuỗi thoát đặc biệt. Do đó, nếu dữ liệu biểu mẫu cần chứa dấu phần trăm (%) trong khoá hoặc giá trị, thì dữ liệu đó phải được truyền dưới dạng %25, . Đây là mã ASCII cho ký tự dấu phần trăm (%).
  2. Content-Type: multipart/form-data

    Nếu muốn truyền một lượng lớn dữ liệu nhị phân hoặc văn bản chứa các ký tự không phải là ASCII, thì bạn có thể gửi dữ liệu bằng Content-Type: multipart/form-data như giải thích trong Biểu mẫu – Phần 17.13.4.2

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

Lỗi này xảy ra nếu và chỉ nếu tất cả các điều kiện sau đây được đáp ứng:

  1. Yêu cầu HTTP do ứng dụng gửi đến Apigee Edge chứa:
    1. Content-Type: application/x-www-form-urlencoded và
    2. Dữ liệu biểu mẫu có dấu phần trăm (%) hoặc dấu phần trăm (%) theo sau là các ký tự thập lục phân không hợp lệ không được phép theo Biểu mẫu – Mục 17.13.4.1.
  2. API proxy trong Apigee Edge đọc các tham số biểu mẫu cụ thể chứa mọi ký tự không được phép sử dụng trong luồng yêu cầu bằng cách sử dụng chính sách ExtractVariables hoặc AssignMessage.

    Ví dụ: nếu dữ liệu biểu mẫu chứa dấu phần trăm (%) nguyên trạng (không mã hoá) hoặc dấu phần trăm (%) theo sau là bất kỳ ký tự thập lục phân không hợp lệ nào trong khoá và/hoặc giá trị, thì bạn sẽ gặp lỗi này.

    Sau đây là những 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
    Tham số biểu mẫu trong yêu cầu chứa các ký tự không được phép Các tham số biểu mẫu được truyền dưới dạng một phần của yêu cầu HTTP do máy khách gửi có chứa mọi ký tự không được phép sử dụng. Người dùng Edge Public Cloud và Private Cloud

Các bước chẩn đoán thường gặp

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ò phù hợp.
  2. Chuyển sang tổ chức mà bạn muốn điều tra vấn đề.

  3. Chuyển đến trang Phân tích > Giám sát API > Điều tra.
  4. Chọn khung thời gian cụ thể mà bạn nhận thấy lỗi.
  5. Vẽ Mã lỗi theo Thời gian.

  6. Chọn một ô có mã lỗi protocol.http.BadFormData như minh hoạ bên dưới:

    (xem ảnh lớn hơn)

  7. Thông tin về mã lỗi protocol.http.BadFormData sẽ xuất hiện như minh hoạ dưới đây:

    (xem ảnh lớn hơn)

  8. Nhấp vào Xem nhật ký rồi mở rộng hàng của yêu cầu không thực hiện được.

  9. Trong cửa sổ Nhật ký, hãy lưu ý những thông tin sau:
    • Mã trạng thái: 500
    • Nguồn lỗi: proxy
    • Mã lỗi: protocol.http.BadFormData
    • Chính sách về lỗi: extractvariables/EV-ExtractFormParams
  10. Nếu Nguồn lỗi là proxy, Mã lỗi là protocol.http.BadFormData và Chính sách lỗi không trống, thì điều đó có nghĩa là lỗi xảy ra trong khi chính sách cụ thể được chỉ định trong Chính sách lỗi đang đọc hoặc trích xuất dữ liệu biểu mẫu (tham số biểu mẫu) có bất kỳ ký tự nào không được phép sử dụng.
  11. Trong ví dụ này, X-Apigee-fault-policy là extractvariables/EV- ExtractFormParams, , có nghĩa là chính sách ExtractVariables có tên EV-ExtractFormParams không đọc hoặc trích xuất được các tham số biểu mẫu.

Công cụ theo dõi

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

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

  3. Chọn một trong các yêu cầu không thực hiện được và kiểm tra dấu vết.
  4. Điều hướng qua các giai đoạn khác nhau của dấu vết và xác định vị trí xảy ra lỗi.
  5. Bạn thường sẽ thấy lỗi này trong một trong các chính sách như minh hoạ bên dưới:

    Trong dấu vết mẫu ở trên, hãy lưu ý rằng lỗi xảy ra trong chính sách ExtractVariables có tên là EV-ExtractFormParams.

  6. Chuyển đến luồng có tên là Error (Lỗi) sau chính sách cụ thể không thành công:

  7. Ghi lại các giá trị sau đây từ dấu vết:

    error: Bad Form Data

    state: PROXY_REQ_FLOW

    error.class: com.apigee.rest.framework.BadRequestException

    • Giá trị của lỗi Bad Form Data cho biết các tham số biểu mẫu có một số ký tự không được phép sử dụng.
    • Giá trị của trạng thái PROXY_REQ_FLOW, cho biết rằng lỗi xảy ra trong luồng yêu cầu của proxy API.
  8. Chuyển đến Giai đoạn AX (Đã ghi lại dữ liệu Analytics) trong dấu vết rồi nhấp vào giai đoạn đó.
  9. Di chuyển xuống phần Phase Details (Chi tiết về giai đoạn) – Error Headers (Tiêu đề lỗi) và xác định các giá trị của X-Apigee-fault-code, X-Apigee-fault-source và X-Apigee-fault-policy như minh hoạ dưới đây:

  10. Xin lưu ý rằng các giá trị của X-Apigee-fault-code và X-Apigee-fault-source lần lượt là protocol.http.BadFormData và policy, đồng thời X-Apigee-fault-policy không được để trống. Điều này cho biết lỗi xảy ra trong khi chính sách cụ thể được chỉ ra trong X-Apigee-fault-policy đang đọc hoặc trích xuất dữ liệu biểu mẫu (tham số biểu mẫu) có chứa bất kỳ ký tự nào không được phép sử dụng.

    Tiêu đề phản hồi Giá trị
    X-Apigee-fault-code protocol.http.BadFormData
    X-Apigee-fault-source policy
    X-Apigee-fault-policy extractvariables/EV-ExtractFormParams
  11. Trong ví dụ này, X-Apigee-fault-policy là extractvariables/EV- ExtractFormParams, , tức là chính sách ExtractVariables có tên EV-ExtractFormParams không thành công khi đọc hoặc trích xuất các tham số biểu mẫu.

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, bạn có thể sử dụng nhật ký truy cập NGINX để xác định thông tin chính về HTTP 500 Internal Server Error.
  2. Kiểm tra nhật ký truy cập NGINX:

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

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

    Ví dụ về lỗi 500 trong nhật ký truy cập của NGINX:

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

    Tiêu đề Giá trị
    X-Apigee-fault-code protocol.http.BadFormData
    X-Apigee-fault-source policy
    X-Apigee-fault-policy extractvariables/EV-ExtractFormParams
  5. Xin lưu ý rằng các giá trị của X-Apigee-fault-code, X-Apigee-fault-source lần lượt là protocol.http.BadFormData, policy và X-Apigee-fault-policy không được để trống. Điều này cho biết lỗi xảy ra trong khi chính sách cụ thể được chỉ ra trong X-Apigee-fault-policy đang đọc hoặc trích xuất dữ liệu biểu mẫu (tham số biểu mẫu) có chứa bất kỳ ký tự nào không được phép sử dụng.
  6. Trong ví dụ này, X-Apigee-fault-policy là extractvariables/EV- ExtractFormParams, , tức là chính sách ExtractVariables có tên EV-ExtractFormParams không thành công khi đọc các tham số biểu mẫu.

Nguyên nhân: Các tham số biểu mẫu trong yêu cầu có chứa các ký tự không được phép

Chẩn đoán

  1. Xác định Mã lỗi, Nguồn lỗi và Chính sách lỗi cho 500 Internal Server Error bằng cách sử dụng tính năng Giám sát API, 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ỗi là protocol.http.BadFormData, Nguồn lỗi có giá trị proxy hoặc policy và Chính sách lỗi không phải là giá trị rỗng, thì điều này cho biết chính sách được chỉ định trong Chính sách lỗi không thành công trong khi đọc hoặc trích xuất dữ liệu biểu mẫu (tham số biểu mẫu).
  3. Kiểm tra chính sách được nêu trong Chính sách về lỗi và xác định những thông tin sau:
    1. Nguồn: Xác định xem chính sách có đang đọc hoặc trích xuất dữ liệu từ yêu cầu hay phản hồi hay không.
    2. Tham số biểu mẫu: Xác định các tham số biểu mẫu cụ thể đang được đọc trong chính sách.

      Mẫu số 1

      Ví dụ 1: Chính sách ExtractVariables trích xuất các tham số biểu mẫu:

            <ExtractVariables name="EV-ExtractFormParms">
               <DisplayName>EV-ExtractFormParams</DisplayName>
               <Source>request</Source>
               <FormParam name="username">
                  <Pattern ignoreCase="false">{username}</Pattern>
               </FormParam>
               <FormParam name="password">
                 <Pattern ignoreCase="false">{password}</Pattern>
               </FormParam>
               <VariablePrefix>forminfo</VariablePrefix>
             <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
            </ExtractVariables>
            

      Trong chính sách ExtractVariables ở trên:

      • Nguồn: request

        Điều này được biểu thị bằng phần tử <Source>

      • Tham số biểu mẫu: username và password

        Điều này được biểu thị bằng phần tử <Pattern> trong phần tử <FormParam>

      Điều này cho biết các tham số biểu mẫu username và/hoặc password được truyền dưới dạng một phần của yêu cầu HTTP của máy khách đến Apigee Edge chứa các ký tự không được phép sử dụng.

      Mẫu số 2

      Ví dụ 2: Chính sách AssignMessage sao chép các tham số biểu mẫu:

            <AssignMessage continueOnError="false" enabled="true" name="AM-CopyFormParams">
              <Copy source="request">
                <FormParams>
                  <FormParam name="username"/>
                  <FormParam name="password"/>
                </FormParams>
              </Copy>
              <AssignTo createNew="true" transport="http" type="request"/>
            </AssignMessage>
            

      Trong chính sách ExtractVariables ở trên:

      • Nguồn: request

        Điều này được biểu thị bằng thuộc tính source trong phần tử <Copy>

      • Tham số biểu mẫu: username và password

        Điều này được biểu thị bằng thuộc tính name trong phần tử <FormParam>

      Điều này cho biết các tham số biểu mẫu username hoặc password hoặc cả hai được truyền dưới dạng một phần của yêu cầu HTTP của máy khách đến Apigee Edge chứa bất kỳ ký tự nào không được phép sử dụng.

  4. Kiểm tra xem có ký tự nào không được phép sử dụng trong các tham số biểu mẫu được xác định ở bước 3 bằng một trong các phương thức sau:

    Công cụ theo dõi

    Cách xác thực bằng công cụ Trace:

    1. Nếu bạn đã ghi lại dấu vết cho yêu cầu không thành công như giải thích trong phần Các bước chẩn đoán thường gặp, hãy chọn một trong các yêu cầu không thành công.
    2. Nếu bạn xác định rằng các tham số biểu mẫu chứa mọi ký tự không được phép sử dụng là một phần của yêu cầu HTTP trong bước 3 ở trên, thì
      1. Chuyển đến giai đoạn Yêu cầu nhận được từ ứng dụng khách.
      2. Di chuyển xuống phần Thông tin chi tiết về giai đoạn rồi xem Nội dung yêu cầu.

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

      3. Trong ví dụ trên, hãy lưu ý rằng tham số biểu mẫu password chứa dấu phần trăm (%).
      4. Vì dấu phần trăm (%) cũng được dùng cho mã hoá phần trăm các ký tự đặc biệt, nên bạn không thể dùng dấu này nguyên trạng trong dữ liệu biểu mẫu.
      5. Do đó, Apigee Edge phản hồi bằng 500 Internal Server Error với mã lỗi protocol.http.BadFormData.

    Yêu cầu thực tế

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

    1. Nếu bạn không có quyền truy cập vào yêu cầu thực tế được gửi đến máy chủ mục tiêu, hãy chuyển đến phần Giải pháp.
    2. Nếu bạn có quyền truy cập vào yêu cầu thực tế được gửi đến Apigee Edge, hãy thực hiện các bước sau:
      1. Xem xét nội dung dữ liệu biểu mẫu và xem nội dung đó có chứa ký tự không được phép sử dụng hay không, chẳng hạn như dấu phần trăm (%) hoặc dấu phần trăm (%) theo sau là các ký tự thập lục phân không hợp lệ.

        Mẫu số 1

        Yêu cầu mẫu số 1: Dữ liệu biểu mẫu trong yêu cầu

        curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d "client_id=123456abc123&client_secret=c23578%ZY"
        

        Trong ví dụ này, lưu ý rằng phần tử client_secret có chứa dấu phần trăm (%) theo sau là các ký tự thập lục phân không hợp lệ ZY.

        Mẫu số 2

        Yêu cầu mẫu số 2: Dữ liệu biểu mẫu được truyền trong một tệp:

        curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d @form_data.xml
        

        Nội dung của form_data.xml:

        xml=<user><username>abc1234@google.com</username><password>qwerty12345!@#$%</password></user>

        Trong ví dụ này, lưu ý rằng phần tử password chứa dấu phần trăm (%), không được truyền nguyên trạng trong dữ liệu biểu mẫu.

    3. Trong hai ví dụ trên, dữ liệu biểu mẫu được gửi trong yêu cầu HTTP đến Apigee Edge có chứa các ký tự không được phép sử dụng.
    4. Do đó, Apigee Edge phản hồi bằng 500 Internal Server Error với mã lỗi protocol.http.BadFormData.

Độ phân giải

  1. Đảm bảo rằng mọi ký tự đặc biệt trong cả khoá và giá trị của dữ liệu biểu mẫu hoặc tham số do máy khách gửi dưới dạng một phần của yêu cầu HTTP luôn được mã hoá như giải thích trong Dữ liệu biểu mẫu – application/x-www-form-urlencoded.
  2. Đối với các ví dụ đã thảo luận ở trên, bạn có thể khắc phục vấn đề như sau:

    Mẫu số 1

    Ví dụ 1: Dữ liệu biểu mẫu được truyền trong yêu cầu:

    Sử dụng ký tự thập lục phân hợp lệ khớp với mã ASCII của một ký tự cụ thể. Ví dụ: nếu bạn muốn gửi dấu đô la ($), hãy sử dụng %24 như minh hoạ bên dưới:

    curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d "client_id=123456abc123&client_secret=c23578%24"
    

    Mẫu số 2

    Yêu cầu mẫu số 2: Dữ liệu biểu mẫu được truyền trong một tệp:

    curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d @form_data.xml
    

    Nội dung của form_data.xml:

    Sử dụng mã hoá theo tỷ lệ phần trăm cho dấu phần trăm (%), tức là sửa đổi tệp để có %25 như minh hoạ bên dưới:

    xml=<user><username>abc1234@google.com</username><password>qwerty12345!!@#$%25</password></user>

Thông số kỹ thuật

Apigee Edge yêu cầu bạn gửi dữ liệu biểu mẫu theo quy cách sau:

Thông số kỹ thuật
Dữ liệu biểu mẫu – application/x-www-form-urlencoded

Nếu bạn vẫn cần được Nhóm hỗ trợ Apigee trợ giúp, hãy xem phần Thông tin chẩn đoán bắt buộc phải thu thập.

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

Nếu vấn đề vẫn tiếp diễn ngay cả sau khi bạn làm theo hướng dẫn ở trên, hãy thu thập thông tin chẩn đoán sau đây rồi liên hệ với Nhóm hỗ trợ Apigee Edge:

Nếu bạn là người dùng Đám mây công cộng, 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
  • Lệnh curl hoàn chỉnh được dùng để tái tạo 500 Internal Server Error bằng mã lỗi protocol.http.BadFormData
  • 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, hãy cung cấp những thông tin sau:

  • Thông báo lỗi hoàn chỉnh được ghi nhận cho các yêu cầu không thành công
  • 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

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

  • Nhật ký hệ thống của Trình xử lý tin nhắn

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

Tài liệu tham khảo