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.EmptyPath 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":"Request path cannot be empty",
"detail":{
"errorcode":"protocol.http.EmptyPath"
}
}
}Các nguyên nhân có thể
Lỗi này xảy ra nếu URL yêu cầu của máy chủ phụ trợ (do biến luồng
target.url biểu thị) chứa một đường dẫn trống.
Theo quy cách RFC 3986, phần 3: Thành phần cú pháp và RFC 3986, phần 3.3: Đường dẫn:
Cú pháp URI có các thành phần sau:
foo://example.com:8042/over/there?name=ferret#nose \_/ \______________/\_________/ \_________/ \__/ | | | | | scheme authority path query fragment- Thành phần
pathlà bắt buộc và LUÔN PHẢI có dấu gạch chéo xuôi (/), ngay cả khi không có ký tự nào khác trong đường dẫn.
Do đó, nếu URL yêu cầu của máy chủ phụ trợ hoàn toàn không có thành phần path, tức là thậm chí không có dấu gạch chéo (/), thì Apigee Edge sẽ phản hồi bằng 500 Internal Server Error và mã lỗi protocol.http.EmptyPath.
Ví dụ: Nếu target.url có giá trị https://www.mocktarget.apigee.net, thì lỗi này sẽ xảy ra vì thành phần path trống hoặc bị thiếu.
| Nguyên nhân | Mô tả | Hướng dẫn khắc phục sự cố áp dụng cho |
|---|---|---|
| URL máy chủ phụ trợ (target.url) có đường dẫn trống | URL máy chủ phụ trợ do biến luồng target.url đại diện có một đường dẫn trố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
Quy trình 1: Sử dụng tính năng 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ò phù 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 nhận thấy lỗi.
Vẽ Mã lỗi theo Thời gian.
Chọn một ô có mã lỗi
protocol.http.EmptyPathnhư minh hoạ bên dưới:
Thông tin về mã lỗi
protocol.http.EmptyPathsẽ xuất hiện như hình dưới đây:
Nhấp vào Xem nhật ký để mở rộng hàng của yêu cầu không thực hiện được.
- 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:
target - Mã lỗi:
protocol.http.EmptyPath
- Mã trạng thái:
- Nếu Nguồn lỗi là
targetvà Mã lỗi làprotocol.http.EmptyPath, thì điều đó có nghĩa là URL máy chủ phụ trợ có một đường dẫn trống.
Trace
Quy trình 2: Sử dụng công cụ Trace
Cách chẩn đoán lỗi bằng công cụ Trace (Theo dõi):
- Bật phiên theo dõi và một trong hai lựa chọn sau:
- Chờ lỗi
500 Internal Server Errorxả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ả FlowInfo):
- 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.
- Đ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.
Bạn thường sẽ thấy lỗi này trong một quy trình sau giai đoạn Target Request Flow Started (Đã bắt đầu quy trình yêu cầu mục tiêu) như minh hoạ dưới đây:
Lưu ý giá trị của lỗi trong dấu vết.
error: Request path cannot be empty
Vì lỗi này do Apigee Edge đưa ra sau giai đoạn Target Request Flow Started (Đã bắt đầu quy trình yêu cầu mục tiêu), nên lỗi này cho biết rằng
pathtrong URL máy chủ phụ trợ là empty (trống). Điều này có thể xảy ra nếu biến luồngtarget.url(đại diện cho URL của máy chủ phụ trợ) có thể đã được cập nhật bằng một đường dẫn trống thông qua một trong các chính sách trong luồng yêu cầu.- Kiểm tra mục Variables Read and Assigned (Các biến được đọc và gán) trong từng luồng ngược từ điểm lỗi về phía giai đoạn Target Request Flow Started (Đã bắt đầu luồng yêu cầu mục tiêu).
Xác định chính sách nơi biến luồng
target.urlđược cập nhật.Mẫu dấu vết cho thấy chính sách JavaScript đã cập nhật biến luồng
target.url:
Trong dấu vết mẫu xuất hiện ở trên, hãy lưu ý rằng giá trị của biến luồng
target.urlđược cập nhật trong một chính sách JavaScript có tên là SetTargetURL như sau:target.url : https://mocktarget.apigee.net
- Xin lưu ý rằng
target.urlcó các thành phần sau:- scheme:
https://mocktarget.apigee.net - path: trống
- scheme:
- Do đó, bạn sẽ gặp lỗi
Request path cannot be empty. - Chuyển đến Giai đoạn AX (Dữ liệu Analytics được ghi lại) trong dấu vết rồi nhấp vào giai đoạn đó.
Di chuyển xuống phần Phase Details (Thông tin 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 (Mã lỗi X-Apigee) và X-Apigee-fault-source (Nguồn lỗi X-Apigee) như minh hoạ bên dưới:

- Bạn sẽ thấy các giá trị của X-Apigee-fault-code và X-Apigee-fault-source lần lượt là
protocol.http.EmptyPathvàtarget, cho biết lỗi này xảy ra do URL máy chủ phụ trợ có đường dẫn trống.Tiêu đề phản hồi Giá trị X-Apigee-fault-code protocol.http.EmptyPathX-Apigee-fault-source target
NGINX
Quy trình 3: Sử dụng nhật ký truy cập của 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, bạn có thể sử dụng nhật ký truy cập NGINX để xác định thông tin chính về
500 Internal Server ErrorHTTP. Kiểm tra nhật ký truy cập NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log- Tìm xem có lỗi
500nào với mã lỗiprotocol.http.EmptyPathtrong 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ới500hay không. Nếu bạn tìm thấy bất kỳ lỗi
500nào có X-Apigee-fault-code khớp với giá trị củaprotocol.http.EmptyPath, hãy xác định giá trị của X-Apigee-fault-source.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.EmptyPathX-Apigee-fault-source targetLư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.EmptyPathvàtarget, cho biết lỗi này xảy ra do URL máy chủ phụ trợ có đường dẫn trống.
Nguyên nhân: URL máy chủ phụ trợ (target.url) có đường dẫn trống
Chẩn đoán
- Xác định Mã lỗi và Nguồn lỗi cho
500 Internal Server Errorbằ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ư được giải thích trong phần Các bước chẩn đoán thường gặp. - Nếu Mã lỗi là
protocol.http.EmptyPathvà Nguồn lỗi có giá trị làtarget, thì điều này có nghĩa là URL máy chủ phụ trợ có đường dẫn trống. URL máy chủ phụ trợ được biểu thị bằng biến luồng
target.urltrong Apigee Edge. Lỗi này thường xảy ra nếu bạn cố gắng cập nhật URL máy chủ phụ trợ, tức làtarget.urlđộng bằng cách sử dụng bất kỳ chính sách nào (trong Proxy/luồng chia sẻ) trong luồng Yêu cầu mục tiêu, sao cho chính sách đó có một đường dẫn trống.- Xác định xem biến luồng
target.urlcó thực sự có một đường dẫn trống và nguồn cho giá trị của nó hay không bằng cách sử dụng một trong các bước sau:Trace
Sử dụng công cụ Trace
Nếu bạn đã ghi lại dấu vết cho lỗi này, hãy làm theo các bước như được giải thích trong phần Sử dụng Công cụ theo dõi và:
- Xác minh xem
target.urlcó đường dẫn trống hay không. Nếu có, hãy tìm hiểu xem chính sách nào đã sửa đổi hoặc cập nhật giá trị của
target.urlđể chứa đường dẫn trống.Dấu vết mẫu cho thấy chính sách JavaScript đã cập nhật biến luồng
target.url:
- Trong dấu vết mẫu ở trên, hãy lưu ý rằng chính sách JavaScript đã sửa đổi hoặc cập nhật giá trị của
target.urlđể chứa một đường dẫn trống. - Xin lưu ý rằng
target.urlcó các thành phần sau:- scheme:
https://mocktarget.apigee.net - path: trống
- scheme:
Nhật ký
Sử dụng nhật ký trong máy chủ nhật ký
- Nếu bạn không có dấu vết cho lỗi này (một vấn đề không liên tục), hãy kiểm tra để xem bạn đã ghi thông tin về giá trị của biến luồng
target.urlhay chưa, bằng cách sử dụng các chính sách như MessageLogging hoặc ServiceCallout cho máy chủ nhật ký của bạn. - Nếu bạn có nhật ký, hãy xem xét nhật ký đó và:
- Xác minh xem
target.urlcó đường dẫn trống hay không, và - Xem liệu bạn có thể xác định chính sách nào đã sửa đổi
target.urlđể chứa một đường dẫn trống hay không
- Xác minh xem
API proxy
Xem xét proxy API không thành công
Nếu bạn không có dấu vết hoặc nhật ký cho lỗi này, hãy xem xét proxy API không thành công để xác định những gì đã sửa đổi hoặc cập nhật biến luồng
target.urlđể chứa một đường dẫn không hợp lệ. Kiểm tra những điều sau:- Chính sách trong proxy API
- Mọi quy trình được chia sẻ đều được gọi từ proxy
- Xác minh xem
Kiểm tra kỹ chính sách cụ thể (Ví dụ: AssignMessage hoặc JavaScript) sửa đổi hoặc cập nhật biến luồng
target.urlvà xác định nguyên nhân khiếntarget.urlđược cập nhật để có một đường dẫn trống.Sau đây là một vài ví dụ về các chính sách cập nhật biến luồng
target.urlkhông chính xác để chứa một đường dẫn trống dẫn đến lỗi này.Mẫu số 1
Ví dụ 1: Biến
target.urlcập nhật Chính sách JavaScriptvar url = "https://mocktarget.apigee.net" context.setVariable("target.url", url);
Trong mẫu ở trên, hãy lưu ý rằng biến luồng
target.urlđược cập nhật bằng giá trịhttps://mocktarget.apigee.netcó trong một biến khácurl.Xin lưu ý rằng
target.urlcó các thành phần sau:- scheme:
https://mocktarget.apigee.net - path: trống
Vì đường dẫn trống, Apigee Edge trả về
500 Internal Server Errorvới mã lỗiprotocol.http.EmptyPath.Mẫu số 2
Ví dụ 2: Biến
target.urlcập nhật Chính sách JavaScriptvar path = context.getVariable("request.header.Path"); var url = "https://mocktarget.apigee.net" + path context.setVariable("target.url", url);
Trong mẫu trên, hãy lưu ý rằng biến luồng
target.urlđược cập nhật bằng cách nối giá trịhttps://mocktarget.apigee.netcó trong biếnurlvà giá trị của một biến khácpath, giá trị của biến này được truy xuất từrequest.header.Path.Nếu có quyền truy cập vào yêu cầu hoặc dấu vết thực tế, thì bạn có thể xác minh giá trị thực tế được truyền đến
request.header.Path.Yêu cầu mẫu do người dùng đưa ra:
curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token>
Trong ví dụ này, đường dẫn tiêu đề không được gửi trong yêu cầu. Do đó, giá trị của đường dẫn biến trong chính sách JavaScript là
null.Do đó:
url = https://mocktarget.apigee.net + pathurl = https://mocktarget.apigee.net + nulltarget.url = https://mocktarget.apigee.netnull
Xin lưu ý rằng
target.urlcó các thành phần sau:- scheme:
https://mocktarget.apigee.netnull - path: trống
Ví dụ 3
Ví dụ 3: Chính sách AssignMessage cập nhật biến
target.urlthông qua một biến khác<AssignMessage async="false" continueOnError="false" enabled="true" name=">AM-SetTargetURL"> <DisplayName>AM-SetTargetURL</DisplayName> <AssignVariable> <Name>target.url</Name> <Value>https://mocktarget.apigee.net</Value> </AssignVariable> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
Xin lưu ý rằng
target.urlcó các thành phần sau:- scheme:
https://mocktarget.apigee.net - path: trống
Trong tất cả các ví dụ trên, đường dẫn trong URL máy chủ phụ trợ (tức là
target.url) đều trống. Do đó, Apigee Edge sẽ trả về500 Internal Server Errorvới mã lỗiprotocol.http.EmptyPath.- scheme:
Độ phân giải
Theo quy cách
RFC 3986, phần 2: Thành phần cú pháp, thành phần path là bắt buộc và LUÔN PHẢI có dấu gạch chéo lên (/), ngay cả khi không có ký tự nào khác trong path. Hãy thực hiện các bước sau để khắc phục vấn đề này:
- Đảm bảo rằng URL máy chủ phụ trợ (do biến luồng
target.urlbiểu thị) luôn có đường dẫn không trống.- Trong một số trường hợp, bạn có thể không có tên tài nguyên trong đường dẫn, sau đó đảm bảo rằng đường dẫn có ít nhất một dấu gạch chéo lên (
/). - Nếu bạn sử dụng bất kỳ biến nào khác để xác định giá trị của biến luồng
target.url, hãy đảm bảo rằng các biến khác không có đường dẫn trống. - Nếu bạn thực hiện bất kỳ thao tác nào trên chuỗi để xác định giá trị của biến luồng
target.url, hãy đảm bảo rằng kết quả hoặc đầu ra của các thao tác trên chuỗi không có đường dẫn trống.
- Trong một số trường hợp, bạn có thể không có tên tài nguyên trong đường dẫn, sau đó đảm bảo rằng đường dẫn có ít nhất một dấu gạch chéo lên (
- Trong các mẫu được thảo luận trong phần Chẩn đoán, bạn có thể khắc phục vấn đề này như giải thích dưới đây:
Mẫu số 1
Ví dụ 1: Biến
target.urlcập nhật Chính sách JavaScriptThêm dấu gạch chéo (
/) vào biếnurlđể khắc phục vấn đề này như minh hoạ bên dưới:var url = "https://mocktarget.apigee.net/" context.setVariable("target.url", url);
Mẫu số 2
Ví dụ 2: Biến
target.urlcập nhật Chính sách JavaScriptvar path = context.getVariable("request.header.Path"); var url = "https://mocktarget.apigee.net" + path context.setVariable("target.url", url);
Đảm bảo rằng bạn truyền một đường dẫn hợp lệ, ví dụ:
/iloveapistrong tiêu đề của yêu cầuPathđể khắc phục vấn đề này như minh hoạ dưới đây:Yêu cầu mẫu:
curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: /iloveapis"
Ví dụ 3
Ví dụ 3: Chính sách AssignMessage cập nhật biến
target.urlthông qua một biến khácThêm một đường dẫn hợp lệ vào phần tử
<Value>của chính sách AssignMessage. Ví dụ: bạn có thể có/jsonlàm đường dẫn cho MockTarget API. Tức là sửa đổi phần tử<Value>thànhhttps://mocktarget.apigee.net/jsonnhư minh hoạ dưới đây:<AssignMessage async="false" continueOnError="false" enabled="true" name="AM-SetTargetURL"> <DisplayName>AM-SetTargetURL</DisplayName> <AssignVariable> <Name>target.url</Name> <Value>https://mocktarget.apigee.net/json</Value> </AssignVariable> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
Thông số kỹ thuật
Apigee Edge yêu cầu URL máy chủ phụ trợ không có đường dẫn trống theo các quy cách sau:
| Thông số kỹ thuật |
|---|
| RFC 3986, phần 3: Thành phần cú pháp |
| RFC 3986, phần 3.3: Đường dẫn |
Nếu bạn vẫn cần được Nhóm hỗ trợ Apigee trợ giúp, hãy truy cập vào 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 API Proxy
- Lệnh
curlhoàn chỉnh được dùng để tái tạo500 Internal Server Errorbằng mã lỗiprotocol.http.EmptyPath - 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_logTrong đó: ORG, ENV và PORT# được thay 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