Khắc phục lỗi thời gian chạy Chú thích dịch vụ

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

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 message. Nếu biến là một chuỗi hoặc bất kỳ loại nào khác không phải là loại thông báo, thì bạn sẽ thấy lỗi này.

Các biến thuộc 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, responsemessage 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

  1. 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ụ: trong faultstring 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"

  2. Trong tệp XML chính sách Lệnh gọi 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ên là PostalCode, khớp với nội dung trong faultstring:

    <?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>
    
  3. Xác định xem biến này có thuộc loại thông báo hay không:

    1. Xác định vị trí đoạn mã trong gói API Proxy, nơi biến được xác định lần đầu tiên.
    2. Trong hầu hết các trường hợp, bạn sẽ thấy rằng 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 Lời gọi dịch vụ. Ví dụ: chính sách Assign Message (Chỉ định thông báo) thường được dùng để tạo và điền các biến trong một luồng proxy API.
    3. Sau khi tìm ra chính sách mà biến được xác định và điền sẵn trước tiên, 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 thuộc tính type không có, thì biến được coi là một chuỗi.
    4. Nếu loại của biến không phải là thông báo (chẳng hạn như một 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 được 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. Lưu ý rằng PostalCode được chỉ định 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 phép 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ớ rằng 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>

PostalCode không thuộc loại thông báo (đây là một chuỗi trong ví dụ này), 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> trong chính sách Lời gọi dịch vụ không thành công là một biến luồng thuộc loại message (thông báo) hiện có hoặc bạn có thể tạo một biến thuộc loại thông báo mới ngay trong chính sách Lời gọi dịch vụ (như được giải thích trong tài liệu về chính sách) và sử dụng biến đó.

Để sửa đổi chính sách, 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 thông báo thuộc loại thông báo và sẽ hoạt động bình thườ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>

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à một loại thông báo phản hồi, một 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 thuộc 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, responsemessage 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

  1. 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ụ: trong faultstring 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"

  2. Trong tệp XML chính sách Lệnh gọi 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ên là var_response, khớp với nội dung trong faultstring:

    <?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>
    
  3. Xác định xem biến có thuộc loại thông báo yêu cầu hay không:

    1. Xác định vị trí đoạn mã trong gói API Proxy, nơi biến được xác định lần đầu tiên.
    2. Trong hầu hết các trường hợp, bạn sẽ thấy rằng 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 Lời gọi dịch vụ. Ví dụ: chính sách Assign Message (Chỉ định thông báo) thường được dùng để tạo và điền các biến trong một luồng proxy API.
    3. Sau khi tìm ra chính sách mà biến được xác định và điền sẵn trước tiên, 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 thuộc tính type không có, thì biến được coi là một chuỗi.
    4. Nếu loại của biến không phải là 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 được 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 chỉ định loại response. Do đó, loại 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 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>

var_response không thuộc loại thông báo yêu cầu (loại của thông báo này 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 Lệnh gọi dịch vụ không thành công là biến thuộc loại thông báo yêu cầu hiện có hoặc bạn có thể tạo trực tiếp một biến thuộc loại thông báo yêu cầu mới trong chính sách Lệnh gọi dịch vụ (như được 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 và biến đó 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ể

Các nguyên nhân có thể gây ra lỗi này là:

Nguyên nhân Nội dung mô tả
URL không hợp lệ hoặc không đúng định dạng URL mục tiêu trong chính sách Chú thích về dịch vụ có định dạng không chuẩn hoặc có tên máy chủ không hợp lệ hoặc không truy cập được.
Lỗi máy chủ phụ trợ Máy chủ phụ trợ trả về một 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 mục tiêu trong chính sách Chú thích về dịch vụ có định dạng không chuẩn hoặc có tên máy chủ không hợp lệ hoặc không truy cập được.

Chẩn đoán

  1. Xác định chính sách Chú thích về dịch vụ gây ra lỗi. Tên chính sách xuất hiện trong phần tử faultstring của phản hồi lỗi. Ví dụ: trong faultstring sau đây, tên của chính sách Lệnh gọi dịch vụ không thành công là ExecuteGeocodingRequest.

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]"

  2. 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 URL đó bị lỗi hoặc có tên máy chủ không hợp lệ hoặc không truy cập được, thì đó là nguyên nhân gây ra lỗi này. Ví dụ: chính sách Lời gọi dịch vụ sau đây chỉ định một <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ức http://, nhưng không có tên máy chủ hợp lệ; do đó, chính sách Chú thích dịch vụ 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ó một URL hợp lệ với tên máy chủ có thể truy cập.

Để sửa chính sách Chú thích về 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ề một phản hồi lỗi 4XX hoặc 5XX.

Chẩn đoán

  1. Xác định chính sách Chú thích về dịch vụ gây ra lỗi. Tên chính sách xuất hiện trong phần tử faultstring của phản hồi lỗi. Ví dụ: trong faultstring sau đây, tên của chính sách Lệnh gọi dịch vụ không thành công là ExecuteGeocodingRequest.

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]

  2. 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ê trong Reason hay không. Ví dụ: faultstring sau đây cho biết rõ rằng mã phản hồi 502 được trả về từ máy chủ phụ trợ:

    "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ư cách bạn khắc phục mọi lỗi 4XX hoặc 5XX. Hãy tham khảo Sổ tay về lỗi thời gian chạy (4XX/5XX) để biết hướng dẫn về cách khắc phục sự cố và giải quyết lỗi 4XX hoặc 5XX.