JavaScript politikası

Apigee Edge belgelerini görüntülüyorsunuz.
. Git: Apigee X belgeleri.
bilgi

Ne?

Bu politika, bir API bağlamında yürütülen özel JavaScript kodu eklemenize olanak tanır akış şeklinde ifade edilir. Özel JavaScript kodunuzda Apigee Edge JavaScript nesne modeli. Nesne modeli, nesnel modelle ilgili nesnel değişkenlerini ifade eder. Siz da nesne modeliyle sağlanan temel şifreleme işlevlerini de kullanabilir.

Hakkında

JavaScript politikasının pek çok kullanım alanı vardır. Örneğin, zaman çizelgesiyle ilgili bilgileri özel mantık yürütme, hata işleme, isteklerden verileri ayıklama ve yanıt verebilir, arka uç hedef URL'sini dinamik olarak düzenleyebilir ve çok daha fazlasını yapabilirsiniz. Bu politika şunları yapmanıza olanak tanır: diğer standart Edge politikaları kapsamında olmayan özel davranışlar uygulayabilirsiniz. Aslında Diğer politikalar tarafından uygulanan davranışların birçoğunu elde etmek için bir JavaScript politikası kullanabilir. özel bir kod oluşturun.

JavaScript politikasının günlüğe kaydedilmesi için önermediğimiz bir kullanım alanıdır. Message Logging politikası ve Splunk, Sumo ve Loggly gibi üçüncü taraf günlük kaydı platformlarına daha uygundur. PostClientFlow'da Message Logging politikasını çalıştırarak API proxy'sinin performansını iyileştirebilirsiniz yanıt, istemciye geri gönderildikten sonra yürütülür.

JavaScript politikası, yürütülecek bir JavaScript kaynak dosyası veya JavaScript kodunu, <Source> ile doğrudan politikanın yapılandırmasına ekleyebilirsiniz. öğesine dokunun. Her iki durumda da JavaScript kodu, politikanın eklendiği adım yürütüldüğünde yürütülür. Kaynak dosya seçeneğinde, kaynak kodu her zaman proxy paketindeki standart konum: apiproxy/resources/jsc. İsterseniz kaynak kodunu ortam veya kuruluş düzeyinde bir kaynak dosyasında depolamanız gerekir. Örneğin, Kaynak dosyaları başlıklı makaleyi inceleyin. Şunları yapabilirsiniz: JavaScript'inizi Apigee kullanıcı arayüzü proxy düzenleyicisi aracılığıyla da yükleyebilirsiniz.

JavaScript kaynak dosyalarının her zaman .js uzantısı olmalıdır.

Desteklenen yazılımlar ve desteklenen sürümler başlıklı makaleyi inceleyin. sürümünü kullanın.

Video

JavaScript kullanarak özel politika uzantılarının nasıl oluşturulacağını öğrenmek için kısa bir video izleyin politikası.

Örnekler

Hedef URL'yi yeniden yaz

Yaygın bir kullanım alanı şu şekildedir: istek gövdesinden veri ayıklama veya verileri bir akışta depolama ve bu akış değişkenini proxy akışının başka bir yerinde kullanarak yapabilirsiniz. Diyelim ki bir uygulama Kullanıcı, adını bir HTML formuna girer ve gönderir. API proxy'sinin şunları yapmasını istiyorsunuz: Form verilerini ayıklamak ve arka uç hizmetini çağırmak için kullanılan URL'ye dinamik olarak eklemek. Nasıl? Bunu bir JavsScript politikasında yaparsınız?

Not: Bu örneği denemek isterseniz yeni bir örnek oluşturduğunuzu varsayıyoruz. proxy'si üzerinden kontrol edebilirsiniz. Bu dosyayı oluştururken, arka uç hizmeti URL'sini şu şekilde verin: http://www.example.com. Bu örnekte, arka uç URL'sini dinamik olarak yeniden yazacağız. Yeni bir proxy'nin nasıl oluşturulacağını bilmiyorsanız başlangıç eğiticisine bakın. .

  1. Edge kullanıcı arayüzünde, proxy düzenleyicisinde oluşturduğunuz proxy'yi açın.
  2. Geliştirme sekmesini seçin.
  3. Yeni menüsünden Yeni Komut Dosyası'nı seçin.
  4. İletişim kutusunda JavaScript'i seçin ve komut dosyasına js-example
  5. Aşağıdaki kodu kod düzenleyiciye yapıştırın ve proxy'yi kaydedin. Önemli olan bildirim, context nesnesidir. Bu nesne, JavaScript kodu tarafından kullanılabilir proxy akışının herhangi bir yerinde olur. Akışa özgü sabit değerler elde etmek, yararlı alma/ayarlama yöntemlerini ve daha fazla işlem için. Bu nesne bölümü, Edge'in JavaScript nesne modeli. Not, target.url akış değişkeninin yerleşik bir okuma/yazma değişkeni olduğunu da Hedef İstek akışında erişilebilir. Bu değişkeni API URL'sine aldığımızda Edge bu URL'ye arka uç çağrısı yapar. Esasen, orijinal hedef URL'yi yeniden yazdık. Bu, proxy'yi oluştururken belirttiğiniz değerdi (ör. http://www.example.com) için geçerli olur.

    if (context.flow=="PROXY_REQ_FLOW") {
         var username = context.getVariable("request.formparam.user");
         context.setVariable("info.username", username);
    }
    
    
    if (context.flow=="TARGET_REQ_FLOW") {
         context.setVariable("request.verb", "GET");
         var name = context.getVariable("info.username");
         var url = "http://mocktarget.apigee.net/"
         context.setVariable("target.url", url + "?user=" + name);
    }
    
  6. Yeni Politika menüsünden JavaScript'i seçin.
  7. Politikaya target-rewrite gibi bir ad verin. Varsayılanları kabul et ve kaydet politika.
  8. Gezinme Aracı'nda Proxy Uç Noktası Ön Akışı'nı seçerseniz politikanın bu akışa eklenmiştir.
  9. Gezgin'de Target Endpoint PreFlow simgesini seçin.
  10. Gezgin'de, JavaScript politikasını Hedef'in İstek tarafına sürükleyin Akış düzenleyicideki uç nokta.
  11. Kaydet'i tıklayın.
  12. API'yi bu şekilde çağırarak kuruluş adınızı ve proxy adınızı doğru uygun:
curl -i -H 'Content-Type: application/x-www-form-urlencoded' -X POST -d 'user=Will' http://myorg-test.apigee.net/js-example

Son olarak, Google Etiket Yöneticisi'nde kullanılan JavaScript politikasının XML tanımına açıklayacağım. Önemli bir nokta, <ResourceURL> öğesi, yürütülecek JavaScript kaynak dosyasını belirtmek için kullanılır. Aynı desen kullanıldı herhangi bir JavaScript kaynak dosyası için: jsc://filename.js. JavaScript kodunuz ise içerirse şunu yapmak için bir veya daha fazla <IncludeURL> öğesi kullanabilirsiniz: .

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Javascript async="false" continueOnError="false" enabled="true" timeLimit="200" name="target-rewrite">
    <DisplayName>target-rewrite</DisplayName>
    <Properties/>
    <ResourceURL>jsc://js-example.js</ResourceURL>
</Javascript>

JavaScript'ten özellik değerini al

Yapılandırmada bir <Property> öğesi ekleyebilir, ardından öğesinin değerini JavaScript ile değiştirebilirsiniz.

Öğeye erişmek istediğiniz adı belirtmek için öğenin name özelliğini kullanın. özelliğini etkinleştirin. <Property> öğesinin değeri ( açılış ve kapanış etiketleri arasında), JavaScript'e dokunun.

JavaScript'te, politika özelliğinin değerini almak için Properties nesnesini tanımlayın:

  • Mülkü yapılandırın. Burada, özellik değeri değişken adıdır. response.status.code
    <Javascript async="false" continueOnError="false" enabled="true" timeLimit="200" name="JavascriptURLRewrite">
        <DisplayName>JavascriptURLRewrite</DisplayName>
        <Properties>
            <Property name="source">response.status.code</Property>
        </Properties>
        <ResourceURL>jsc://JavascriptURLRewrite.js</ResourceURL>
    </Javascript>
    
  • JavaScript ile mülkü alın. Burada, alınan değer (değişken adı) değeri, getVariable işlevi tarafından değişkenin değerini almak için kullanılır.
    var responseCode = properties.source; // Returns "response.status.code"
    var value = context.getVariable(responseCode); // Get the value of response.status.code
    context.setVariable("response.header.x-target-response-code", value);
    

Hataları işleme

Başarılı bir çalıştırmada kullanabileceğiniz hata giderme tekniklerine ilişkin örnekler JavaScript açıklama metni, bkz. bu yayını Apigee Topluluğu'nda bulabilirsiniz. Apigee Topluluğu'nda sunulan öneriler şunlar içindir: ve Apigee tarafından önerilen en iyi uygulamaları yansıtmayabilir.


Öğe referansı

Öğe referansı, JavaScript politikasının öğelerini ve özelliklerini açıklar.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Javascript async="false" 
        continueOnError="false" enabled="true" timeLimit="200" 
        name="JavaScript-1">
    <DisplayName>JavaScript 1</DisplayName>
    <Properties>
        <Property name="propName">propertyValue</Property>
    </Properties>
    <SSLInfo>
        <Enabled>trueFalse</Enabled>
        <ClientAuthEnabled>trueFalse</ClientAuthEnabled>
        <KeyStore>ref://keystoreRef</KeyStore>
        <KeyAlias>keyAlias</KeyAlias>
        <TrustStore>ref://truststoreRef</TrustStore>
    </SSLInfo>
    <IncludeURL>jsc://a-javascript-library-file</IncludeURL>
    <ResourceURL>jsc://my-javascript-source-file</ResourceURL>
    <Source>insert_js_code_here</Source>

</Javascript>

&lt;Javascript&gt; Öznitelikler

<Javascript name="Javascript-1" enabled="true" continueOnError="false" async="false" timeLimit="200">

Aşağıdaki özellikler bu politikaya özeldir.

Özellik Açıklama Varsayılan Varlık
timeLimit

Komut dosyasının erişmesine izin verilen maksimum süreyi (milisaniye cinsinden) belirtir yardımcı olur. Örneğin, 200 ms'lik bir sınır aşılırsa politika şu hatayı verir: Javascript.policy_name failed with error: Javascript runtime exceeded limit of 200ms

Not: Ücretsiz deneme hesapları için yürütme süresi 200 ile sınırlıdır. ms.

Yok Zorunlu

Aşağıdaki tabloda tüm politika üst öğelerinde ortak olan özellikler açıklanmaktadır:

Özellik Açıklama Varsayılan Varlık
name

Politikanın dahili adı. name özelliğinin değeri Harf, sayı, boşluk, kısa çizgi, alt çizgi ve nokta içermelidir. Bu değer, 255 karakteri aşmalıdır.

İsteğe bağlı olarak, politikayı<DisplayName> yönetim arayüzü proxy düzenleyicisinde farklı bir doğal dil adı kullanabilir.

Yok Zorunlu
continueOnError

Bir politika başarısız olduğunda hata döndürmesi için false olarak ayarlayın. Bu beklenen bir durumdur çoğu politika için geçerli olur.

Akış yürütmenin bir politikadan sonra bile devam etmesi için true olarak ayarlayın başarısız olur.

false İsteğe bağlı
enabled

Politikayı uygulamak için true olarak ayarlayın.

Politikayı devre dışı bırakmak için false değerine ayarlayın. Bu politika, bir akışa bağlı kalsa bile uygulanır.

true İsteğe bağlı
async

Bu özelliğin desteği sonlandırıldı.

false Kullanımdan kaldırıldı

&lt;DisplayName&gt; öğe

Politikayı name özelliğine ek olarak farklı bir doğal dil adına sahip yönetim arayüzü proxy düzenleyicisi.

<DisplayName>Policy Display Name</DisplayName>
Varsayılan

Yok

Bu öğeyi çıkarırsanız politikanın name özelliğinin değeri: kullanılır.

Varlık İsteğe bağlı
Tür Dize

&lt;IncludeURL&gt; öğe

Ana JavaScript dosyasına bağımlılık olarak yüklenecek bir JavaScript kitaplık dosyasını belirtir <ResourceURL> veya <Source> öğesiyle belirtilir. Komut dosyaları politikada listelenme sırası. Kodunuz, nesne, yöntemler ve JavaScript nesne modelinin özelliklerini kullanın.

Ek özelliklere sahip birden fazla JavaScript bağımlılık kaynağı dahil <IncludeURL> öğeleri.

<IncludeURL>jsc://my-javascript-dependency.js</IncludeURL>
Varsayılan: Yok
Bulunma: İsteğe bağlı
Tür: Dize

Örnek

Sana Özel bölümündeki Temel Örneği inceleyin.

&lt;Property&gt; öğe

Çalışma zamanında JavaScript kodundan erişebileceğiniz bir özelliği belirtir.

<Properties>
    <Property name="propName">propertyValue</Property>
</Properties>
Varsayılan: Yok
Bulunma: İsteğe bağlı
Tür: Dize

Özellikler

Özellik Açıklama Varsayılan Varlık
ad

Mülkün adını belirtir.

Yok Zorunlu.

Örnek

Sana Özel bölümündeki örneğe bakın.

&lt;ResourceURL&gt; öğe

API akışında yürütülecek ana JavaScript dosyasını belirtir. Bu dosyayı depolayabilirsiniz API proxy kapsamında (API proxy paketinde /apiproxy/resources/jsc altında veya API proxy düzenleyicisinin Gezinme bölmesinin Komut Dosyaları bölümünde) veya kuruluşunuzda ya da ortam kapsamlarının birden çok API proxy'sinde yeniden kullanılabilmesi için Kaynak dosyaları başlıklı makaleye bakın. Kodunuz nesneleri, JavaScript nesne modelinin yöntemlerini ve özelliklerini öğrenin.

<ResourceURL>jsc://my-javascript.js</ResourceURL>
Varsayılan: Yok
Bulunma: <ResourceURL> veya <Source> gereklidir. Eğer Hem <ResourceURL> hem de <Source> mevcut <ResourceURL> yoksayılır.
Tür: Dize

Örnek

Sana Özel bölümündeki Temel Örneği inceleyin.

&lt;Source&gt; öğe

Doğrudan politikanın XML yapılandırmasına JavaScript eklemenize olanak tanır. Eklenen Politika, API akışında yürütüldüğünde JavaScript kodu yürütülür.

Varsayılan: Yok
Bulunma: <ResourceURL> veya <Source> gereklidir. Eğer Hem <ResourceURL> hem de <Source> mevcut <ResourceURL> yoksayılır.
Tür: Dize

Örnek

<Javascript name='JS-ParseJsonHeaderFullString' timeLimit='200' >
  <Properties>
    <Property name='inboundHeaderName'>specialheader</Property>
    <Property name='outboundVariableName'>json_stringified</Property>
  </Properties>
  <Source>
var varname = 'request.header.' + properties.inboundHeaderName + '.values.string';
var h = context.getVariable(varname);
if (h) {
  h = JSON.parse(h);
  h.augmented = (new Date()).valueOf();
  var v = JSON.stringify(h, null, 2) + '\n';
  // further indent
  var r = new RegExp('^(\S*)','mg');
  v= v.replace(r,'    $1');
  context.setVariable(properties.outboundVariableName, v);
}
  </Source>
</Javascript>

&lt;SSLInfo&gt; öğe

JavaScript politikası.

    <SSLInfo>
        <Enabled>trueFalse</Enabled>
        <ClientAuthEnabled>trueFalse</ClientAuthEnabled>
        <KeyStore>ref://keystoreRef</KeyStore>
        <KeyAlias>keyAlias</KeyAlias>
        <TrustStore>ref://truststoreRef</TrustStore>
    </SSLInfo>
Varsayılan: Yok
Bulunma: İsteğe bağlı
Tür: Dize

HTTP istemcisi için TLS'yi yapılandırma işlemi, HTTP istemcilerini yapılandırmak için kullandığınız süreçle aynıdır. TargetEndpoint/TargetServer için TLS. Uçtan arka uca TLS'yi yapılandırma bölümüne bakın konulu videomuzu izleyin.

Kullanım notları

JavaScript politikaları gerçek bir kod içermez. Bunun yerine bir JavaScript politikası, JavaScript "kaynak" ve JavaScript'in yürütüleceği API akışındaki Adımı tanımlar. Şunları yapabilirsiniz: komut dosyanızı Yönetim Arayüzü proxy düzenleyicisi yoluyla yükleyebilir veya Yerel olarak geliştirdiğiniz API proxy'lerindeki /resources/jsc dizini.

JavaScript politika kodunda hata ayıklama

İşleme hata ayıklama bilgilerinin çıkışını almak için print() işlevini kullanın Çıktı panelini kontrol edin. Ayrıntılar ve örnekler için JavaScript ile hata ayıklama bölümüne bakın print() ifadeleri.

Yazdırma özetlerini Trace'te görüntülemek için:

  1. İzleme Aracı'nı açın ve JavaScript'inizi içeren bir proxy için izleme oturumu başlatın politikası.
  2. Proxy'yi çağırın.
  3. İzleme Aracı'nda, çıkışı açmak için Exit from all İşlemler'i tıklayın kontrol edebilirsiniz.

  4. Basılı ekstreleriniz bu panelde görünür.

İzleme aracına hata ayıklama bilgilerinin çıkışını almak için Print() işlevini kullanabilirsiniz. Bu işlev doğrudan JavaScript nesne modeli aracılığıyla uygulanabilir. Ayrıntılar için "Print() ile JavaScript hatalarını ayıklama" bölümüne bakın özetleri".

Akış Değişkenleri

Bu politika varsayılan olarak hiçbir değişkeni doldurmaz; ancak zaman içindeki akışı ayarlayabilir (ve değişkenlerinin JavaScript kodunuzda nasıl genişleyebilir? Tipik bir desen şöyle görünür:

context.setVariable("response.header.X-Apigee-Target", context.getVariable("target.name"))

Bağlam nesnesi, Apigee Edge JavaScript nesne modelinin bir parçasıdır.

Hata referansı

Bu bölümde, döndürülen hata kodları, hata mesajları ve hata değişkenleri açıklanmaktadır. bu politika bir hatayı tetiklediğinde Edge tarafından ayarlanır. Bu bilgi önemlidir hata kuralları geliştiriyorsanız hoşuma gitmesi için bir fırsattır. Daha fazla bilgi için Bilmeniz gerekenler Politika hataları ve Kullanım sorun.

Çalışma zamanı hataları

Bu hatalar, politika yürütüldüğünde ortaya çıkabilir.

Hata kodu HTTP durumu Neden Düzelt
steps.javascript.ScriptExecutionFailed 500 JavaScript politikası, birçok farklı türde ScriptExecutionFailed hatası verebilir. Yaygın RangeError, ReferenceError, SyntaxError, TypeError ve URIError.
steps.javascript.ScriptExecutionFailedLineNumber 500 JavaScript kodunda bir hata oluştu. Ayrıntılar için hata dizesine bakın. Yok
steps.javascript.ScriptSecurityError 500 JavaScript yürütüldüğünde bir güvenlik hatası oluştu. Şu hata dizesine bakın: bolca fırsat sunuyor. Yok

Dağıtım hataları

Bu politikayı içeren bir proxy dağıttığınızda bu hatalar oluşabilir.

Hata adı Neden Düzelt
InvalidResourceUrlFormat JavaScript politikasının <ResourceURL> veya <IncludeURL> öğesi içinde belirtilen kaynak URL'sinin biçimi geçersizse API proxy'sinin dağıtımı başarısız olur.
InvalidResourceUrlReference <ResourceURL> veya <IncludeURL> öğeleri var olmayan bir JavaScript dosyasına başvurursa API proxy'sinin dağıtımı başarısız olur. Başvuruda bulunulan kaynak dosya API proxy'si, ortam veya kuruluş düzeyinde mevcut olmalıdır.
WrongResourceType Bu hata, <ResourceURL> veya <IncludeURL> JavaScript politikası öğeleri, jsc (JavaScript dosyası) dışındaki herhangi bir kaynak türüne başvuruda bulunuyor.
NoResourceURLOrSource <ResourceURL> öğesi tanımlanmazsa veya kaynak URL'si bu öğe içinde tanımlanmamışsa. <ResourceURL> öğesi zorunlu bir öğe. Veya <IncludeURL> öğesi tanımlanmış ancak kaynak URL'si bu öğe içinde tanımlı değil. <IncludeURL> öğesi isteğe bağlıdır Ancak belirtilmişse kaynak URL'si <IncludeURL> öğesi içinde belirtilmelidir.

Hata değişkenleri

Bu değişkenler, politika çalışma zamanında bir hatayı tetiklediğinde ayarlanır. Daha fazla bilgi için Ne, ne ve ne zaman bilmeniz gerekir.

Değişkenler Konum Örnek
fault.name="fault_name" fault_name, yukarıdaki Çalışma zamanı hataları tablosunda listelendiği gibi hatanın adıdır. Hata adı, hata kodunun son kısmıdır. fault.name Matches "ScriptExecutionFailed"
javascript.policy_name.failed policy_name, hataya neden olan politikanın kullanıcı tarafından belirtilen adıdır. javascript.JavaScript-1.failed = true

Örnek hata yanıtı

{
  "fault": {
    "faultstring": "Execution of SetResponse failed with error: Javascript runtime error: "ReferenceError: "status" is not defined. (setresponse.js:6)\"",
    "detail": {
      "errorcode": "steps.javascript.ScriptExecutionFailed"
    }
  }
}

Örnek hata kuralı

<FaultRule name="JavaScript Policy Faults">
    <Step>
        <Name>AM-CustomErrorResponse</Name>
        <Condition>(fault.name Matches "ScriptExecutionFailed") </Condition>
    </Step>
    <Condition>(javascript.JavaScript-1.failed = true) </Condition>
</FaultRule>

Şema

Her politika türü bir XML şemasıyla (.xsd) tanımlanır. Referans olması amacıyla politika şemaları GitHub'da bulabilirsiniz.

İlgili konular

Apigee Topluluğu makaleleri

Bu ilgili makaleleri Apigee'de bulabilirsiniz. Topluluk: