Bạn đang xem tài liệu về Apigee Edge.
Chuyển đến tài liệu về
Apigee X. thông tin
RequestVariableNotMessageType
Mã lỗi
steps.servicecallout.RequestVariableNotMessageType
Nội dung phản hồi lỗi
{ "fault": { "faultstring": "ServiceCallout[policy_name]: request variable [variable_name] value is not of type Message", "detail": { "errorcode": "steps.servicecallout.RequestVariableNotMessageType" } } }
Nguyên nhân
Lỗi này xảy ra nếu một biến được chỉ định trong phần tử <Request>
của Chính sách chú thích dịch vụ không thuộc loại thông báo. Nếu biến là một chuỗi hoặc bất kỳ loại nào khác không phải thông báo, thì bạn sẽ thấy lỗi này.
Các biến loại thông báo đại diện cho toàn bộ yêu cầu và phản hồi HTTP. Các biến luồng Edge tích hợp sẵn request
, response
và message
thuộc loại thông báo. Để tìm hiểu thêm về các biến thông báo, hãy xem Tài liệu tham khảo về biến.
Chẩn đoán
Xác định chính sách Chú thích dịch vụ nơi xảy ra lỗi và tên của biến có loại không chính xác. Bạn có thể tìm thấy cả hai mục này trong phần tử
faultstring
của phản hồi lỗi. Ví dụ: trongfaultstring
sau đây, tên chính sách làExecuteGeocodingRequest
và biến làPostalCode
:"faultstring": "ServiceCallout[ExecuteGeocodingRequest]: request variable PostalCode value is not of type Message"
Trong XML chính sách Chú thích dịch vụ không thành công, hãy xác minh rằng tên của biến được đặt trong phần tử
<Request>
khớp với tên biến được xác định trong chuỗi lỗi (bước #1 ở trên). Ví dụ: chính sách sau đây chỉ định một biến yêu cầu có tênPostalCode
, khớp với nội dung trongfaultstring
:<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <ServiceCallout name="ExecuteGeocodingRequest"> <Request variable="PostalCode"/> <Response>GeocodingResponse</Response> <HTTPTargetConnection> <URL>http://maps.googleapis.com/maps/api/geocode/json</URL> </HTTPTargetConnection> </ServiceCallout>
Xác định xem biến này có thuộc loại thông báo hay không:
- Tìm mã trong Gói Proxy API, nơi biến được xác định trước.
- Trong hầu hết các trường hợp, bạn sẽ thấy biến vấn đề được tạo và điền sẵn trong một chính sách khác thực thi trước chính sách Chú thích dịch vụ. Ví dụ: chính sách Chỉ định thông báo thường được dùng để tạo và điền các biến trong quy trình proxy API.
- Sau khi tìm hiểu chính sách mà biến được định nghĩa và điền trước, bạn cần xác định loại biến đó như sau:
- Kiểm tra giá trị của thuộc tính
type
(nếu có). - Nếu không có thuộc tính
type
thì biến này được coi là một chuỗi.
- Kiểm tra giá trị của thuộc tính
- Nếu loại biến không phải là thông báo (chẳng hạn như chuỗi), thì đó là nguyên nhân gây ra lỗi. Bạn có thể tìm hiểu về các biến phổ biến và loại biến trong Tài liệu tham khảo về biến.
Ví dụ: giả sử biến PostalCode
tham chiếu trong chính sách Chú thích dịch vụ được tạo trong chính sách Chỉ định thông báo dưới đây. Xin lưu ý rằng PostalCode
được gán giá trị của biến luồng request.queryparam.postalcode
. Giá trị này là một chuỗi vì không có thuộc tính type
nào trong việc gán biến.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AssignMessage name="GenerateGeocodingRequest">
<AssignTo createNew="true" type="request">GeocodingRequest</AssignTo>
<Set>
<QueryParams>
<QueryParam name="address">{request.queryparam.postalcode}</QueryParam>
<QueryParam name="region">{request.queryparam.country}</QueryParam>
<QueryParam name="sensor">false</QueryParam>
</QueryParams>
<Verb>GET</Verb>
</Set>
<AssignVariable>
<Name>PostalCode</Name>
<Ref>request.queryparam.postalcode</Ref>
</AssignVariable>
<AssignVariable>
<Name>Country</Name>
<Ref>request.queryparam.country</Ref>
</AssignVariable>
</AssignMessage>
Bây giờ, hãy nhớ lại biến PostalCode
được dùng trong phần tử <Request>
của chính sách Chú thích dịch vụ:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceCallout name="ExecuteGeocodingRequest">
<Request variable="PostalCode"/>
<Response>GeocodingResponse</Response>
<HTTPTargetConnection>
<URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
</HTTPTargetConnection>
</ServiceCallout>
Vì PostalCode
không thuộc loại thông báo (trong ví dụ này là một chuỗi) nên bạn sẽ nhận được mã lỗi: steps.servicecallout.RequestVariableNotMessageType
.
Độ phân giải
Đảm bảo rằng biến được đặt trong phần tử <Request>
của chính sách Chú thích dịch vụ không thành công là biến luồng loại thông báo tồn tại hoặc bạn có thể tạo một biến loại thông báo mới ngay trong chính sách Chú thích dịch vụ (như giải thích trong tài liệu về chính sách) và sử dụng biến đó.
Để sửa chính sách này, bạn phải sửa đổi phần tử <Request>
để chỉ định một biến hiện có hoặc biến mới thuộc loại thông báo. Ví dụ: biến GeocodingRequest
được đặt trong chính sách Chỉ định tin nhắn là loại thông báo và sẽ hoạt động tốt trong chính sách Chú thích dịch vụ. Ví dụ:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceCallout name="ExecuteGeocodingRequest">
<Request variable="GeocodingRequest"/>
<Response>GeocodingResponse</Response>
<HTTPTargetConnection>
<URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
</HTTPTargetConnection>
</ServiceCallout>
RequestVariableNotRequestMessageType
Mã lỗi
steps.servicecallout.RequestVariableNotRequestMessageType
Nội dung phản hồi lỗi
{ "fault": { "faultstring": "ServiceCallout[policy_name]: request variable [variable_name] value is not of type Request Message", "detail": { "errorcode": "steps.servicecallout.RequestVariableNotRequestMessageType" } } }
Nguyên nhân
Lỗi này xảy ra nếu một biến được chỉ định trong phần tử <Request>
của Chính sách chú thích dịch vụ không thuộc loại thông báo yêu cầu. Nếu biến là loại thông báo phản hồi, chuỗi hoặc bất kỳ loại nào khác, thì bạn sẽ thấy lỗi này.
Các biến loại Message đại diện cho toàn bộ yêu cầu HTTP và phản hồi. Các biến luồng Edge tích hợp sẵn request
, response
và message
thuộc loại thông báo. Để tìm hiểu thêm về các biến thông báo, hãy xem Tài liệu tham khảo về biến.
Chẩn đoán
Xác định chính sách Chú thích dịch vụ nơi xảy ra lỗi và tên của biến có loại không chính xác. Bạn có thể tìm thấy cả hai mục này trong phần tử
faultstring
của phản hồi lỗi. Ví dụ: trongfaultstring
sau đây, tên chính sách làExecuteGeocodingRequest
và biến làvar_response
:"faultstring": "ServiceCallout[ExecuteGeocodingRequest]: request variable var_response value is not of type Message"
Trong XML chính sách Chú thích dịch vụ không thành công, hãy xác minh rằng tên của biến được đặt trong phần tử
<Request>
khớp với tên biến được xác định trong chuỗi lỗi (bước #1 ở trên). Ví dụ: chính sách sau đây chỉ định một biến yêu cầu có tênvar_response
, khớp với nội dung trongfaultstring
:<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <ServiceCallout name="ExecuteGeocodingRequest"> <Request variable="var_response"/> <Response>GeocodingResponse</Response> <HTTPTargetConnection> <URL>http://maps.googleapis.com/maps/api/geocode/json</URL> </HTTPTargetConnection> </ServiceCallout>
Xác định xem biến có thuộc loại thông báo yêu cầu hay không:
- Tìm mã trong Gói Proxy API, nơi biến được xác định trước.
- Trong hầu hết các trường hợp, bạn sẽ thấy biến vấn đề được tạo và điền sẵn trong một chính sách khác thực thi trước chính sách Chú thích dịch vụ. Ví dụ: chính sách Chỉ định thông báo thường được dùng để tạo và điền các biến trong quy trình proxy API.
- Sau khi tìm hiểu chính sách mà biến được định nghĩa và điền trước, bạn cần xác định loại biến đó như sau:
- Kiểm tra giá trị của thuộc tính
type
(nếu có). - Nếu không có thuộc tính
type
thì biến này được coi là một chuỗi.
- Kiểm tra giá trị của thuộc tính
- Nếu loại biến không thuộc loại thông báo yêu cầu, thì đó là nguyên nhân gây ra lỗi. Bạn có thể tìm hiểu về các biến phổ biến và loại biến trong Tài liệu tham khảo về biến.
Ví dụ: giả sử biến var_response
tham chiếu trong chính sách Chú thích dịch vụ được tạo trong chính sách Chỉ định thông báo sau đây. Xin lưu ý rằng var_response
được gán cho kiểu response
. Do đó, kiểu của biến var_response
là thông báo phản hồi.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AssignMessage name="GenerateGeocodingRequest">
<AssignTo createNew="true" type="request">GeocodingRequest</AssignTo>
<AssignTo createNew="true" type="response">var_response</AssignTo>
<Set>
<QueryParams>
<QueryParam name="address">{request.queryparam.postalcode}</QueryParam>
<QueryParam name="region">{request.queryparam.country}</QueryParam>
<QueryParam name="sensor">false</QueryParam>
</QueryParams>
<Verb>GET</Verb>
</Set>
<AssignVariable>
<Name>PostalCode</Name>
<Ref>request.queryparam.postalcode</Ref>
</AssignVariable>
<AssignVariable>
<Name>Country</Name>
<Ref>request.queryparam.country</Ref>
</AssignVariable>
</AssignMessage>
Hãy nhớ rằng biến var_response
được dùng trong phần tử <Request>
của Chính sách về chú thích dịch vụ.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceCallout name="ExecuteGeocodingRequest">
<Request variable="var_response"/>
<Response>GeocodingResponse</Response>
<HTTPTargetConnection>
<URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
</HTTPTargetConnection>
</ServiceCallout>
Vì var_response
không thuộc loại thông báo yêu cầu (loại của thông báo yêu cầu là thông báo phản hồi) nên bạn sẽ nhận được mã lỗi: steps.servicecallout.RequestVariableNotRequestMessageType
.
Độ phân giải
Đảm bảo rằng biến được đặt trong phần tử <Request>
trong chính sách Chú thích dịch vụ không thành công là biến loại thông báo yêu cầu tồn tại hoặc bạn có thể tạo một biến loại thông báo yêu cầu mới ngay trong chính sách Chú thích dịch vụ (như giải thích trong tài liệu về chính sách) và sử dụng biến đó.
Để sửa chính sách này, bạn phải sửa đổi phần tử <Request>
để chỉ định một biến hiện có hoặc biến mới thuộc loại thông báo yêu cầu. Biến này sẽ hoạt động trong chính sách Chú thích dịch vụ. Ví dụ:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceCallout name="ExecuteGeocodingRequest">
<Request variable="GeocodingRequest"/>
<Response>GeocodingResponse</Response>
<HTTPTargetConnection>
<URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
</HTTPTargetConnection>
</ServiceCallout>
ExecutionFailed
Mã lỗi
steps.servicecallout.ExecutionFailed
Nội dung phản hồi lỗi
{ "fault": { "faultstring": "Execution of ServiceCallout [policy_name] failed. Reason: Host not reachable", "detail": { "errorcode": "steps.servicecallout.ExecutionFailed" } } }
hoặc
{ "fault": { "faultstring": "Execution of ServiceCallout [policy_name] failed. Reason: ResponseCode [http_code] is treated as error", "detail": { "errorcode": "steps.servicecallout.ExecutionFailed" } } }
Các nguyên nhân có thể
Nguyên nhân có thể dẫn đến lỗi này là:
Nguyên nhân | Mô tả |
URL không hợp lệ hoặc không đúng định dạng | URL đích trong chính sách Chú thích dịch vụ không đúng định dạng hoặc có tên máy chủ không hợp lệ hoặc không thể truy cập được. |
Lỗi máy chủ phụ trợ | Máy chủ phụ trợ trả về phản hồi lỗi 4XX hoặc 5XX. |
Nguyên nhân: URL không hợp lệ hoặc không đúng định dạng
URL đích trong chính sách Chú thích dịch vụ không đúng định dạng hoặc có tên máy chủ không hợp lệ hoặc không thể truy cập được.
Chẩn đoán
Xác định chính sách về Chú thích dịch vụ đã gây ra lỗi. Tên chính sách sẽ xuất hiện trong phần tử
faultstring
của phản hồi lỗi. Ví dụ: trongfaultstring
sau đây, tên của chính sách Chú thích dịch vụ không thành công làExecuteGeocodingRequest
."faultstring": "ServiceCallout[ExecuteGeocodingRequest]"
Trong chính sách về Chú thích dịch vụ không thành công, hãy kiểm tra phần tử
<URL>
. Nếu tệp không đúng định dạng hoặc có tên máy chủ không hợp lệ hay không thể truy cập, thì đó là nguyên nhân gây ra lỗi này. Ví dụ: chính sách Chú thích dịch vụ sau đây chỉ định<URL>
không hợp lệ:<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <ServiceCallout name="ExecuteGeocodingRequest"> <Request variable="GeocodingRequest"/> <Response>GeocodingResponse</Response> <HTTPTargetConnection> <URL>http://</URL> </HTTPTargetConnection> </ServiceCallout>
Phần tử
<URL>
chỉ có giao thứchttp://
, nhưng không có tên máy chủ hợp lệ. Do đó, chính sách Chú thích dịch vụ sẽ không thành công với lỗi:Execution of ServiceCallout ExecuteGeocodingRequest failed. Reason: Host not reachable
.
Độ phân giải
Đảm bảo rằng phần tử <URL>
trong chính sách Chú thích dịch vụ không thành công có URL hợp lệ với tên máy chủ có thể truy cập.
Để sửa chính sách về Chú thích dịch vụ như trên, bạn có thể sửa đổi phần tử <URL>
để chỉ định một URL hợp lệ:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceCallout name="ExecuteGeocodingRequest">
<Request variable="GeocodingRequest"/>
<Response>GeocodingResponse</Response>
<HTTPTargetConnection>
<URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
</HTTPTargetConnection>
</ServiceCallout>
Nguyên nhân: Lỗi máy chủ phụ trợ
Máy chủ phụ trợ trả về phản hồi lỗi 4XX hoặc 5XX.
Chẩn đoán
Xác định chính sách về Chú thích dịch vụ đã gây ra lỗi. Tên chính sách sẽ xuất hiện trong phần tử
faultstring
của phản hồi lỗi. Ví dụ: trongfaultstring
sau đây, tên của chính sách Chú thích dịch vụ không thành công làExecuteGeocodingRequest
."faultstring": "ServiceCallout[ExecuteGeocodingRequest]
Kiểm tra
faultstring
trong nội dung phản hồi lỗi và kiểm tra xem có mã phản hồi 4XX hoặc 5XX nào được liệt kê trongReason
hay không. Ví dụ: chuỗi lỗi sau đây chỉ ra rõ rằng mã phản hồi 502 đã được máy chủ phụ trợ trả về:"faultstring": "Execution of ServiceCallout ExecuteGeocodingRequest failed. Reason: ResponseCode 502 is treated as error"
Độ phân giải
Sau khi xác định mã phản hồi lỗi, bạn có thể khắc phục sự cố này giống như với bất kỳ lỗi 4XX hoặc 5XX nào. Tham khảo Cẩm nang về lỗi thời gian chạy (4XX/5XX) để xem hướng dẫn về cách khắc phục sự cố và giải quyết lỗi 4XX hoặc 5XX.