Hizmet Açıklama Metni çalışma zamanı hatasını giderme

Apigee Edge belgelerini görüntülüyorsunuz.
Apigee X belgelerine gidin.
bilgi

RequestVariableNotMessageType

Hata kodu

steps.servicecallout.RequestVariableNotMessageType

Hata yanıtı gövdesi

{
    "fault": {
        "faultstring": "ServiceCallout[policy_name]: request variable [variable_name] value is not of type Message",
        "detail": {
            "errorcode": "steps.servicecallout.RequestVariableNotMessageType"
        }
    }
}

Neden

Bu hata, Hizmet Açıklama Metni politikasının <Request> öğesinde belirtilen bir değişken mesaj türünde değilse ortaya çıkar. Değişken bir dizeyse veya mesaj olmayan başka bir türdeyse bu hatayı görürsünüz.

Mesaj türü değişkenleri, HTTP isteklerinin ve yanıtlarının tamamını temsil eder. Yerleşik Edge akış değişkenleri request, response ve message mesaj türündedir. Mesaj değişkenleri hakkında daha fazla bilgi edinmek için Değişkenler referansı başlıklı makaleyi inceleyin.

Teşhis

  1. Hatanın oluştuğu Hizmet Çağrısı politikasını ve türü yanlış olan değişkenin adını tanımlayın. Bu öğelerin ikisini de hata yanıtının faultstring öğesinde bulabilirsiniz. Örneğin, aşağıdaki faultstring politikasında politika adı ExecuteGeocodingRequest, değişken ise PostalCode'dir:

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]: request variable PostalCode value is not of type Message"

  2. Başarısız olan hizmet açıklama metni politikası XML'inde, <Request> öğesinde ayarlanan değişken adının, hata dizesinde (yukarıdaki 1. adım) tanımlanan değişken adıyla eşleştiğini doğrulayın. Örneğin, aşağıdaki politika, faultstring öğesinde bulunan PostalCode adlı bir istek değişkeni belirtiyor:

    <?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. Bu değişkenin mesaj türünde olup olmadığını belirleyin:

    1. Değişkenin ilk olarak tanımlandığı API Proxy paketinde kodu bulun.
    2. Çoğu durumda, sorun değişkeninin, Hizmet Çağrısı politikasından önce yürütülen başka bir politikada oluşturulduğunu ve doldurulduğunu fark edebilirsiniz. Örneğin, Mesaj Ata politikası, API proxy akışındaki değişkenleri oluşturmak ve doldurmak için yaygın olarak kullanılır.
    3. Öncelikle değişkenin tanımlandığı ve doldurulduğu politikayı belirledikten sonra, bu değişkenin türünü aşağıdaki şekilde belirlemeniz gerekir:
      • Varsa type özelliğinin değerini kontrol edin.
      • type özelliği yoksa değişken bir dize olarak kabul edilir.
    4. Değişkenin türü "mesaj" değilse (dize gibi) hatanın nedeni budur. Sık kullanılan değişkenler ve türleri hakkında daha fazla bilgiyi Değişkenler referansında bulabilirsiniz.

Örnek olarak, Hizmet Açıklama Metni politikasında başvurulan PostalCode değişkeninin aşağıdaki Mesaj Ata politikasında oluşturulduğunu varsayalım. PostalCode öğesine request.queryparam.postalcode akış değişkeninin değerinin atandığını unutmayın. Değişken atamasında type özelliği bulunmadığından bu değer bir dizedir.

<?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>

Şimdi, Hizmet Açıklama Metni politikasının <Request> öğesinde PostalCode değişkeninin kullanıldığını unutmayın:

<?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, mesaj türünde olmadığından (bu örnekte bir dizedir) şu hata kodunu alıyorsunuz: steps.servicecallout.RequestVariableNotMessageType.

Çözünürlük

Başarısız Hizmet Açıklama Metni politikasındaki <Request> öğesinde ayarlanan değişkenin mevcut bir mesaj türü akış değişkeni olduğundan emin olun. Alternatif olarak, doğrudan Hizmet Açıklama Metni politikasında yeni bir mesaj türü değişkeni oluşturup (politika dokümanlarında açıklandığı gibi) bu değişkeni kullanabilirsiniz.

Politikayı düzeltmek için <Request> öğesini mesaj türünde mevcut veya yeni bir değişkeni belirtecek şekilde değiştirmeniz gerekir. Örneğin, Mesaj Ata politikasında ayarlanan GeocodingRequest değişkeni mesaj türündedir ve hizmet açıklama metni politikasında sorunsuz şekilde çalışır. Örneğin:

<?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

Hata kodu

steps.servicecallout.RequestVariableNotRequestMessageType

Hata yanıtı gövdesi

{
    "fault": {
        "faultstring": "ServiceCallout[policy_name]: request variable [variable_name] value is not of type Request Message",
        "detail": {
            "errorcode": "steps.servicecallout.RequestVariableNotRequestMessageType"
        }
    }
}

Neden

Bu hata, Hizmet Açıklama Metni politikasının <Request> öğesinde belirtilen bir değişken istek mesajı türünde değilse ortaya çıkar. Değişken bir yanıt mesajı türü, dize veya başka bir türse bu hatayı görürsünüz.

Mesaj türü değişkenleri, HTTP isteklerinin ve yanıtlarının tamamını temsil eder. Yerleşik Edge akış değişkenleri request, response ve message mesaj türündedir. Mesaj değişkenleri hakkında daha fazla bilgi edinmek için Değişkenler referansı başlıklı makaleyi inceleyin.

Teşhis

  1. Hatanın oluştuğu Hizmet Çağrısı politikasını ve türü yanlış olan değişkenin adını tanımlayın. Bu öğelerin ikisini de hata yanıtının faultstring öğesinde bulabilirsiniz. Örneğin, aşağıdaki faultstring politikasında politika adı ExecuteGeocodingRequest, değişken ise var_response'dir:

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]: request variable var_response value is not of type Message"

  2. Başarısız olan hizmet açıklama metni politikası XML'inde, <Request> öğesinde ayarlanan değişken adının, hata dizesinde (yukarıdaki 1. adım) tanımlanan değişken adıyla eşleştiğini doğrulayın. Örneğin, aşağıdaki politika, faultstring öğesinde bulunan var_response adlı bir istek değişkeni belirtiyor:

    <?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. Değişkenin istek mesajı türünde olup olmadığını belirleyin:

    1. Değişkenin ilk olarak tanımlandığı API Proxy paketinde kodu bulun.
    2. Çoğu durumda, sorun değişkeninin, Hizmet Çağrısı politikasından önce yürütülen başka bir politikada oluşturulduğunu ve doldurulduğunu fark edebilirsiniz. Örneğin, Mesaj Ata politikası, API proxy akışındaki değişkenleri oluşturmak ve doldurmak için yaygın olarak kullanılır.
    3. Öncelikle değişkenin tanımlandığı ve doldurulduğu politikayı belirledikten sonra, bu değişkenin türünü aşağıdaki şekilde belirlemeniz gerekir:
      • Varsa type özelliğinin değerini kontrol edin.
      • type özelliği yoksa değişken bir dize olarak kabul edilir.
    4. Değişkenin türü istek mesajı türünde değilse hatanın nedeni budur. Sık kullanılan değişkenler ve türleri hakkında daha fazla bilgiyi Değişkenler referansında bulabilirsiniz.

Örnek olarak, Hizmet Açıklama Metni politikasında başvurulan var_response değişkeninin aşağıdaki Mesaj Ata politikasında oluşturulduğunu varsayalım. var_response öğesine response türünün verildiğini unutmayın. Bu nedenle, var_response değişkeninin türü yanıt mesajıdır.

<?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>

var_response değişkeninin, Hizmet Açıklama Metni politikasının <Request> öğesinde kullanıldığını unutmayın.

<?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, istek mesajı türünde olmadığından (türü yanıt mesajıdır) şu hata kodunu alıyorsunuz: steps.servicecallout.RequestVariableNotRequestMessageType.

Çözünürlük

Başarısız Hizmet Açıklama Metni politikasındaki <Request> öğesinde ayarlanan değişkenin mevcut bir istek mesajı türü değişken olduğundan emin olun veya alternatif olarak, doğrudan Hizmet Açıklama Metni politikasında (politika dokümanlarında açıklandığı gibi) yeni bir istek mesajı türü değişkeni oluşturup kullanabilirsiniz.

Politikayı düzeltmek için <Request> öğesini istek mesajı türünde mevcut veya yeni bir değişken belirtecek şekilde değiştirmeniz gerekir. Bu öğe, hizmet açıklama metni politikasında çalışacaktır. Örneğin:

<?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

Hata kodu

steps.servicecallout.ExecutionFailed

Hata yanıtı gövdesi

{
    "fault": {
        "faultstring": "Execution of ServiceCallout [policy_name] failed. Reason: Host not reachable",
        "detail": {
            "errorcode": "steps.servicecallout.ExecutionFailed"
        }
    }
}

veya

{
    "fault": {
        "faultstring": "Execution of ServiceCallout [policy_name] failed. Reason: ResponseCode [http_code] is treated as error",
        "detail": {
            "errorcode": "steps.servicecallout.ExecutionFailed"
        }
    }
}

Olası nedenler

Bu hatanın olası nedenleri şunlardır:

Neden Açıklama
Geçersiz veya bozuk URL Hizmet Açıklama Metni politikasındaki hedef URL hatalı biçimlendirilmiş veya geçersiz ya da erişilemez bir ana makine adına sahip.
Arka uç sunucusu hatası Arka uç sunucusu 4XX veya 5XX hata yanıtı döndürüyor.

Neden: Geçersiz veya bozuk URL

Hizmet Açıklama Metni politikasındaki hedef URL hatalı biçimlendirilmiş veya geçersiz ya da erişilemez bir ana makine adına sahip.

Teşhis

  1. Hataya neden olan Hizmet Çağrısı politikasını tanımlayın. Politika adı, hata yanıtının faultstring öğesinde görünür. Örneğin, aşağıdaki faultstring içinde başarısız olan hizmet açıklama metni politikasının adı ExecuteGeocodingRequest şeklindedir.

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]"

  2. Başarısız Hizmet Açıklama Metni politikasında <URL> öğesini inceleyin. Söz konusu dosya yanlış biçimlendirilmişse veya geçersiz ya da erişilemez bir ana makine adına sahipse, bu hatanın nedeni budur. Örneğin, aşağıdaki hizmet açıklama metni politikası geçersiz bir <URL> belirtiyor:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <ServiceCallout name="ExecuteGeocodingRequest">
        <Request variable="GeocodingRequest"/>
        <Response>GeocodingResponse</Response>
        <HTTPTargetConnection>
            <URL>http://</URL>
        </HTTPTargetConnection>
    </ServiceCallout>
    

    <URL> öğesi yalnızca http:// protokolünü içerir, ancak geçerli bir ana makine adına sahip değildir. Bu nedenle, Hizmet Açıklama Metni politikası şu hatayı vererek başarısız olur: Execution of ServiceCallout ExecuteGeocodingRequest failed. Reason: Host not reachable.

Çözünürlük

Başarısız Hizmet Açıklama Metni politikasındaki <URL> öğesinin, ulaşılabilir ana makine adına sahip geçerli bir URL'ye sahip olduğundan emin olun.

Yukarıda gösterilen Hizmet Açıklama Metni politikasını düzeltmek için <URL> öğesini, geçerli bir URL belirtecek şekilde değiştirebilirsiniz:

<?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>

Neden: Arka uç sunucusu hatası

Arka uç sunucusu 4XX veya 5XX hata yanıtı döndürüyor.

Teşhis

  1. Hataya neden olan Hizmet Çağrısı politikasını tanımlayın. Politika adı, hata yanıtının faultstring öğesinde görünür. Örneğin, aşağıdaki faultstring içinde başarısız olan hizmet açıklama metni politikasının adı ExecuteGeocodingRequest şeklindedir.

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]

  2. Hata yanıtı gövdesindeki faultstring öğesini inceleyin ve Reason içinde herhangi bir 4XX veya 5XX yanıt kodu olup olmadığını kontrol edin. Örneğin, aşağıdaki hata dizesi, arka uç sunucusundan 502 yanıt kodunun döndürüldüğünü açıkça belirtir:

    "faultstring": "Execution of ServiceCallout ExecuteGeocodingRequest failed. Reason: ResponseCode 502 is treated as error"

Çözünürlük

Hata yanıt kodunu belirledikten sonra, bu sorunu 4XX veya 5XX hatalarında olduğu gibi giderebilirsiniz. 4XX veya 5XX hatalarını giderme ve çözümleme talimatları için Çalışma zamanı hatası (4XX/5XX) başucu kitaplarına bakın.