JavaScript politikası

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

Ne?

Bu politika, bir API proxy akışı bağlamında yürütülen özel JavaScript kodu eklemenize olanak tanır. Özel JavaScript kodunuzda, Apigee Edge JavaScript nesne modelinin nesnelerini, yöntemlerini ve özelliklerini kullanabilirsiniz. Nesne modeli, proxy akışı bağlamındaki değişkenleri almanıza, ayarlamanıza ve kaldırmanıza olanak tanır. Nesne modeliyle sağlanan temel şifreleme işlevlerini de kullanabilirsiniz.

Hakkında

JavaScript politikası için birçok kullanım alanı vardır. Örneğin, akış değişkenlerini alıp ayarlayabilir, özel mantık yürütebilir ve hata işleme gerçekleştirebilir, isteklerden veya yanıtlardan veri ayıklayabilir, arka uç hedef URL'sini dinamik olarak düzenleyebilir ve daha birçok işlem yapabilirsiniz. Bu politika, diğer standart Edge politikaları kapsamında olmayan özel davranışlar uygulamanıza olanak tanır. Hatta AssignMessage ve ExtractVariable gibi diğer politikalar tarafından uygulanan davranışların birçoğunu elde etmek için JavaScript politikası kullanabilirsiniz.

JavaScript politikası için önermediğimiz bir kullanım alanı günlük kaydıdır. Mesaj Günlüğü politikası, Splunk, Sumo ve Loggly gibi üçüncü taraf günlük platformlarına günlük kaydetmek için çok daha uygundur. Ayrıca, yanıt istemciye geri gönderildikten sonra yürütülen PostClientFlow'da Mesaj Günlüğü politikasını yürüterek API proxy performansını artırırsınız.

JavaScript politikası, yürütülecek bir JavaScript kaynak dosyası belirtmenize olanak tanır. Alternatif olarak, <Source> öğesiyle JavaScript kodunu doğrudan politikanın yapılandırmasına ekleyebilirsiniz. Her iki durumda da, JavaScript kodu, politikanın eklendiği adım yürütüldüğünde çalıştırılır. Kaynak dosya seçeneğinde, kaynak kodu her zaman proxy paketindeki standart bir konumda (apiproxy/resources/jsc) saklanır. Alternatif olarak, kaynak kodunu ortam veya kuruluş düzeyinde bir kaynak dosyasında da saklayabilirsiniz. Talimatlar için Kaynak dosyaları başlıklı makaleyi inceleyin. JavaScript'inizi Apigee kullanıcı arayüzü proxy düzenleyicisi üzerinden de yükleyebilirsiniz.

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

JavaScript'in şu anda desteklenen sürümü için Desteklenen yazılımlar ve desteklenen sürümler başlıklı makaleyi inceleyin.

Video

JavaScript politikasını kullanarak özel politika uzantısı oluşturmayı öğrenmek için kısa bir video izleyin.

Örnekler

Hedef URL'yi yeniden yazma

Yaygın bir kullanım alanı şöyledir: İstek gövdesinden veri ayıklama, bu verileri bir akış değişkeninde depolama ve bu akış değişkenini proxy akışının başka bir yerinde kullanma. Kullanıcının adını bir HTML formuna girip gönderdiği bir uygulamanız olduğunu varsayalım. API proxy'sinin, form verilerini ayıklamasını ve arka uç hizmetini çağırmak için kullanılan URL'ye dinamik olarak eklemesini istiyorsunuz. Bunu bir JavaScript politikasında nasıl yaparsınız?

Not: Bu örneği denemek istiyorsanız proxy düzenleyicide yeni bir proxy oluşturduğunuzu varsayıyoruz. Oluştururken arka uç hizmeti URL'si olarak şunu girmeniz yeterlidir: http://www.example.com. Bu örnekte, arka uç URL'sini dinamik olarak yeniden yazacağız. Yeni bir proxy oluşturmayı bilmiyorsanız başlangıç eğitimine bakın. .

  1. Edge kullanıcı arayüzünde, proxy düzenleyicide oluşturduğunuz proxy'yi açın.
  2. Geliştir 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 gibi bir ad verin.
  5. Aşağıdaki kodu kod düzenleyiciye yapıştırın ve proxy'yi kaydedin. Dikkat edilmesi gereken önemli nokta context nesnesidir. Bu nesne, proxy akışındaki herhangi bir JavaScript kodu için kullanılabilir. Akışa özgü sabitleri almak, faydalı get/set yöntemlerini çağırmak ve daha fazla işlem için kullanılır. Bu nesne bölümü, Edge'in JavaScript nesne modeline aittir. Ayrıca, target.url akış değişkeninin, hedef istek akışında erişilebilen yerleşik bir okuma/yazma değişkeni olduğunu unutmayın. Bu değişkeni API URL'siyle ayarladığımızda Edge, arka uç çağrısını bu URL'ye yapar. Temel olarak, orijinal hedef URL'yi yeniden yazdık.Bu URL, proxy'yi oluştururken belirttiğiniz URL'dir (ör. http://www.example.com).

    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 edin ve politikayı kaydedin.
  8. Gezgin'de Proxy Endpoint Preflow'u seçerseniz politikanın bu akışa eklendiğini görürsünüz.
  9. Gezgin'de Target Endpoint PreFlow simgesini seçin.
  10. Gezgin'den JavaScript politikasını akış düzenleyicideki Hedef Uç Nokta'nın İstek tarafına sürükleyin.
  11. Kaydet'i tıklayın.
  12. API'yi aşağıdaki gibi çağırın. Doğru kuruluş adınızı ve proxy adınızı uygun şekilde değiştirin:
curl -i -H 'Content-Type: application/x-www-form-urlencoded' -X POST -d 'user=Will' http://myorg-test.apigee.net/js-example

Son olarak, bu örnekte kullanılan JavaScript politikası için XML tanımına göz atalım. Burada dikkat edilmesi gereken nokta, <ResourceURL> öğesinin, yürütülecek JavaScript kaynak dosyasını belirtmek için kullanılmasıdır. Aynı kalıp, tüm JavaScript kaynak dosyaları için kullanılır: jsc://filename.js. JavaScript kodunuzun include'lar gerektirmesi durumunda, bu referansın ilerleyen bölümlerinde açıklandığı gibi bunu 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ğeri alma

Yapılandırmaya bir <Property> öğesi ekleyebilir, ardından öğenin değerini çalışma zamanında JavaScript ile alabilirsiniz.

JavaScript kodundan özelliğe erişmek için kullanılacak adı belirtmek üzere öğenin name özelliğini kullanın. <Property> öğesinin değeri (açılış ve kapanış etiketleri arasındaki değer), JavaScript tarafından alınacak gerçek değerdir.

JavaScript'te politika özelliği değerini, aşağıdaki örnekte olduğu gibi Properties nesnesinin bir özelliği olarak erişerek alırsınız:

  • 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>
  • Özelliği JavaScript ile alın. Burada, alınan değer (bir değişken adı) daha sonra 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

JavaScript çağrısında kullanabileceğiniz hata işleme teknikleriyle ilgili örnekler ve tartışma için Apigee Topluluğu'ndaki bu gönderiye bakın. Apigee Topluluğu'nda sunulan öneriler yalnızca bilgi amaçlıdır ve Apigee'nin önerdiği en iyi uygulamaları temsil etmeyebilir.


Öğ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>

<Javascript> Özellikleri

<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 yürütülmesine izin verilen maksimum süreyi (milisaniye cinsinden) belirtir. Örneğin, 200 ms 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ında yürütme süresi 200 ms ile sınırlıdır.

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

<IncludeURL> öğesi

<ResourceURL> veya <Source> öğesiyle belirtilen ana JavaScript dosyasına bağımlılık olarak yüklenecek bir JavaScript kitaplığı dosyasını belirtir. Komut dosyaları, politikada listelendikleri sırayla değerlendirilir. Kodunuz, JavaScript nesne modelinin nesnelerini, yöntemlerini ve özelliklerini kullanabilir.

Ek <IncludeURL> öğeleriyle birden fazla JavaScript bağımlılığı kaynağı ekleyin.

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

Örnek

Örnekler bölümündeki Temel Örnek'e bakın.

<Property> öğesi

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

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

Özellikler

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

Tesisin adını belirtir.

Yok Zorunlu.

Örnek

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

<ResourceURL> öğesi

API akışında yürütülecek ana JavaScript dosyasını belirtir. Bu dosyayı, Kaynak dosyaları bölümünde açıklandığı gibi, API proxy paketi içindeki /apiproxy/resources/jsc altında veya API proxy düzenleyicisinin Gezgin bölmesindeki Komut Dosyaları bölümünde API proxy kapsamına ya da birden fazla API proxy'sinde yeniden kullanılmak üzere kuruluş veya ortam kapsamlarına kaydedebilirsiniz. Kodunuz JavaScript nesne modelinin nesnelerini, yöntemlerini ve özelliklerini kullanabilir.

<ResourceURL>jsc://my-javascript.js</ResourceURL>
Varsayılan: Yok
Mevcut olma: <ResourceURL> veya <Source> gereklidir. Hem <ResourceURL> hem de <Source> varsa <ResourceURL> yoksayılır.
Tür: Dize

Örnek

Örnekler bölümündeki Temel Örnek'e bakın.

<Source> öğesi

JavaScript'i doğrudan politikanın XML yapılandırmasına eklemenize olanak tanır. Eklenen JavaScript kodu, politika API akışında yürütüldüğünde çalışır.

Varsayılan: Yok
Mevcut olma: <ResourceURL> veya <Source> gereklidir. Hem <ResourceURL> hem de <Source> varsa <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>

<SSLInfo> öğesi

JavaScript politikası tarafından oluşturulan tüm HTTP istemci örnekleri için TLS'yi yapılandırmak üzere kullanılan özellikleri belirtir.

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

Bir HTTP istemcisi için TLS'yi yapılandırma süreci, bir TargetEndpoint/TargetServer için TLS'yi yapılandırmak üzere kullandığınız süreçle aynıdır. Daha fazla bilgi için TLS'yi Edge'den arka uca yapılandırma başlıklı makaleyi inceleyin.

Kullanım notları

JavaScript politikası gerçek kod içermez. Bunun yerine, JavaScript politikası bir JavaScript "kaynağına" referans verir ve JavaScript'in yürütüldüğü API akışındaki adımı tanımlar. Komut dosyanızı yönetim kullanıcı arayüzü proxy düzenleyicisi üzerinden yükleyebilir veya yerel olarak geliştirdiğiniz API proxy'lerindeki /resources/jsc dizinine ekleyebilirsiniz.

JavaScript politika kodunda hata ayıklama

Hata ayıklama bilgilerini İzleme Aracı'ndaki işlem çıkışı paneline aktarmak için print() işlevini kullanın. Ayrıntılar ve örnekler için JavaScript print() ifadeleriyle hata ayıklama konusuna bakın.

Trace'te yazdırma ifadelerini görüntülemek için:

  1. İzleme aracını açın ve JavaScript politikanızı içeren bir proxy için izleme oturumu başlatın.
  2. Proxy'yi arayın.
  3. İzleme aracında, çıkış panelini açmak için Tüm İşlemlerden Çıkış'ı tıklayın.

  4. Yazdırma ifadeleriniz bu panelde görünür.

Hata ayıklama bilgilerini İzleme aracına aktarmak için print() işlevini kullanabilirsiniz. Bu işlev doğrudan JavaScript nesne modeli üzerinden kullanılabilir. Ayrıntılı bilgi için "print() ifadeleriyle JavaScript'te hata ayıklama" başlıklı makaleyi inceleyin.

Akış değişkenleri

Bu politika, varsayılan olarak herhangi bir değişkeni doldurmaz. Ancak bağlam nesnesinde yöntemleri çağırarak JavaScript kodunuzda akış değişkenlerini ayarlayabilir (ve alabilirsiniz). Tipik bir desen şu şekilde 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ı (.xsd) ile tanımlanır. Referans olarak politika şemaları GitHub'da mevcuttur.

İlgili konular

Apigee Topluluğu makaleleri

İlgili makaleleri Apigee Topluluğu'nda bulabilirsiniz: