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
- 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 (%
).
- 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:
- 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:
- 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 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.
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:
- Đă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.
Chuyển sang tổ chức mà bạn muốn điều tra vấn đề.
- Chuyển đến trang Phân tích > Giám sát API > Điều tra.
- Chọn khung thời gian cụ thể mà bạn quan sát thấy lỗi.
Vẽ Mã lỗi dựa trên Thời gian.
Chọn một ô có mã lỗi
protocol.http.BadFormData
như minh hoạ dưới đây:Thông tin về mã lỗi
protocol.http.BadFormData
hiển thị như sau: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.
- 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
- Mã trạng thái:
- Nếu Nguồn lỗi là
proxy
, thì Mã lỗi làprotocol.http.BadFormData
và Chí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. - 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 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:
- 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
- Chờ lỗi
Đảm bảo bạn đã bật tuỳ chọn Show all FlowInfos (Hiện tất cả thông tin luồng):
- 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 theo dõi và xác định vị trí xảy ra lỗi.
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
.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:
- 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.
- Giá trị của lỗi
- 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 đó.
Di chuyển xuống mục Giai đoạn chi tiết – Tiêu đề lỗi rồi xác định giá trị của X-Apigee-fault-code, X-Apigee-fault-source và X-Apigee-fault-policy như bên dưới:
Xin lưu ý rằng giá trị của X-Apigee-fault-code và X-Apigee-fault-source lần lượt là
protocol.http.BadFormData
vàpolicy
, 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
- Trong ví dụ này, X-Apigee-fault-policy là
extractvariables/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:
- 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
. 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ỗiprotocol.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ới500
hay không. 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ủaprotocol.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 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-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
- Xin lưu ý rằng các giá trị của X-Apigee-fault-code, X-Apigee-fault-source là
protocol.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. - Trong ví dụ này, X-Apigee-fault-policy là
extractvariables/EV- ExtractFormParams,
. Điều này có nghĩa là chính sách ExtractVariables có tênEV-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
- Xác định Mã lỗi, Nguồn lỗi và Chí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. - 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 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). - 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:
- 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.
- 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:
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 thấy rằng các tham số biểu mẫu
username
và/hoặcpassword
đượ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:
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 các tham số biểu mẫu
username
hoặcpassword
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.
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:
- 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.
- 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ì
- Chuyển đến giai đoạn Đã nhận yêu cầu từ ứng dụng.
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.
- 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 (%
). - 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. - 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ủ mục tiêu, hãy chuyển đến phần Giải pháp.
- 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:
- 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.
- 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 (
- 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.
- Do đó, Apigee Edge sẽ phản hồi bằng
500 Internal Server Error
kèm theo mã lỗiprotocol.http.BadFormData
.
Độ phân giải
- Đả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.
- Đố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ạ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 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, 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