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 khách sẽ nhận được mã trạng thái HTTP 500 Internal Server Error kèm theo 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 sẽ 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 biểu mẫu HTML có các phần tử chẳng hạ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ặp khoá-giá trị như một phần của yêu cầu hoặc phản hồi HTTP.

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

  1. Loại nội dung: application/x-www-form-urlcoded
    • Nếu dữ liệu biểu mẫu có kích thước nhỏ, thì dữ liệu sẽ được gửi dưới dạng các cặp khoá-giá trị với:
      • Ký tự trong cả hai khoá được mã hoá theo quy tắc đượ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 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 là phần trăm được mã hoá, tức là chúng được thể hiện dưới dạng bộ ba ký tự %HH, bao gồm một dấu phần trăm theo sau là 2 chữ số thập lục phân biểu thị 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, được hiểu là bắt đầu 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ì sẽ được truyền là %25, đại diện cho mã ASCII của ký hiệu phần trăm (%).
  2. Loại nội dung: multipart/form-data

    Nếu bạn muốn truyền số lượng lớn dữ liệu nhị phân hoặc văn bản có chứa giá trị không phải ASCII , sau đó bạn có thể gửi dữ liệu cùng với Content-Type: multipart/form-data như được 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 trong biểu mẫu có ký hiệu phần trăm (%) hoặc ký hiệu phần trăm (%) theo sau là 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 thông số biểu mẫu cụ thể có chứa ký tự bất kỳ không được phép sử dụng trong luồng yêu cầu bằng cách sử dụng ExtractVariables hoặc Chính sách AttributionMessage.

    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 có mã hoá) hoặc dấu phần trăm (%) theo sau là bất kỳ số thập lục phân không hợp lệ ký tự trong khoá và/hoặc giá trị, thì bạn sẽ gặp lỗi này.

    Dưới đâ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
    Thông số biểu mẫu trong yêu cầu chứa ký tự không được phép Thông số biểu mẫu được máy khách chuyển như một phần của yêu cầu HTTP chứa bất kỳ thông số nào các ký tự không được phép sử dụng. 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. Vẽ Mã lỗi theo Thời gian.

  6. Chọn một ô có mã lỗi protocol.http.BadFormData là được hiển thị bên dưới:

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

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

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

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

  9. 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: 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, Mã lỗi sẽ là protocol.http.BadFormDataChính sách lỗi không để trống, sau đó cho biết rằng lỗi xảy ra trong khi chính sách cụ thể được nêu trong Lỗi Chính sách đọc hoặc trích xuất dữ liệu biểu mẫu (tham số biểu mẫu) có bất kỳ các ký tự 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 Không gửi được EV-ExtractFormParams khi đọc hoặc trích xuất biểu mẫu tham số.

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à:
    • 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ả 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. Bạn thường sẽ thấy lỗi này ở một trong các chính sách như dưới đây:

    Trong dấu vết mẫu ở trên, 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 khi chính sách cụ thể không thành công:

  7. Lưu ý các giá trị của các dấu vết sau:

    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 biểu mẫu thông số 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 đã xảy ra lỗi trong quy trình yêu cầu của proxy API.
  8. Chuyển đến Giai đoạn AX (Đã ghi dữ liệu Analytics) trong dấu vết rồi nhấp vào nó.
  9. Cuộn xuống phần Chi tiết giai đoạnTiêu đề lỗi và xác định giá trị của X-Apigee-fault-code, X-Apigee-fault-source, và X-Apigee-fault-policy như sau:

  10. Lưu ý rằng các giá trị của X-Apigee-fault-codeX-Apigee-fault-source lần lượt là protocol.http.BadFormDatapolicyX-Apigee-fault-policy không trống. Điều này cho thấy rằng lỗi xảy ra trong 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 (thông số biểu mẫu), 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, , 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 biểu mẫu tham số.

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ề 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 hay không protocol.http.BadFormData trong một khoảng thời gian cụ thể (nếu vấn đề 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 500.
  4. Nếu bạn tìm thấy bất kỳ lỗi 500 nào với X-Apigee-fault-code khớp với giá trị của protocol.http.BadFormData, sau đó xác định giá trị của X-Apigee-fault-sourceX-Apigee-fault-policy.

    Lỗi 500 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-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. 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 X-Apigee-fault-policy không trống. Điều này cho thấy rằng lỗi xảy ra trong 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 (thông số biểu mẫu), có bất kỳ ký tự nào không được phép sử dụng.
  6. 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 biểu mẫu tham số.

Nguyên nhân: Thông số biểu mẫu trong yêu cầu 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ỗiChính sách lỗi cho 500 Internal Server Error bằng cách sử dụng chức 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 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 phải là trống, thì thông báo này cho biết rằng chính sách được chỉ định trong Chính sách lỗi bị lỗi trong khi đọc hoặc trích xuất dữ liệu biểu mẫu (thông số biểu mẫu).
  3. Xem xét chính sách nêu trong Chính sách về lỗi và xác định những thông tin sau của bạn:
    1. Nguồn: Xác định xem chính sách có đọc hoặc trích xuất dữ liệu từ yêu cầu hoặc phản hồi.
    2. Thông số biểu mẫu: Xác định các thông số biểu mẫu cụ thể đang được đọc trong .

      Mẫu số 1

      Mẫu số 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>

      • 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ử Phần tử <FormParam>

      Điều này cho biết rằng các tham số biểu mẫu username và/hoặc password được ứng dụng chuyển như một phần của yêu cầu HTTP để Apigee Edge 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 trong chính sách AttributionMessage:

            <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>

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

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

    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 đã thu thập được dấu vết của yêu cầu không thành công như được giải thích trong Các bước chẩn đoán thường gặp, sau đó chọn một trong yêu cầu không thành công.
    2. Nếu bạn xác định rằng các thông số biểu mẫu 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, sau đó
      1. Chuyển đến giai đoạn Yêu cầu đã nhận được từ ứng dụng.
      2. Cuộn xuống phần Chi tiết giai đoạn và xem lại Yêu cầu nội dung.

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

      3. Trong ví dụ trên, xin 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 cho mã hoá phần trăm các ký tự đặc biệt, không thể sử dụng theo nguyên trạng 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ủ đích, sau đó đi đến Độ phân giải.
    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, thì 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 bất kỳ 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à không hợp lệ ký tự thập lục phân.

        Mẫu số 1

        Yêu cầu mẫu 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, hãy lưu ý rằng phần tử client_secret chứa ký hiệu phần trăm (%) theo sau là ký tự thập lục phân không hợp lệ ZY.

        Mẫu số 2

        Yêu cầu mẫu 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, hãy lưu ý rằng phần tử password chứa ký hiệu phần trăm (%). Phần tử này không được được chuyển nguyên trạng vào dữ liệu biểu mẫu.

    3. Trong hai ví dụ trên, dữ liệu biểu mẫu được gửi dưới dạng một phần của yêu cầu HTTP tới Apigee Edge 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 với mã lỗi protocol.http.BadFormData.

Độ phân giải

  1. Hãy đả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 ứng dụng gửi dưới dạng một phần của yêu cầu HTTP luôn được mã hoá như được giải thích trong Dữ liệu biểu mẫu - application/x-www-form-url encrypted.
  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 đề như sau:

    Mẫu số 1

    Mẫu số 1: Dữ liệu biểu mẫu được truyền theo yêu cầu:

    Hãy sử dụng hợp lệ ký tự thập lục phân 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ư minh hoạ dưới đây:

    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 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á phần trăm cho ký hiệu phần trăm (%), nghĩa là sửa đổi tệp thành 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 yêu cầu 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-url cải tiến

Nếu bạn vẫn cần hỗ trợ từ Nhóm hỗ trợ Apigee, 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 ngay cả sau khi đã làm theo các hướng dẫn trên, hãy thu thập những thông tin sau thông tin chẩn đoán 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 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 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

Tài liệu tham khảo