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
- 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 (%
).
- 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:
- 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:
- Yêu cầu HTTP do khách hàng gửi tới Apigee Edge có chứa:
Content-Type: application/x-www-form-urlencoded
và- 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.
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:
- Đă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.
Chuyển sang tổ chức mà bạn muốn điều tra vấn đề này.
- Chuyển đến thẻ Analyze (Phân tích) > Giám sát API > Điều tra.
- Chọn khung thời gian cụ thể mà bạn phát hiện thấy lỗi.
Vẽ Mã lỗi theo Thời gian.
Chọn một ô có mã lỗi
protocol.http.BadFormData
là được hiển thị bên dưới:Thông tin về mã lỗi
protocol.http.BadFormData
là được hiển thị như sau: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.
- 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
- Mã trạng thái:
- Nếu Nguồn lỗi là
proxy
, Mã lỗi sẽ làprotocol.http.BadFormData
và Chí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. - 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 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:
- 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
- Chờ lỗi
Đảm bảo bạn đã bật chế độ Show all FlowInfos (Hiện tất cả FlowInfos):
- 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.
- 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.
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
.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:
- 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.
- Giá trị của lỗi
- Chuyển đến Giai đoạn AX (Đã ghi dữ liệu Analytics) trong dấu vết rồi nhấp vào nó.
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-code, X-Apigee-fault-source, và X-Apigee-fault-policy như sau:
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
và 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.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
- 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 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:
- 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
. Kiểm tra nhật ký truy cập NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
- Tìm kiếm xem có lỗi
500
nào với mã lỗi hay khôngprotocol.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ới500
. 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ủaprotocol.http.BadFormData
, sau đó xác định giá trị của X-Apigee-fault-source và X-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-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
- 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 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. - 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 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
- 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 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. - Nếu Mã lỗi là
protocol.http.BadFormData
, Nguồn lỗi có giá trịproxy
hoặcpolicy
và Chí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). - 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:
- 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.
- 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:
username
vàpassword
Đ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ặcpassword
đượ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:
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 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.
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:
- 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.
- 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 đó
- Chuyển đến giai đoạn Yêu cầu đã nhận được từ ứng dụng.
Cuộn xuống phần Chi tiết giai đoạn và xem lại Yêu cầu nội dung.
- 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 (%
). - 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. - Do đó, Apigee Edge sẽ phản hồi bằng
500 Internal Server Error
kèm theo mã lỗiprotocol.http.BadFormData
.
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 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.
- 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:
- 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.
- 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 (
- 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.
- Do đó, Apigee Edge sẽ phản hồi bằng
500 Internal Server Error
với mã lỗiprotocol.http.BadFormData
.
Độ phân giải
- 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.
- Đố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ạo500 Internal Server Error
có mã lỗiprotocol.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, ENV và PORT# đượ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