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ı

This section describes the fault codes and error messages that are returned and fault variables that are set by Edge when this policy triggers an error. This information is important to know if you are developing fault rules to handle faults. To learn more, see What you need to know about policy errors and Handling faults.

Runtime errors

These errors can occur when the policy executes.

Fault code HTTP status Cause Fix
steps.javascript.ScriptExecutionFailed 500 The JavaScript policy can throw many different types of ScriptExecutionFailed errors. Commonly seen types of errors include RangeError, ReferenceError, SyntaxError, TypeError, and URIError.
steps.javascript.ScriptExecutionFailedLineNumber 500 An error occurred in the JavaScript code. See the fault string for details. N/A
steps.javascript.ScriptSecurityError 500 A security error occurred when the JavaScript executed. See the fault string for details. N/A

Deployment errors

These errors can occur when you deploy a proxy containing this policy.

Error name Cause Fix
InvalidResourceUrlFormat If the format of the resource URL specified within the <ResourceURL> or the <IncludeURL> element of the JavaScript policy is invalid, then the deployment of the API proxy fails.
InvalidResourceUrlReference If the <ResourceURL> or the <IncludeURL> elements refer to a JavaScript file that does not exist, then the deployment of the API proxy fails. The referenced source file must exist either the API proxy, environment, or organization level.
WrongResourceType This error occurs during deployment if the <ResourceURL> or the <IncludeURL> elements of the JavaScript policy refer to any resource type other than jsc (JavaScript file).
NoResourceURLOrSource The deployment of the JavaScript policy can fail with this error if the <ResourceURL> element is not declared or if the resource URL is not defined within this element. <ResourceURL> element is a mandatory element. Or, The <IncludeURL> element is declared but the resource URL is not defined within this element. The <IncludeURL> element is optional but if declared, the resource URL must be specified within the <IncludeURL> element.

Fault variables

These variables are set when this policy triggers an error at runtime. For more information, see What you need to know about policy errors.

Variables Where Example
fault.name="fault_name" fault_name is the name of the fault, as listed in the Runtime errors table above. The fault name is the last part of the fault code. fault.name Matches "ScriptExecutionFailed"
javascript.policy_name.failed policy_name is the user-specified name of the policy that threw the fault. javascript.JavaScript-1.failed = true

Example error response

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

Example fault rule

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