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

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 sẽ nhận một mã trạng thái HTTP của 500 Internal Server Error với mã lỗi protocol.http.BadFormData làm phản hồi cho 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 đây:

HTTP/1.1 500 Internal Server Error

Ngoài ra, bạn có thể nhận 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 tìm hiểu chi tiết về cách khắc phục sự cố này, hãy cùng tìm hiểu 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 thành phần như hộp nhập văn bản, 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 chuỗi các cặp khoá-giá trị như một phần của các yêu cầu HTTP hoặc phản hồi.

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

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

      Yêu cầu mẫu với 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, nghĩa là chúng được biểu thị dưới dạng bộ ba ký tự %HH, bao gồm ký hiệu phần trăm, theo sau là hai chữ số hệ thập lục phân đại diện cho mã ASCII của ký tự cụ thể đó.
    • Do đó, mặc dù ký hiệu phần trăm (%) được cho phép trong dữ liệu biểu mẫu, nhưng nó được hiểu 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 ký hiệ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, đại diện cho mã ASCII cho ký tự ký hiệ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 ký tự không phải 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 – Mục 17.13.4.2

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

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

  1. Yêu cầu HTTP do khách hàng gửi tới Apigee Edge có chứa:
    1. Content-Type: application/x-www-form-urlencoded
    2. Dữ liệu biểu mẫu có ký hiệu phần trăm (%) hoặc ký hiệ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. Proxy API trong Apigee Edge sẽ đọc các tham số biểu mẫu cụ thể có chứa bất kỳ ký tự nào không được phép dùng trong quy trình yêu cầu bằng cách sử dụng ExtractVariables hoặc chính sách ConfigureMessage.

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

    Dưới đây là một số nguyên nhân có thể gây ra lỗi này:

    Nguyên nhân Nội dung mô tả Hướng dẫn khắc phục sự cố áp dụng cho
    Thông số biểu mẫu trong yêu cầu có chứa ký tự không được phép Các tham số biểu mẫu được ứng dụng khách chuyển trong yêu cầu HTTP có chứa mọi ký tự không được phép dùng. Người dùng Edge Public và Private Cloud

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à một 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 đề.

  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 quan sát thấy lỗi.
  5. Vẽ Mã lỗi dựa trên Thời gian.

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

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

  7. Thông tin về mã lỗi protocol.http.BadFormData hiển thị như sau:

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

  8. Nhấp vào Xem nhật ký rồi mở rộng hàng cho yêu cầu không thành công.

  9. Trong cửa sổ Logs (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ỗiproxy, thì Mã lỗiprotocol.http.BadFormDataChính sách lỗi không để trống, thì tức là lỗi đã xảy ra khi một chính sách cụ thể nêu trong Chính sách lỗi đọc hoặc trích xuất dữ liệu biểu mẫu (thông 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-policyextractvariables/EV- ExtractFormParams, , có nghĩa là chính sách ExtractVariables có tên là EV-ExtractFormParams không thành công khi đọc hoặc trích xuất các thông số biểu mẫu.

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 tính năng theo dõi phiên và:
    • 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 tuỳ chọn Show all FlowInfos (Hiện tất cả thông tin luồng):

  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 theo dõi và xác định vị trí xảy ra lỗi.
  5. Thường thì bạn sẽ thấy lỗi này ở một trong các chính sách dưới đây:

    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 quy trình có tên Lỗi sau một chính sách cụ thể không thành công:

  7. Hãy lưu ý các giá trị của các giá trị sau trong dấu vết:

    lỗi: Bad Form Data

    trạng thái: PROXY_REQ_FLOW

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

    • Giá trị của lỗi Bad Form Data cho biết rằng 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 lỗi đã xảy ra trong quy trình yêu cầu của proxy API.
  8. Chuyển đến Giai đoạn AX (Dữ liệu phân tích được ghi lại) trong dấu vết rồi nhấp vào đó.
  9. Di chuyển xuống mục Giai đoạn chi tiếtTiêu đề lỗi rồi xác định giá trị của X-Apigee-fault-code, X-Apigee-fault-sourceX-Apigee-fault-policy như bên dưới:

  10. Xin lưu ý rằng giá trị của X-Apigee-fault-codeX-Apigee-fault-source lần lượt là protocol.http.BadFormDatapolicy, còn X-Apigee-fault-policy. Điều này cho thấy rằng lỗi xảy ra khi chính sách cụ thể nêu trong X-Apigee-fault-policy là đọc hoặc trích xuất dữ liệu biểu mẫu (tham số biểu mẫu), trong đó có 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-policyextractvariables/EV- ExtractFormParams, . Điều này có nghĩa là chính sách ExtractVariables có tên là EV-ExtractFormParams không thành công khi đọc hoặc trích xuất các thông 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 tư, bạn có thể 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 kiế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-sourceX-Apigee-fault-policy.

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

    Mục mẫu ở trên từ nhật ký truy cập NGINX có các giá trị sau cho X-Apigee-fault-codeX-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-sourceprotocol.http.BadFormData, policy tương ứng và X-Apigee-fault-policy là giá trị không trống. Đây là lỗi xảy ra khi chính sách cụ thể nêu trong X-Apigee-fault-policy,, là đọ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 X-Apigee-fault-policy, sử dụng.
  6. Trong ví dụ này, X-Apigee-fault-policyextractvariables/EV- ExtractFormParams, . Điều này có nghĩa là chính sách ExtractVariables có tên EV-ExtractFormParams không thành công khi đọc các thông số biểu mẫu.

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

Chẩn đoán

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

      Mẫu số 1

      Ví dụ 1: Chính sách ExtractVariables trích xuất 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 nêu trên:

      • Nguồn: request

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

      • Thông số biểu mẫu: usernamepassword

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

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

      Mẫu số 2

      Mẫu số 2: Sao chép tham số biểu mẫu theo chính sách composeMessage:

            <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 nêu 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>

      • Thông số biểu mẫu: usernamepassword

        Đ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 rằng các tham số biểu mẫu username hoặc password hoặc cả hai được chuyển dưới dạng một phần của yêu cầu HTTP của khách hàng đến Apigee Edge có chứa bất kỳ ký tự nào không được phép sử dụng.

  4. Hãy 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 hay không:

    Công cụ theo dõi

    Cách xác thực bằng công cụ Theo dõi:

    1. Nếu bạn đã ghi lại dấu vết của 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 tham số biểu mẫu có chứa bất kỳ ký tự nào 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 Đã nhận yêu cầu từ ứng dụng.
      2. Di chuyển xuống phần Chi tiết giai đoạn rồi xem xét phần Yêu cầu nội dung.

        ( 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 ký hiệu phần trăm (%).
      4. Vì ký hiệu phần trăm (%) cũng được dùng để mã hoá phần trăm các ký tự đặc biệt, nên bạn không thể sử dụng ký hiệu này trong dữ liệu biểu mẫu.
      5. Do đó, Apigee Edge sẽ phản hồi bằng 500 Internal Server Error kèm theo 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ế mà bạn đã gửi cho Apigee Edge, hãy thực hiện các bước sau:
      1. Xem lại nội dung dữ liệu biểu mẫu và xem liệu nội dung đó có chứa ký tự nào không được phép sử dụng, chẳng hạn như ký hiệu phần trăm (%) hoặc ký hiệu phần trăm (%), theo sau là các ký tự hệ 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 trong 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, hãy lưu ý rằng phần tử client_secret chứa ký hiệu phần trăm (%) theo sau là các ký tự hệ 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 chuyể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, hãy lưu ý rằng phần tử password chứa ký hiệu phần trăm (%). Không được truyền giá trị này nguyên trạng trong dữ liệu biểu mẫu.

    3. Trong 2 ví dụ trên, dữ liệu biểu mẫu được gửi qua yêu cầu HTTP tới Apigee Edge có chứa các ký tự không được phép sử dụng.
    4. Do đó, Apigee Edge sẽ phản hồi bằng 500 Internal Server Error kèm theo 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 thông số do ứng dụng gửi dưới dạng một phần của yêu cầu HTTP bởi ứng dụng luôn được mã hoá như giải thích trong Dữ liệu biểu mẫu - application/x-www-form-urlcoded.
  2. Đối với các ví dụ được thảo luận ở trên, bạn có thể khắc phục các vấn đề sau:

    Mẫu số 1

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

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

    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 chuyể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 phần trăm mã hoá cho ký hiệu phần trăm (%), nghĩa là sửa đổi tệp để có %25 như minh hoạ dưới đây:

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

Thông số kỹ thuật

Apigee Edge dự kiến gửi dữ liệu biểu mẫu theo các quy cách sau:

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

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

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

Nếu sự cố vẫn tiếp diễn sau khi đã 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 Bộ phận hỗ trợ Apigee:

Nếu bạn là người dùng Public Cloud, 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 tạo 500 Internal Server Error có 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 tư, hãy cung cấp những thông tin sau:

  • Đã phát hiệ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à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, 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

Tài liệu tham khảo