Anda melihat dokumentasi Apigee Edge.
Buka
dokumentasi Apigee X. info
Apa
Kebijakan ini memungkinkan Anda menambahkan kode JavaScript kustom yang dieksekusi dalam konteks alur proxy API. Dalam kode JavaScript kustom, Anda dapat menggunakan objek, metode, dan properti dari Apigee Edge model objek JavaScript. Model objek memungkinkan Anda mendapatkan, menetapkan, dan menghapus variabel dalam konteks alur proxy. Anda juga dapat menggunakan fungsi kriptografi dasar yang disediakan dengan model objek.
Tentang
Ada banyak kasus penggunaan untuk kebijakan JavaScript. Misalnya, Anda dapat mendapatkan dan menetapkan variabel alur, menjalankan logika kustom dan melakukan penanganan gangguan, mengekstrak data dari permintaan atau respons, mengedit URL target backend secara dinamis, dan banyak lagi. Kebijakan ini memungkinkan Anda untuk menerapkan perilaku kustom yang tidak tercakup oleh kebijakan Edge standar lainnya. Faktanya, Anda dapat menggunakan kebijakan JavaScript untuk mencapai banyak perilaku yang sama yang diterapkan oleh kebijakan lain, seperti AssignMessage dan ExtractVariable.
Salah satu kasus penggunaan yang tidak kami rekomendasikan untuk kebijakan JavaScript adalah logging. Kebijakan Message Logging jauh lebih cocok untuk logging ke platform logging pihak ketiga seperti Splunk, Sumo, dan Loggly, dan Anda meningkatkan performa proxy API dengan menjalankan kebijakan Message Logging di PostClientFlow, yang dieksekusi setelah respons dikirim kembali ke klien.
Kebijakan JavaScript memungkinkan Anda menentukan file sumber JavaScript untuk dieksekusi atau
Anda dapat menyertakan kode JavaScript langsung dalam konfigurasi kebijakan dengan <Source>
elemen.
Dengan cara apa pun, kode JavaScript akan dieksekusi saat langkah yang dilampirkan ke kebijakan dieksekusi.
Untuk opsi file sumber, kode sumber selalu disimpan di
lokasi standar dalam paket proxy: apiproxy/resources/jsc. Atau, Anda juga dapat
menyimpan kode sumber dalam file resource di tingkat lingkungan atau organisasi. Untuk mengetahui
petunjuknya, lihat File resource. Anda juga dapat mengupload JavaScript melalui editor proxy UI Apigee.
File sumber JavaScript harus selalu memiliki ekstensi .js.
Lihat Software yang didukung dan versi yang didukung untuk versi JavaScript yang saat ini didukung.
Video
Tonton video singkat untuk mempelajari cara membuat ekstensi kebijakan kustom menggunakan kebijakan JavaScript.
Contoh
Menulis ulang URL target
Berikut adalah kasus penggunaan umum: mengekstrak data dari isi permintaan, menyimpannya dalam flow variable, dan menggunakan flow variable tersebut di tempat lain dalam alur proxy. Katakanlah Anda memiliki aplikasi tempat pengguna memasukkan nama mereka dalam formulir HTML dan mengirimkannya. Anda ingin proxy API mengekstrak data formulir dan menambahkannya secara dinamis ke URL yang digunakan untuk memanggil layanan backend. Bagaimana cara melakukannya dalam kebijakan JavsScript?
Catatan: Jika ingin mencoba contoh ini, kami mengasumsikan bahwa Anda telah membuat proxy baru di editor proxy. Saat membuatnya, cukup berikan URL layanan backend: http://www.example.com. Untuk contoh ini, kita akan menulis ulang URL backend secara dinamis. Jika Anda tidak tahu cara membuat proxy baru, lihat tutorial memulai. .
- Di UI Edge, buka proxy yang Anda buat di editor proxy.
- Pilih tab Develop.
- Dari menu New, pilih New Script.
- Dalam dialog, pilih JavaScript dan beri nama skrip, seperti
js-example. - Tempelkan kode berikut di editor kode dan simpan proxy. Hal penting yang perlu
diperhatikan adalah objek
context. Objek ini tersedia untuk kode JavaScript di mana saja dalam alur proxy. Objek ini digunakan untuk mendapatkan konstanta khusus alur, memanggil metode get/set yang berguna dan untuk operasi lainnya. Bagian objek ini adalah model objek JavaScript Edge's . Perhatikan, juga bahwa variabel alurtarget.urladalah variabel bawaan baca/tulis yang dapat diakses dalam alur Permintaan Target. Saat kita menetapkan variabel tersebut dengan URL API, Edge akan melakukan panggilan backend ke URL tersebut. Pada dasarnya, kita telah menulis ulang URL target asli, yang merupakan apa pun yang Anda tentukan saat membuat proxy (misalnya, 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); }
- Dari menu New Policy, pilih JavaScript.
- Beri nama kebijakan, seperti
target-rewrite. Terima nilai default, lalu simpan kebijakan. - Jika memilih Proxy Endpoint Preflow di Navigator, Anda akan melihat bahwa kebijakan tersebut telah ditambahkan ke alur tersebut.
- Di Navigator, pilih ikon Target Endpoint PreFlow.
- Dari Navigator, tarik kebijakan JavaScript ke sisi Permintaan Target Endpoint di editor alur.
- Simpan.
- Panggil API seperti ini, dengan mengganti nama organisasi dan nama proxy yang benar sesuai kebutuhan:
curl -i -H 'Content-Type: application/x-www-form-urlencoded' -X POST -d 'user=Will' http://myorg-test.apigee.net/js-example
Terakhir, mari kita lihat definisi XML untuk kebijakan JavaScript yang digunakan dalam
contoh ini. Hal penting yang perlu diperhatikan adalah elemen <ResourceURL>
digunakan untuk menentukan file sumber JavaScript yang akan dieksekusi. Pola yang sama digunakan
untuk file sumber JavaScript apa pun: jsc://filename.js. Jika kode JavaScript Anda
memerlukan include, Anda dapat menggunakan satu atau beberapa <IncludeURL> elemen untuk melakukannya, seperti yang dijelaskan nanti dalam referensi ini.
<?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>
Mengambil nilai properti dari JavaScript
Anda dapat menambahkan elemen <Property> dalam konfigurasi, lalu mengambil nilai elemen
dengan JavaScript saat runtime.
Gunakan atribut name elemen untuk menentukan nama yang akan digunakan untuk mengakses properti dari kode JavaScript. Nilai elemen <Property> (nilai antara tag pembuka dan penutup) adalah nilai literal yang akan diterima oleh JavaScript.
Di JavaScript, Anda mengambil nilai properti kebijakan dengan mengaksesnya sebagai properti objek
Properties, seperti berikut:
- Konfigurasi properti. Di sini, nilai properti adalah nama variabel
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>
- Ambil properti dengan JavaScript. Di sini, nilai yang diambil -- nama variabel --
kemudian digunakan oleh fungsi
getVariableuntuk mengambil nilai variabel.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);
Menangani error
Untuk contoh dan pembahasan teknik penanganan error yang dapat Anda gunakan dalam panggilan JavaScript, lihat postingan ini di Komunitas Apigee. Saran yang ditawarkan di Komunitas Apigee hanya untuk informasi dan tidak selalu mewakili praktik terbaik yang direkomendasikan oleh Apigee.
Referensi elemen
Referensi elemen menjelaskan elemen dan atribut kebijakan JavaScript.
<?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>
Atribut <Javascript>
<Javascript name="Javascript-1" enabled="true" continueOnError="false" async="false" timeLimit="200">
Atribut berikut khusus untuk kebijakan ini.
| Atribut | Deskripsi | Default | Ketersediaan |
|---|---|---|---|
| timeLimit |
Menentukan waktu maksimum (dalam milidetik) yang diizinkan untuk menjalankan skrip. Misalnya, jika batas 200 md terlampaui, kebijakan akan menampilkan error ini:
Catatan: Untuk akun uji coba gratis, waktu eksekusi dibatasi hingga 200 md. |
T/A | Wajib |
Tabel berikut menjelaskan atribut yang umum untuk semua elemen induk kebijakan:
| Atribut | Deskripsi | Default | Ketersediaan |
|---|---|---|---|
name |
Nama internal kebijakan. Nilai atribut Secara opsional, gunakan elemen |
T/A | Wajib |
continueOnError |
Tetapkan ke Setel ke |
salah | Opsional |
enabled |
Setel ke Setel ke |
true | Opsional |
async |
Atribut ini tidak digunakan lagi. |
salah | Tidak digunakan lagi |
<DisplayName> elemen
Gunakan selain atribut name untuk memberi label kebijakan di
editor proxy UI dengan nama natural language yang berbeda.
<DisplayName>Policy Display Name</DisplayName>
| Default |
T/A Jika Anda menghapus elemen ini, nilai atribut |
|---|---|
| Ketersediaan | Opsional |
| Jenis | String |
Elemen <IncludeURL>
Menentukan file library JavaScript yang akan dimuat sebagai dependensi ke file JavaScript utama
yang ditentukan dengan elemen <ResourceURL> atau <Source>. Skrip akan dievaluasi sesuai urutan yang tercantum dalam kebijakan. Kode Anda dapat menggunakan objek, metode, dan
properti model objek JavaScript.
Sertakan lebih dari satu resource dependensi JavaScript dengan elemen
<IncludeURL> tambahan.
<IncludeURL>jsc://my-javascript-dependency.js</IncludeURL>
| Default: | Tidak ada |
| Ketersediaan: | Opsional |
| Jenis: | String |
Contoh
Lihat Contoh Dasar di bagian Contoh.
Elemen <Property>
Menentukan properti yang dapat Anda akses dari kode JavaScript saat runtime.
<Properties> <Property name="propName">propertyValue</Property> </Properties>
| Default: | Tidak ada |
| Ketersediaan: | Opsional |
| Jenis: | String |
Atribut
| Atribut | Deskripsi | Default | Ketersediaan |
|---|---|---|---|
| nama |
Menentukan nama properti. |
T/A | Wajib. |
Contoh
Lihat contoh di bagian Contoh.
Elemen <ResourceURL>
Menentukan file JavaScript utama yang akan dieksekusi dalam alur API. Anda dapat menyimpan file ini
di cakupan proxy API (di bagian /apiproxy/resources/jsc dalam paket proxy API atau di
bagian Skrip panel Navigator editor proxy API), atau di cakupan organisasi atau
lingkungan untuk digunakan kembali di beberapa proxy API, seperti yang dijelaskan dalam File resource. Kode Anda dapat menggunakan objek,
metode, dan properti dari model objek JavaScript.
<ResourceURL>jsc://my-javascript.js</ResourceURL>
| Default: | Tidak ada |
| Ketersediaan: | <ResourceURL> atau <Source> diperlukan. Jika
<ResourceURL> dan <Source> ada, <ResourceURL> akan diabaikan. |
| Jenis: | String |
Contoh
Lihat Contoh Dasar di bagian Contoh.
Elemen <Source>
Memungkinkan Anda menyisipkan JavaScript langsung ke dalam konfigurasi XML kebijakan. Kode JavaScript yang disisipkan akan dieksekusi saat kebijakan dieksekusi dalam alur API.
| Default: | Tidak ada |
| Ketersediaan: | <ResourceURL> atau <Source> diperlukan. Jika
<ResourceURL> dan <Source> ada, <ResourceURL> akan diabaikan. |
| Jenis: | String |
Contoh
<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>
Elemen <SSLInfo>
Menentukan properti yang digunakan untuk mengonfigurasi TLS untuk semua instance klien HTTP yang dibuat oleh kebijakan JavaScript.
<SSLInfo> <Enabled>trueFalse</Enabled> <ClientAuthEnabled>trueFalse</ClientAuthEnabled> <KeyStore>ref://keystoreRef</KeyStore> <KeyAlias>keyAlias</KeyAlias> <TrustStore>ref://truststoreRef</TrustStore> </SSLInfo>
| Default: | Tidak ada |
| Ketersediaan: | Opsional |
| Jenis: | String |
Proses mengonfigurasi TLS untuk klien HTTP sama dengan proses yang Anda gunakan untuk mengonfigurasi TLS untuk TargetEndpoint/TargetServer. Lihat Mengonfigurasi TLS dari Edge ke backend untuk mengetahui informasi selengkapnya.
Catatan penggunaan
Kebijakan JavaScript tidak berisi kode sebenarnya. Sebagai gantinya, kebijakan JavaScript mereferensikan a
'resource' JavaScript dan menentukan Langkah dalam alur API tempat JavaScript dieksekusi. Anda dapat
mengupload skrip melalui editor proxy UI Pengelolaan, atau menyertakannya di
direktori /resources/jsc dalam proxy API yang Anda kembangkan secara lokal.
Men-debug kode kebijakan JavaScript
Gunakan fungsi print() untuk menampilkan informasi debug ke panel output transaksi di Alat Pelacakan. Untuk mengetahui detail dan contohnya, lihat Men-debug dengan pernyataan JavaScript print().
Untuk melihat pernyataan cetak di Pelacakan:
- Buka Alat Pelacakan dan mulai sesi pelacakan untuk proxy yang berisi kebijakan JavaScript kebijakan Anda.
- Panggil proxy.
- Di Alat Pelacakan, klik Output from all Transactions untuk membuka panel output
panel.

- Pernyataan cetak Anda akan muncul di panel ini.
Anda dapat menggunakan fungsi print() untuk menampilkan informasi debug ke alat Pelacakan. Fungsi ini tersedia langsung melalui model objek JavaScript. Untuk mengetahui detailnya, lihat "Men-debug JavaScript dengan pernyataan print() statements".
Variabel Alur
Kebijakan ini tidak mengisi variabel apa pun secara default; namun, Anda dapat menetapkan (dan mendapatkan) variabel alur dalam kode JavaScript dengan memanggil metode pada objek konteks. Pola umum terlihat seperti ini:
context.setVariable("response.header.X-Apigee-Target", context.getVariable("target.name"))
Objek konteks adalah bagian dari model objek JavaScript Apigee Edge.
Referensi error
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. | build |
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. |
build |
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. |
build |
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). |
build |
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. |
build |
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>
Skema
Setiap jenis kebijakan ditentukan oleh skema XML (.xsd). Sebagai referensi, skema kebijakan
tersedia di GitHub.
Topik terkait
- Model objek JavaScript
- Untuk mengetahui petunjuk, contoh kebijakan, dan contoh JavaScript, lihat Memprogram proxy API dengan JavaScript.
Artikel Komunitas Apigee
Anda dapat menemukan artikel terkait ini di Apigee Komunitas: