شما در حال مشاهده مستندات Apigee Edge هستید.
به مستندات Apigee X مراجعه کنید . اطلاعات
این مبحث در مورد مدل شیء جاوا اسکریپت Apigee Edge بحث میکند. اگر قصد دارید از سیاست جاوا اسکریپت برای اضافه کردن جاوا اسکریپت سفارشی به یک پروکسی API استفاده کنید، درک این مدل مهم است.
درباره مدل شیء جاوا اسکریپت Edge
مدل شیء جاوا اسکریپت Apigee Edge، اشیاء را با ویژگیهای مرتبط تعریف میکند که برای اجرای کد جاوا اسکریپت در یک جریان پروکسی Apigee Edge در دسترس هستند. شما از سیاست جاوا اسکریپت برای اتصال این کد سفارشی به یک جریان پروکسی API استفاده میکنید.
اشیاء تعریف شده توسط این مدل، در جریان پروکسی API دارای دامنه هستند، به این معنی که اشیاء و ویژگیهای خاص فقط در نقاط خاصی از جریان در دسترس هستند. وقتی جاوا اسکریپت شما اجرا میشود، یک دامنه برای اجرا ایجاد میشود. در آن دامنه، این ارجاعات به اشیاء ایجاد میشوند:
- context : شیءای که دسترسی به متن پیام را فراهم میکند.
- request : یک اختصار که امکان دسترسی به شیء درخواست را فراهم میکند.
- پاسخ : یک اختصار که امکان دسترسی به شیء درخواست را فراهم میکند.
- crypto : توابع هش مختلفی را ارائه میدهد.
- چاپ : تابعی برای انتشار خروجی
- properties : دسترسی خواندن به ویژگیهای پیکربندی در پالیسی را فراهم میکند.
شیء زمینه
شیء context دارای دامنه سراسری است. در همه جای جریان پروکسی API در دسترس است. این شیء دارای چهار شیء فرزند است: proxyRequest ، proxyResponse ، targetRequest ، targetResponse . این اشیاء فرزند به درخواست و پاسخ محیطی، یا درخواست و پاسخ پروکسی یا درخواست و پاسخ هدف، محدود میشوند. برای مثال، اگر سیاست جاوا اسکریپت در قسمت نقطه پایانی پروکسی جریان اجرا شود، اشیاء context.proxyRequest و context.proxyResponse در دامنه هستند. اگر جاوا اسکریپت در یک جریان هدف اجرا شود، اشیاء context.targetRequest و context.targetResponse در دامنه هستند.
شیء context همچنین دارای ویژگیها و متدهایی است که در این مبحث به تفصیل شرح داده شدهاند. برای مثال، مثال کد جاوا اسکریپت زیر از ویژگی context.flow استفاده میکند و متدهای get/setVariable() را در context فراخوانی میکند.
if (context.flow=="PROXY_REQ_FLOW") { var username = context.getVariable("request.formparam.user"); context.setVariable("USER.name", username); }
این متدها مستقیماً با متغیرهای جریان تعامل دارند. مقدار ویژگی context.flow ، محدوده جریان فعلی است. در جریان درخواست پروکسی، روی ثابت PROXY_REQ_FLOW تنظیم شده است. اگر در جریان پاسخ هدف باشد، روی TARGET_RESP_FLOW تنظیم شده است. این ثابت برای اجرای کد مختص به دامنه مفید است. getter به شما امکان میدهد متغیرهای جریان را دریافت کنید و setter به شما امکان میدهد متغیرهای جریان را تنظیم کنید. این متغیرها عموماً در جریان پروکسی در دسترس هستند و میتوانند توسط سایر سیاستها مصرف شوند.
برای جزئیات و مثالهای بیشتر ، به مرجع شیء context در زیر مراجعه کنید.
شیء رمزنگاری شده
شیء رمزنگاری، پشتیبانی رمزنگاری پایه و با کارایی بالا را به مدل شیء جاوا اسکریپت اضافه میکند. برای جزئیات و مثالهای بیشتر، به مرجع شیء رمزنگاری در زیر مراجعه کنید.
اشیاء درخواست و پاسخ
اشیاء request و response ارجاعات مختصری به درخواست و پاسخ محیطی هستند، چه درخواست و پاسخ پروکسی و چه درخواست و پاسخ هدف. اشیاء مورد اشاره این متغیرها به زمینهای که سیاست جاوا اسکریپت در آن اجرا میشود بستگی دارند. اگر جاوا اسکریپت در جریان یک نقطه پایانی پروکسی اجرا شود، متغیرهای درخواست و پاسخ به context.proxyRequest و context.proxyResponse اشاره میکنند. اگر جاوا اسکریپت در جریان یک جریان هدف اجرا شود، متغیرها به context.targetRequest و context.targetResponse اشاره میکنند.
تابع ()print
مدل شیء جاوا اسکریپت شامل یک تابع print() است که میتوانید از آن برای ارسال اطلاعات اشکالزدایی به ابزار Edge Trace استفاده کنید. به بخش اشکالزدایی با دستورات print() جاوا اسکریپت مراجعه کنید.
شیء ویژگیها
هنگام استفاده از یکproperties به مقادیر آن ویژگیها دسترسی پیدا کند.
برای مثال، اگر پیکربندی جاوا اسکریپت شما شامل موارد زیر باشد:
<Javascript name='JS-1' > <Properties> <Property name="number">8675309</Property> <Property name="firstname">Jenny</Property> </Properties> <ResourceURL>jsc://my-code.js</ResourceURL> </Javascript>
سپس در my-code.js میتوانید:
print(properties.firstname); // prints Jenny print(properties.number); // 8675309
به طور عملیتر، پیکربندی میتواند به کد اجازه دهد هنگام اجرا در محیطهای مختلف، در لحظات مختلف یا به هر دلیلی، رفتار متفاوتی داشته باشد.
برای مثال، کد زیر «نام متغیر» و سبک خروجی که جاوا اسکریپت باید اطلاعات را در آن منتشر کند، مشخص میکند:
<Javascript name='JS-2' > <Properties> <Property name="output">my_output_variable</Property> <Property name="prettyPrint">true</Property> </Properties> <ResourceURL>jsc://emit-results.js</ResourceURL> </Javascript>
emit-results.js ، کد میتواند این کار را انجام دهد: var result = { prop1: "something", prop2 : "something else" } ; if (properties.prettyPrint == "true") { context.setVariable(properties.output, JSON.stringify(result, null, 2)); } else { context.setVariable(properties.output, JSON.stringify(result)); }
مرجع شیء رمزنگاری
شیء رمزنگاری به شما امکان میدهد توابع هش رمزنگاری پایه را در جاوا اسکریپت انجام دهید.
شیء رمزنگاری دامنه سراسری دارد. در همه جای جریان پروکسی API در دسترس است. رمزنگاری به شما امکان میدهد با این اشیاء هش کار کنید:
- SHA-1
- SHA256
- SHA512
- ام دی۵
کار با اشیاء SHA-1
شما میتوانید اشیاء SHA-1 ایجاد کنید، آنها را بهروزرسانی کنید و به مقادیر hex و base64 تبدیل کنید.
یک شیء SHA-1 جدید ایجاد کنید
var _sha1 = crypto.getSHA1();
یک شیء SHA-1 را بهروزرسانی کنید
نحو
_sha1.update(value);
پارامترها
- مقدار - (رشته) هر مقدار رشتهای.
مثال
بهروزرسانی یک شیء SHA-1:
_sha1.update("salt_value"); _sha1.update("some text");
شیء SHA-1 را به صورت یک رشته هگز برمیگرداند
var _hashed_token = _sha1.digest();
شیء SHA-1 را به عنوان یک رشته base64 برمیگرداند
var _hashed_token = _sha1.digest64();
کار با اشیاء SHA-256
شما میتوانید اشیاء SHA-256 ایجاد کنید، آنها را بهروزرسانی کنید و به مقادیر هگز و پایه 64 تبدیل کنید.
یک شیء جدید SHA-256 ایجاد کنید
var _sha256 = crypto.getSHA256();
یک شیء SHA-256 را بهروزرسانی کنید
نحو
_sha256.update(value);
پارامترها
- مقدار - (رشته) هر مقدار رشتهای.
مثال
بهروزرسانی یک شیء SHA-256:
_sha256.update("salt_value"); _sha256.update("some text");
شیء SHA-256 را به صورت یک رشته هگز برمیگرداند
var _hashed_token = _sha256.digest();
شیء SHA-256 را به عنوان یک رشته base64 برمیگرداند
var _hashed_token = _sha256.digest64();
کار با اشیاء SHA-512
شما میتوانید اشیاء SHA-512 ایجاد کنید، آنها را بهروزرسانی کنید و به مقادیر هگز و پایه 64 تبدیل کنید.
یک شیء جدید SHA-512 ایجاد کنید
var _sha512 = crypto.getSHA512();
یک شیء SHA-512 را بهروزرسانی کنید
نحو
_sha512.update(value);
پارامترها
- مقدار - (رشته) هر مقدار رشتهای.
مثال
یک شیء SHA-512 را بهروزرسانی کنید:
_sha512.update("salt_value"); _sha512.update("some text");
شیء SHA-512 را به صورت یک رشته هگز برمیگرداند
var _hashed_token = _sha512.digest();
شیء SHA-512 را به عنوان یک رشته base64 برمیگرداند
var _hashed_token = _sha512.digest64();
کار با اشیاء MD5
شما میتوانید اشیاء MD5 ایجاد کنید، آنها را بهروزرسانی کنید و به مقادیر hex و base64 تبدیل کنید.
یک شیء MD5 جدید ایجاد کنید
var _md5 = crypto.getMD5();
بهروزرسانی یک شیء MD5
نحو
_md5.update(value);
پارامترها
- مقدار - (رشته) هر مقدار رشتهای.
مثال
بهروزرسانی یک شیء MD5:
_md5.update("salt_value"); _md5.update("some text");
شیء MD5 را به صورت یک رشته هگز برمیگرداند
var _hashed_token = _md5.digest();
شیء MD5 را به عنوان یک رشته base64 برمیگرداند
var _hashed_token = _md5.digest64();
پشتیبانی از تاریخ/زمان رمزنگاریشده
شیء رمزنگاری از الگوهای قالببندی تاریخ/زمان پشتیبانی میکند.
crypto.dateFormat()
یک تاریخ را در قالب رشته برمیگرداند.
نحو
crypto.dateFormat(format, [timezone], [time])
پارامترها
- قالب - (رشته) پیادهسازی اساسی برای این پارامتر java.text.SimpleDateFormat است. برای مثال: 'yyyy-MM-DD HH:mm:ss.SSS'
- منطقه زمانی - (رشته، اختیاری) پیادهسازی زیربنایی برای این پارامتر java.util.TimeZone است. این پارامتر همان مقدار پیشفرض UTC است.
- زمان - (عدد، اختیاری) یک مقدار مهر زمانی یونیکس برای قالببندی. پیشفرض: زمان فعلی
مثالها
دریافت زمان فعلی، به میلی ثانیه:
var _now = crypto.dateFormat('yyyy-MM-DD HH:mm:ss.SSS');
زمان فعلی منطقه زمانی اقیانوس آرام را دریافت کنید:
var _pst = crypto.dateFormat('yyyy-MM-DD HH:mm:ss.SSS','PST');
مقدار ده ثانیه از الان را بدست آورید:
var _timeNow = Number(context.getVariable('system.timestamp')); var ten_seconds = crypto.dateFormat('yyyy-MM-DD HH:mm:ss.SSS','PST', _timeNow + 10 * 1000);
مثالهای بیشتر. همچنین به مستندات java.text.SimpleDateFormat مراجعه کنید.
var _pst = crypto.dateFormat('M');
var _pst = crypto.dateFormat('EEE, d MMM yyyy HH:mm:ss Z');
var _pst = crypto.dateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
برای دریافت هر یک از اشیاء هش پشتیبانی شده، از getHash() استفاده کنید.
مثالها
var _hash1 = crypto.getHash('MD5'); var _hash2 = crypto.getHash('SHA-1'); var _hash3 = crypto.getHash('SHA-256'); var _hash4 = crypto.getHash('SHA-512');
نمونه با رمزنگاری
try { // get values to use with hash functions var salt = context.getVariable("salt") || 'SomeHardCodedSalt'; var host = context.getVariable("request.header.Host"); var unhashed_token = ""; var _timeNow = Number(context.getVariable('system.timestamp')); var now = crypto.dateFormat('yyyy-MM-DD HH:mm:ss.SSS','PST', _timeNow); unhashed_token = "|" + now + "|" + host // generate a hash with the unhashedToken: var sha512 = crypto.getSHA512(); sha512.update(salt); sha512.update(unhashed_token); // convert to base64 var base64_token = sha512.digest64(); // set headers context.setVariable("request.header.now", now); context.setVariable("request.header.token", base64_token); } catch(e) { throw 'Error in Javascript'; }
مرجع شیء زمینه
برای هر تراکنش درخواست/پاسخ که توسط یک پروکسی API اجرا میشود، یک شیء context ایجاد میشود. شیء context متدهایی را برای دریافت، تنظیم و حذف متغیرهای مربوط به هر تراکنش ارائه میدهد.
متغیرها ویژگیهای مختص یک تراکنش را تعریف میکنند. زمان روز، منطقهی مکانی کلاینت درخواستکننده، عامل کاربری کلاینت درخواستکننده و URL سرویس هدف، همگی نمونههایی از متغیرهایی هستند که در context موجودند. بنابراین، context برای ساخت منطقی که برای اجرای رفتار سفارشی به این ویژگیها متکی است، مفید است.
به مرجع متغیرهای جریان و سیاست استخراج متغیرها مراجعه کنید.
خلاصه شیء زمینه
این جدول به طور خلاصه شیء context و فرزندان آن را شرح میدهد و ویژگیهایی را که به هر یک از آنها متصل هستند، فهرست میکند.
| نام | توضیحات | خواص |
|---|---|---|
context | یک پوشش برای زمینه خط لوله پردازش پیام و جریانهای درخواست و پاسخ که توسط ProxyEndpoint و TargetEndpoint اجرا میشوند. | جریان، جلسه |
context. proxyRequest | شیءای که پیام درخواست ورودی به ProxyEndpoint (از برنامه درخواستکننده به پروکسی API) را نشان میدهد. | هدرها، پارامترهای پرس و جو، متد، بدنه، آدرس اینترنتی |
context. targetRequest | شیءای که پیام درخواست خروجی از TargetEndpoint (از پروکسی API به سرویس backend) را نشان میدهد. | هدرها، پارامترهای پرس و جو، متد، بدنه، آدرس اینترنتی |
context. targetResponse | شیءای که پیام پاسخ هدف ورودی (از سرویس backend به پروکسی API) را نشان میدهد. | سرتیترها، محتوا، وضعیت |
context. proxyResponse | شیءای که پیام پاسخ پروکسی خروجی (از پروکسی API به برنامه درخواستکننده) را نشان میدهد. | سرتیترها، محتوا، وضعیت |
context.flow | نام جریان جاری. | به context.flow در زیر مراجعه کنید. |
context.session | نقشهای از جفتهای نام/مقدار که میتوانید برای انتقال اشیاء بین دو مرحله مختلف که در یک زمینه اجرا میشوند، استفاده کنید. به عنوان مثال: context.session['key'] = 123 . | برای اطلاعات بیشتر در مورد زمان و نحوه استفاده از این شیء، به این بحث انجمن Apigee مراجعه کنید. |
متدهای شیء زمینه
context.getVariable()
مقدار یک متغیر از پیش تعریف شده یا سفارشی را بازیابی میکند.
نحو
context.getVariable("variable-name");
مثال
برای دریافت مقدار سال جاری:
var year = context.getVariable('system.time.year');
context.setVariable()
مقدار یک متغیر سفارشی یا هر متغیر از پیش تعریف شده قابل نوشتن را تعیین میکند.
نحو
context.setVariable("variable-name", value);
مثال
یک سناریوی رایج برای تنظیم یک متغیر زمانی است که یک پروکسی API باید به صورت پویا URL هدف را بنویسد. کد جاوا اسکریپت زیر مقدار متغیری به نام USER.name را دریافت میکند، آن مقدار را به عنوان یک پارامتر پرس و جو به URL http://mocktarget.apigee.net?user= اضافه میکند و سپس target.url از پیش تعریف شده را روی آن مقدار تنظیم میکند.
context.setVariable("target.url", "http://mocktarget.apigee.net/user?user="+context.getVariable("USER.name"));
context.removeVariable()
یک متغیر را از متن حذف میکند.
نحو
context.removeVariable('variable-name');
ویژگیهای شیء زمینه
ویژگی flow رشتهای است که جریان پروکسی API فعلی را مشخص میکند. این ویژگی برای نشان دادن جریانی که جاوا اسکریپت به آن متصل است، استفاده میشود. مقادیر پشتیبانی شده عبارتند از:
-
PROXY_REQ_FLOW -
PROXY_RESP_FLOW -
TARGET_REQ_FLOW -
TARGET_RESP_FLOW
هر نام جریان شامل پیشجریان، پسجریان و هر جریان شرطی تعریفشده در نقاط انتهایی پروکسی یا نقاط انتهایی هدف میشود.
این ویژگی اختیاری زمانی مفید است که جاوا اسکریپت رایج در بیش از یک جریان اجرا شود، اما ممکن است رفتار آن بسته به جریانی که در آن اجرا میشود، متفاوت باشد. از ویژگی Flow برای ماژولهای جاوا اسکریپتی که قرار است در چندین پروکسی API دوباره استفاده شوند، استفاده کنید، که در آن کد لازم است جریان فعلی را قبل از اجرای منطق بررسی کند.
مثال
فقط یک هدر HTTP روی جریان targetRequest تنظیم کنید:
if (context.flow=="TARGET_REQ_FLOW") { context.targetRequest.headers['TARGET-HEADER-X']='foo'; }
فقط محتوا را روی جریان proxyResponse تنظیم کنید:
if (context.flow=="PROXY_RESP_FLOW") { context.proxyResponse.content='bar'; }
نقشهای از جفتهای نام/مقدار که میتواند برای انتقال اشیاء بین دو سیاست که در یک زمینه پیام اجرا میشوند، استفاده شود.
مثال
تنظیم یک مقدار در جلسه:
context.session['key'] = 123;
دریافت مقدار از جلسه:
var value = context.session['key']; // 123
فرزندان شیء زمینه
همانطور که در زیر نشان داده شده است، یک جریان کامل پروکسی API شامل چهار مرحله مجزا است که هر کدام دارای یک شیء پیام مرتبط هستند که فرزند شیء زمینه است:
-
context.proxyRequest: پیام درخواست ورودی که از کلاینت درخواستکننده دریافت شده است. -
context.targetRequest: پیام درخواست خروجی که به سرویس backend ارسال میشود. -
context.proxyResponse: پیام پاسخ خروجی که به کلاینت درخواستکننده برگردانده شده است. -
context.targetResponse: پیام درخواست ورودی که از سرویس backend دریافت شده است.

بخشهای زیر متدها و ویژگیهای این اشیاء را شرح میدهند:
context.*درخواست اشیاء فرزند
برای هر تراکنش HTTP که در یک پروکسی API اجرا میشود، دو شیء پیام درخواست ایجاد میشود: یکی ورودی (درخواست از کلاینت) و دیگری خروجی (درخواستی که توسط پروکسی API تولید شده و به هدف backend ارسال میشود.)
شیء context دارای اشیاء فرزندی است که این پیامهای درخواست را نشان میدهند: context.proxyRequest و context.targetRequest . این اشیاء به شما امکان میدهند به ویژگیهایی در جریان درخواست که هنگام اجرای کد جاوا اسکریپت شما در محدوده آن قرار دارند، دسترسی داشته باشید.
نکته: شما همچنین میتوانید از شیء مختصر request برای دسترسی به این ویژگیها در یک جریان درخواست استفاده کنید. شیء request بسته به اینکه کد جاوا اسکریپت شما در کجای جریان اجرا میشود، به context.proxyRequest یا context.targetRequest اشاره دارد.
context.*درخواست ویژگیهای شیء فرزند
| نام ملک | توضیحات |
|---|---|
url | ویژگی URL کامل درخواست از ویژگیهای زیر تشکیل شده است:
هنگام دریافت |
مثالها: context.targetRequest.url = 'http://www.example.com/path?q1=1' context.targetRequest.protocol ='https'; | |
headers | هدرهای درخواست HTTP به عنوان نگاشتی از |
مثالها: برای این درخواست HTTP: POST /v1/blogs HTTP/1.1 Host: api.example.com Content-Type: application/json Authorization: Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z context.proxyRequest.headers['Content-Type']; context.proxyRequest.headers['Authorization']; مقادیر زیر را برمیگرداند application/json Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z | |
queryParams | پارامترهای کوئری پیام درخواست به صورت نگاشتی از |
مثالها: "?city=PaloAlto&city=NewYork"میتواند به صورت زیر قابل دسترسی باشد: context.proxyRequest.queryParams['city']; // == 'PaloAlto' context.proxyRequest.queryParams['city'][0] // == 'PaloAlto' context.proxyRequest.queryParams['city'][1]; // == 'NewYork' context.proxyRequest.queryParams['city'].length(); // == 2 | |
method | فعل HTTP ( |
مثالها: برای این درخواست: POST /v1/blogs HTTP/1.1 Host: api.example.com Content-Type: application/json Authorization: Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z جاوا اسکریپت زیر: context.proxyRequest.method; مقدار زیر را برمیگرداند POST | |
body | بدنه پیام (بار داده) درخواست HTTP. نهاد درخواست دارای اعضای زیر است:
|
مثالها: برای بدنه XML: <customer number='1'> <name>Fred<name/> <customer/> برای دسترسی به عناصر شیء XML به صورت زیر عمل میکنیم: var name = context.targetRequest.body.asXML.name; برای دسترسی به ویژگیهای XML، از علامت var number = context.targetRequest.body.asXML.@number; برای بدنه درخواست JSON: { "a": 1 , "b" : "2" } var a = context.proxyRequest.body.asJSON.a; // == 1 var b = context.proxyRequest.body.asJSON.b; // == 2 برای خواندن پارامترهای فرم: "vehicle=Car&vehicle=Truck"v0 = context.proxyRequest.body.asForm['vehicle'][0]; v1 = context.proxyRequest.body.asForm['vehicle'][1]; |
زمینه.* اشیاء فرزند پاسخ
برای هر تراکنش HTTP که در یک پروکسی API اجرا میشود، دو شیء پیام پاسخ ایجاد میشود: یکی ورودی (پاسخ از سرویس backend) و دیگری خروجی (پاسخی که به کلاینت ارسال میشود.)
شیء context دارای اشیاء فرزندی است که این پیامهای پاسخ را نشان میدهند: context.proxyResponse و context.targetResponse . این اشیاء به شما امکان میدهند به ویژگیهایی در جریان پاسخ که هنگام اجرای کد جاوا اسکریپت شما در محدوده آن قرار دارند، دسترسی داشته باشید.
نکته: شما همچنین میتوانید از شیء response به صورت مختصر برای دسترسی به این ویژگیها از یک جریان پاسخ استفاده کنید. شیء response ، بسته به اینکه کد جاوا اسکریپت شما در کجای جریان اجرا میشود، به context.proxyResponse یا context.targetResponse اشاره دارد.
زمینه.*ویژگیهای شیء پاسخ
| نام ملک | توضیحات |
|---|---|
headers | هدرهای HTTP پیام پاسخ به صورت نگاشتی از |
مثال: var cookie = context.targetResponse.headers['Set-Cookie']; | |
status | کد وضعیت به همراه پیام وضعیت به عنوان یک ویژگی. هم کد وضعیت و هم پیام وضعیت به عنوان ویژگی در دسترس هستند. |
مثال: var status = context.targetResponse.status.code; // 200 var msg = context.targetResponse.status.message; // "OK" | |
content | بدنه HTTP (محتوای payload) پیام پاسخ. محتوای پاسخ دارای اعضای زیر است: context.targetResponse.content.asXML; context.targetResponse.content.asJSON; |
استفاده از نمادگذاری .asXML
یک روش مفید برای پیمایش یک سند XML با استفاده از نمادگذاری .asXML وجود دارد. این بخش نحوه استفاده از این نمادگذاری و تفاوت آن با request.content و context.proxyRequest.content را شرح میدهد.
برای مثال:
request.content.asXML
یا
context.proxyRequest.content.asXML
هر دو فرم *.content و *.content.asXML میتوانند در یک زمینه رشتهای استفاده شوند و جاوا اسکریپت آنها را مجبور میکند که به رشته تبدیل شوند. در حالت اول ( *.content )، رشته شامل تمام اعلانها و همچنین نظرات XML است. در حالت دوم ( *.content.asXML )، مقدار رشتهای نتیجه از اعلانها و نظرات پاک میشود.
مثال
محتوای پیام:
<?xml version="1.0" encoding="UTF-8"?> <yahoo:error xmlns:yahoo="http://yahooapis.com/v1/base.rng" xml:lang="en-US"> <yahoo:description>Please provide valid credentials. OAuth oauth_problem="unable_to_determine_oauth_type", realm="yahooapis.com" </yahoo:description> </yahoo:error> <!-- mg023.mail.gq1.yahoo.com uncompressed/chunked Sat Dec 14 01:23:35 UTC 2013 -->
فایل msg.content.asXML:
<?xml version="1.0" encoding="UTF-8"?> <yahoo:error xmlns:yahoo="http://yahooapis.com/v1/base.rng" xml:lang="en-US"> <yahoo:description>Please provide valid credentials. OAuth oauth_problem="unable_to_determine_oauth_type", realm="yahooapis.com" </yahoo:description> </yahoo:error>
علاوه بر این، میتوانید از فرم .asXML برای پیمایش سلسله مراتب XML، با مشخص کردن نام عناصر و ویژگیها، استفاده کنید. پیمایش سلسله مراتب با استفاده از سینتکس دیگر امکانپذیر نیست.
اشکالزدایی با دستورات print() در جاوا اسکریپت
اگر از سیاست جاوا اسکریپت برای اجرای کد جاوا اسکریپت سفارشی استفاده میکنید، توجه داشته باشید که میتوانید از تابع print() برای ارسال اطلاعات اشکالزدایی به ابزار Trace استفاده کنید. این تابع مستقیماً از طریق مدل شیء جاوا اسکریپت در دسترس است. برای مثال:
if (context.flow=="PROXY_REQ_FLOW") { print("In proxy request flow"); var username = context.getVariable("request.queryparam.user"); print("Got query param: " + username); context.setVariable("USER.name", username); print("Set query param: " + context.getVariable("USER.name")); } if (context.flow=="TARGET_REQ_FLOW") { print("In target request flow"); var username = context.getVariable("USER.name"); var url = "http://mocktarget.apigee.net/user?" context.setVariable("target.url", url + "user=" + username); print("callout to URL: ", context.getVariable("target.url")); }
برای مشاهده خروجی، در پایین پنجره Trace، گزینه Output from all transactions را انتخاب کنید. همچنین میتوانید خروجی را در ویژگی Trace به نام stepExecution-stdout پیدا کنید.
ساخت فراخوانیهای جاوا اسکریپت با httpClient
از httpClient برای ایجاد درخواستهای HTTP چندگانه، موازی و غیرهمزمان به هر URL از درون کد جاوا اسکریپت سفارشی که در یک جریان پروکسی API اجرا میشود، استفاده کنید. شیء httpClient توسط مدل شیء جاوا اسکریپت Apigee Edge در معرض نمایش قرار میگیرد.
درباره httpClient
شیء httpClient از طریق مدل شیء جاوا اسکریپت در معرض کد جاوا اسکریپت سفارشی که روی Apigee Edge اجرا میشود، قرار میگیرد. برای اتصال جاوا اسکریپت سفارشی به یک پروکسی API، از سیاست جاوا اسکریپت استفاده میکنید. وقتی این سیاست اجرا میشود، کد جاوا اسکریپت سفارشی اجرا میشود.
شیء httpClient برای توسعه سرویسهای ترکیبی یا mashupها مفید است. برای مثال، میتوانید چندین فراخوانی backend را در یک متد API واحد ادغام کنید. این شیء معمولاً به عنوان جایگزینی برای سیاست ServiceCallout استفاده میشود.
یک الگوی استفادهی اولیه به این صورت است: یک شیء Request نمونهسازی کنید، یک URL به آن اختصاص دهید (مثلاً به یک سرویس backend که میخواهید فراخوانی کنید) و httpClient.send را با آن شیء درخواست فراخوانی کنید.
var myRequest = new Request(); myRequest.url = "http://www.example.com"; var exchangeObj = httpClient.send(myRequest);
مرجع httpClient
کلاینت HTTP دو متد ارائه میدهد: get() و send() .
httpClient.get()
یک روش راحت برای درخواستهای ساده HTTP GET ، بدون پشتیبانی از هدرهای HTTP.
کاربرد
var exchangeObj = httpClient.get(url);
بازگشتها
این متد یک شیء exchange object) برمیگرداند. این شیء هیچ ویژگی (property) ندارد و متدهای زیر را ارائه میدهد:
-
isError(): (boolean) اگر httpClient قادر به اتصال به سرور نباشد،trueرا برمیگرداند. کدهای وضعیت HTTP4xxو5xxمنجر بهisError()falseمیشوند، زیرا اتصال تکمیل شده و یک کد پاسخ معتبر برگردانده شده است. اگرisError()trueرا برگرداند، فراخوانیgetResponse()undefinedجاوا اسکریپت را برمیگرداند. -
isSuccess(): (boolean) اگر ارسال کامل و موفقیتآمیز باشد،trueرا برمیگرداند. -
isComplete(): (boolean) اگر درخواست کامل شده باشد،trueرا برمیگرداند. -
waitForComplete(): تا زمانی که درخواست (با موفقیت یا خطا) کامل شود، thread را متوقف میکند. -
getResponse(): (object) اگرhttpClient.send()کامل و موفقیتآمیز باشد، شیء پاسخ را برمیگرداند. شیء برگردانده شده دارای متدها و ویژگیهای یکسانی با شیء context.proxyResponse است. به خلاصه شیء context مراجعه کنید. -
getError(): (رشته) اگر فراخوانیhttpClient.send()منجر به خطا شود، پیام خطا را به صورت یک رشته برمیگرداند.
مثال
یک شیء Request کاملاً پیکربندیشده حاوی ویژگیهای درخواست HTTP ارسال کنید. برای پردازش پاسخ از یک فراخوانی غیر مسدودکننده استفاده کنید.
// Add the required the headers for making a specific API request var headers = {'X-SOME-HEADER' : 'some value' }; // Make a GET API request along with headers var myRequest = new Request("http://www.example.com","GET",headers); // Define the callback function and process the response from the GET API request function onComplete(response,error) { // Check if the HTTP request was successful if (response) { context.setVariable('example.status', response.status); } else { context.setVariable('example.error', 'Woops: ' + error); } } // Specify the callback Function as an argument httpClient.get(myRequest, onComplete);
استفاده از سیاست جاوا اسکریپت
از سیاست جاوا اسکریپت برای پیوست کردن کد جاوا اسکریپت سفارشی به یک جریان پروکسی استفاده کنید. به سیاست جاوا اسکریپت مراجعه کنید.
مباحث مرتبط
- سیاست جاوا اسکریپت
- مدل شیء جاوا اسکریپت
- برای نمونهها و دستورالعملهای اولیه، به برنامهنویسی پروکسیهای API با جاوا اسکریپت مراجعه کنید.
- برای نمونه کدهای جاوا اسکریپت کارآمد، به نمونههای Apigee Edge در GitHub مراجعه کنید.
مقالات انجمن آپیجی
میتوانید این مقالات مرتبط را در انجمن Apigee پیدا کنید:
، شما در حال مشاهده مستندات Apigee Edge هستید.
به مستندات Apigee X مراجعه کنید . اطلاعات
این مبحث در مورد مدل شیء جاوا اسکریپت Apigee Edge بحث میکند. اگر قصد دارید از سیاست جاوا اسکریپت برای اضافه کردن جاوا اسکریپت سفارشی به یک پروکسی API استفاده کنید، درک این مدل مهم است.
درباره مدل شیء جاوا اسکریپت Edge
مدل شیء جاوا اسکریپت Apigee Edge، اشیاء را با ویژگیهای مرتبط تعریف میکند که برای اجرای کد جاوا اسکریپت در یک جریان پروکسی Apigee Edge در دسترس هستند. شما از سیاست جاوا اسکریپت برای اتصال این کد سفارشی به یک جریان پروکسی API استفاده میکنید.
اشیاء تعریف شده توسط این مدل، در جریان پروکسی API دارای دامنه هستند، به این معنی که اشیاء و ویژگیهای خاص فقط در نقاط خاصی از جریان در دسترس هستند. وقتی جاوا اسکریپت شما اجرا میشود، یک دامنه برای اجرا ایجاد میشود. در آن دامنه، این ارجاعات به اشیاء ایجاد میشوند:
- context : شیءای که دسترسی به متن پیام را فراهم میکند.
- request : یک اختصار که امکان دسترسی به شیء درخواست را فراهم میکند.
- پاسخ : یک اختصار که امکان دسترسی به شیء درخواست را فراهم میکند.
- crypto : توابع هش مختلفی را ارائه میدهد.
- چاپ : تابعی برای انتشار خروجی
- properties : دسترسی خواندن به ویژگیهای پیکربندی در پالیسی را فراهم میکند.
شیء زمینه
شیء context دارای دامنه سراسری است. در همه جای جریان پروکسی API در دسترس است. این شیء دارای چهار شیء فرزند است: proxyRequest ، proxyResponse ، targetRequest ، targetResponse . این اشیاء فرزند به درخواست و پاسخ محیطی، یا درخواست و پاسخ پروکسی یا درخواست و پاسخ هدف، محدود میشوند. برای مثال، اگر سیاست جاوا اسکریپت در قسمت نقطه پایانی پروکسی جریان اجرا شود، اشیاء context.proxyRequest و context.proxyResponse در دامنه هستند. اگر جاوا اسکریپت در یک جریان هدف اجرا شود، اشیاء context.targetRequest و context.targetResponse در دامنه هستند.
شیء context همچنین دارای ویژگیها و متدهایی است که در این مبحث به تفصیل شرح داده شدهاند. برای مثال، مثال کد جاوا اسکریپت زیر از ویژگی context.flow استفاده میکند و متدهای get/setVariable() را در context فراخوانی میکند.
if (context.flow=="PROXY_REQ_FLOW") { var username = context.getVariable("request.formparam.user"); context.setVariable("USER.name", username); }
این متدها مستقیماً با متغیرهای جریان تعامل دارند. مقدار ویژگی context.flow ، محدوده جریان فعلی است. در جریان درخواست پروکسی، روی ثابت PROXY_REQ_FLOW تنظیم شده است. اگر در جریان پاسخ هدف باشد، روی TARGET_RESP_FLOW تنظیم شده است. این ثابت برای اجرای کد مختص به دامنه مفید است. getter به شما امکان میدهد متغیرهای جریان را دریافت کنید و setter به شما امکان میدهد متغیرهای جریان را تنظیم کنید. این متغیرها عموماً در جریان پروکسی در دسترس هستند و میتوانند توسط سایر سیاستها مصرف شوند.
برای جزئیات و مثالهای بیشتر ، به مرجع شیء context در زیر مراجعه کنید.
شیء رمزنگاری شده
شیء رمزنگاری، پشتیبانی رمزنگاری پایه و با کارایی بالا را به مدل شیء جاوا اسکریپت اضافه میکند. برای جزئیات و مثالهای بیشتر، به مرجع شیء رمزنگاری در زیر مراجعه کنید.
اشیاء درخواست و پاسخ
اشیاء request و response ارجاعات مختصری به درخواست و پاسخ محیطی هستند، چه درخواست و پاسخ پروکسی و چه درخواست و پاسخ هدف. اشیاء مورد اشاره این متغیرها به زمینهای که سیاست جاوا اسکریپت در آن اجرا میشود بستگی دارند. اگر جاوا اسکریپت در جریان یک نقطه پایانی پروکسی اجرا شود، متغیرهای درخواست و پاسخ به context.proxyRequest و context.proxyResponse اشاره میکنند. اگر جاوا اسکریپت در جریان یک جریان هدف اجرا شود، متغیرها به context.targetRequest و context.targetResponse اشاره میکنند.
تابع ()print
مدل شیء جاوا اسکریپت شامل یک تابع print() است که میتوانید از آن برای ارسال اطلاعات اشکالزدایی به ابزار Edge Trace استفاده کنید. به بخش اشکالزدایی با دستورات print() جاوا اسکریپت مراجعه کنید.
شیء ویژگیها
هنگام استفاده از یکproperties به مقادیر آن ویژگیها دسترسی پیدا کند.
برای مثال، اگر پیکربندی جاوا اسکریپت شما شامل موارد زیر باشد:
<Javascript name='JS-1' > <Properties> <Property name="number">8675309</Property> <Property name="firstname">Jenny</Property> </Properties> <ResourceURL>jsc://my-code.js</ResourceURL> </Javascript>
سپس در my-code.js میتوانید:
print(properties.firstname); // prints Jenny print(properties.number); // 8675309
به طور عملیتر، پیکربندی میتواند به کد اجازه دهد هنگام اجرا در محیطهای مختلف، در لحظات مختلف یا به هر دلیلی، رفتار متفاوتی داشته باشد.
برای مثال، کد زیر «نام متغیر» و سبک خروجی که جاوا اسکریپت باید اطلاعات را در آن منتشر کند، مشخص میکند:
<Javascript name='JS-2' > <Properties> <Property name="output">my_output_variable</Property> <Property name="prettyPrint">true</Property> </Properties> <ResourceURL>jsc://emit-results.js</ResourceURL> </Javascript>
emit-results.js ، کد میتواند این کار را انجام دهد: var result = { prop1: "something", prop2 : "something else" } ; if (properties.prettyPrint == "true") { context.setVariable(properties.output, JSON.stringify(result, null, 2)); } else { context.setVariable(properties.output, JSON.stringify(result)); }
مرجع شیء رمزنگاری
شیء رمزنگاری به شما امکان میدهد توابع هش رمزنگاری پایه را در جاوا اسکریپت انجام دهید.
شیء رمزنگاری دامنه سراسری دارد. در همه جای جریان پروکسی API در دسترس است. رمزنگاری به شما امکان میدهد با این اشیاء هش کار کنید:
- SHA-1
- SHA256
- SHA512
- ام دی۵
کار با اشیاء SHA-1
شما میتوانید اشیاء SHA-1 ایجاد کنید، آنها را بهروزرسانی کنید و به مقادیر hex و base64 تبدیل کنید.
یک شیء SHA-1 جدید ایجاد کنید
var _sha1 = crypto.getSHA1();
یک شیء SHA-1 را بهروزرسانی کنید
نحو
_sha1.update(value);
پارامترها
- مقدار - (رشته) هر مقدار رشتهای.
مثال
بهروزرسانی یک شیء SHA-1:
_sha1.update("salt_value"); _sha1.update("some text");
شیء SHA-1 را به صورت یک رشته هگز برمیگرداند
var _hashed_token = _sha1.digest();
شیء SHA-1 را به عنوان یک رشته base64 برمیگرداند
var _hashed_token = _sha1.digest64();
کار با اشیاء SHA-256
شما میتوانید اشیاء SHA-256 ایجاد کنید، آنها را بهروزرسانی کنید و به مقادیر هگز و پایه 64 تبدیل کنید.
یک شیء جدید SHA-256 ایجاد کنید
var _sha256 = crypto.getSHA256();
یک شیء SHA-256 را بهروزرسانی کنید
نحو
_sha256.update(value);
پارامترها
- مقدار - (رشته) هر مقدار رشتهای.
مثال
بهروزرسانی یک شیء SHA-256:
_sha256.update("salt_value"); _sha256.update("some text");
شیء SHA-256 را به صورت یک رشته هگز برمیگرداند
var _hashed_token = _sha256.digest();
شیء SHA-256 را به عنوان یک رشته base64 برمیگرداند
var _hashed_token = _sha256.digest64();
کار با اشیاء SHA-512
شما میتوانید اشیاء SHA-512 ایجاد کنید، آنها را بهروزرسانی کنید و به مقادیر هگز و پایه 64 تبدیل کنید.
یک شیء جدید SHA-512 ایجاد کنید
var _sha512 = crypto.getSHA512();
یک شیء SHA-512 را بهروزرسانی کنید
نحو
_sha512.update(value);
پارامترها
- مقدار - (رشته) هر مقدار رشتهای.
مثال
یک شیء SHA-512 را بهروزرسانی کنید:
_sha512.update("salt_value"); _sha512.update("some text");
شیء SHA-512 را به صورت یک رشته هگز برمیگرداند
var _hashed_token = _sha512.digest();
شیء SHA-512 را به عنوان یک رشته base64 برمیگرداند
var _hashed_token = _sha512.digest64();
کار با اشیاء MD5
شما میتوانید اشیاء MD5 ایجاد کنید، آنها را بهروزرسانی کنید و به مقادیر hex و base64 تبدیل کنید.
یک شیء MD5 جدید ایجاد کنید
var _md5 = crypto.getMD5();
بهروزرسانی یک شیء MD5
نحو
_md5.update(value);
پارامترها
- مقدار - (رشته) هر مقدار رشتهای.
مثال
بهروزرسانی یک شیء MD5:
_md5.update("salt_value"); _md5.update("some text");
شیء MD5 را به صورت یک رشته هگز برمیگرداند
var _hashed_token = _md5.digest();
شیء MD5 را به عنوان یک رشته base64 برمیگرداند
var _hashed_token = _md5.digest64();
پشتیبانی از تاریخ/زمان رمزنگاریشده
شیء رمزنگاری از الگوهای قالببندی تاریخ/زمان پشتیبانی میکند.
crypto.dateFormat()
یک تاریخ را در قالب رشته برمیگرداند.
نحو
crypto.dateFormat(format, [timezone], [time])
پارامترها
- قالب - (رشته) پیادهسازی اساسی برای این پارامتر java.text.SimpleDateFormat است. برای مثال: 'yyyy-MM-DD HH:mm:ss.SSS'
- منطقه زمانی - (رشته، اختیاری) پیادهسازی زیربنایی برای این پارامتر java.util.TimeZone است. این پارامتر همان مقدار پیشفرض UTC است.
- زمان - (عدد، اختیاری) یک مقدار مهر زمانی یونیکس برای قالببندی. پیشفرض: زمان فعلی
مثالها
دریافت زمان فعلی، به میلی ثانیه:
var _now = crypto.dateFormat('yyyy-MM-DD HH:mm:ss.SSS');
زمان فعلی منطقه زمانی اقیانوس آرام را دریافت کنید:
var _pst = crypto.dateFormat('yyyy-MM-DD HH:mm:ss.SSS','PST');
مقدار ده ثانیه از الان را بدست آورید:
var _timeNow = Number(context.getVariable('system.timestamp')); var ten_seconds = crypto.dateFormat('yyyy-MM-DD HH:mm:ss.SSS','PST', _timeNow + 10 * 1000);
مثالهای بیشتر. همچنین به مستندات java.text.SimpleDateFormat مراجعه کنید.
var _pst = crypto.dateFormat('M');
var _pst = crypto.dateFormat('EEE, d MMM yyyy HH:mm:ss Z');
var _pst = crypto.dateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
برای دریافت هر یک از اشیاء هش پشتیبانی شده، از getHash() استفاده کنید.
مثالها
var _hash1 = crypto.getHash('MD5'); var _hash2 = crypto.getHash('SHA-1'); var _hash3 = crypto.getHash('SHA-256'); var _hash4 = crypto.getHash('SHA-512');
نمونه با رمزنگاری
try { // get values to use with hash functions var salt = context.getVariable("salt") || 'SomeHardCodedSalt'; var host = context.getVariable("request.header.Host"); var unhashed_token = ""; var _timeNow = Number(context.getVariable('system.timestamp')); var now = crypto.dateFormat('yyyy-MM-DD HH:mm:ss.SSS','PST', _timeNow); unhashed_token = "|" + now + "|" + host // generate a hash with the unhashedToken: var sha512 = crypto.getSHA512(); sha512.update(salt); sha512.update(unhashed_token); // convert to base64 var base64_token = sha512.digest64(); // set headers context.setVariable("request.header.now", now); context.setVariable("request.header.token", base64_token); } catch(e) { throw 'Error in Javascript'; }
مرجع شیء زمینه
برای هر تراکنش درخواست/پاسخ که توسط یک پروکسی API اجرا میشود، یک شیء context ایجاد میشود. شیء context متدهایی را برای دریافت، تنظیم و حذف متغیرهای مربوط به هر تراکنش ارائه میدهد.
متغیرها ویژگیهای مختص یک تراکنش را تعریف میکنند. زمان روز، منطقهی مکانی کلاینت درخواستکننده، عامل کاربری کلاینت درخواستکننده و URL سرویس هدف، همگی نمونههایی از متغیرهایی هستند که در context موجودند. بنابراین، context برای ساخت منطقی که برای اجرای رفتار سفارشی به این ویژگیها متکی است، مفید است.
به مرجع متغیرهای جریان و سیاست استخراج متغیرها مراجعه کنید.
خلاصه شیء زمینه
این جدول به طور خلاصه شیء context و فرزندان آن را شرح میدهد و ویژگیهایی را که به هر یک از آنها متصل هستند، فهرست میکند.
| نام | توضیحات | خواص |
|---|---|---|
context | یک پوشش برای زمینه خط لوله پردازش پیام و جریانهای درخواست و پاسخ که توسط ProxyEndpoint و TargetEndpoint اجرا میشوند. | جریان، جلسه |
context. proxyRequest | شیءای که پیام درخواست ورودی به ProxyEndpoint (از برنامه درخواستکننده به پروکسی API) را نشان میدهد. | هدرها، پارامترهای پرس و جو، متد، بدنه، آدرس اینترنتی |
context. targetRequest | شیءای که پیام درخواست خروجی از TargetEndpoint (از پروکسی API به سرویس backend) را نشان میدهد. | هدرها، پارامترهای پرس و جو، متد، بدنه، آدرس اینترنتی |
context. targetResponse | شیءای که پیام پاسخ هدف ورودی (از سرویس backend به پروکسی API) را نشان میدهد. | سرتیترها، محتوا، وضعیت |
context. proxyResponse | شیءای که پیام پاسخ پروکسی خروجی (از پروکسی API به برنامه درخواستکننده) را نشان میدهد. | سرتیترها، محتوا، وضعیت |
context.flow | نام جریان جاری. | به context.flow در زیر مراجعه کنید. |
context.session | نقشهای از جفتهای نام/مقدار که میتوانید برای انتقال اشیاء بین دو مرحله مختلف که در یک زمینه اجرا میشوند، استفاده کنید. به عنوان مثال: context.session['key'] = 123 . | برای اطلاعات بیشتر در مورد زمان و نحوه استفاده از این شیء، به این بحث انجمن Apigee مراجعه کنید. |
متدهای شیء زمینه
context.getVariable()
مقدار یک متغیر از پیش تعریف شده یا سفارشی را بازیابی میکند.
نحو
context.getVariable("variable-name");
مثال
برای دریافت مقدار سال جاری:
var year = context.getVariable('system.time.year');
context.setVariable()
مقدار یک متغیر سفارشی یا هر متغیر از پیش تعریف شده قابل نوشتن را تعیین میکند.
نحو
context.setVariable("variable-name", value);
مثال
یک سناریوی رایج برای تنظیم یک متغیر زمانی است که یک پروکسی API باید به صورت پویا URL هدف را بنویسد. کد جاوا اسکریپت زیر مقدار متغیری به نام USER.name را دریافت میکند، آن مقدار را به عنوان یک پارامتر پرس و جو به URL http://mocktarget.apigee.net?user= اضافه میکند و سپس target.url از پیش تعریف شده را روی آن مقدار تنظیم میکند.
context.setVariable("target.url", "http://mocktarget.apigee.net/user?user="+context.getVariable("USER.name"));
context.removeVariable()
یک متغیر را از متن حذف میکند.
نحو
context.removeVariable('variable-name');
ویژگیهای شیء زمینه
ویژگی flow رشتهای است که جریان پروکسی API فعلی را مشخص میکند. این ویژگی برای نشان دادن جریانی که جاوا اسکریپت به آن متصل است، استفاده میشود. مقادیر پشتیبانی شده عبارتند از:
-
PROXY_REQ_FLOW -
PROXY_RESP_FLOW -
TARGET_REQ_FLOW -
TARGET_RESP_FLOW
هر نام جریان شامل پیشجریان، پسجریان و هر جریان شرطی تعریفشده در نقاط انتهایی پروکسی یا نقاط انتهایی هدف میشود.
این ویژگی اختیاری زمانی مفید است که جاوا اسکریپت رایج در بیش از یک جریان اجرا شود، اما ممکن است رفتار آن بسته به جریانی که در آن اجرا میشود، متفاوت باشد. از ویژگی Flow برای ماژولهای جاوا اسکریپتی که قرار است در چندین پروکسی API دوباره استفاده شوند، استفاده کنید، که در آن کد لازم است جریان فعلی را قبل از اجرای منطق بررسی کند.
مثال
فقط یک هدر HTTP روی جریان targetRequest تنظیم کنید:
if (context.flow=="TARGET_REQ_FLOW") { context.targetRequest.headers['TARGET-HEADER-X']='foo'; }
فقط محتوا را روی جریان proxyResponse تنظیم کنید:
if (context.flow=="PROXY_RESP_FLOW") { context.proxyResponse.content='bar'; }
نقشهای از جفتهای نام/مقدار که میتواند برای انتقال اشیاء بین دو سیاست که در یک زمینه پیام اجرا میشوند، استفاده شود.
مثال
تنظیم یک مقدار در جلسه:
context.session['key'] = 123;
دریافت مقدار از جلسه:
var value = context.session['key']; // 123
فرزندان شیء زمینه
همانطور که در زیر نشان داده شده است، یک جریان کامل پروکسی API شامل چهار مرحله مجزا است که هر کدام دارای یک شیء پیام مرتبط هستند که فرزند شیء زمینه است:
-
context.proxyRequest: پیام درخواست ورودی که از کلاینت درخواستکننده دریافت شده است. -
context.targetRequest: پیام درخواست خروجی که به سرویس backend ارسال میشود. -
context.proxyResponse: پیام پاسخ خروجی که به کلاینت درخواستکننده برگردانده شده است. -
context.targetResponse: پیام درخواست ورودی که از سرویس backend دریافت شده است.

بخشهای زیر متدها و ویژگیهای این اشیاء را شرح میدهند:
context.*درخواست اشیاء فرزند
For each HTTP transaction the executes in an API proxy, two request message objects are created: one inbound (the request from the client) and one outbound (the request generated by the API proxy and submitted to the backend target.)
The context object has child objects that represent these request messages: context.proxyRequest and context.targetRequest . These objects let you access properties within the request flow that is in scope when your JavaScript code executes.
Note: You can also use the shorthand object request to access these properties in a request flow. The request object refers to either context.proxyRequest or context.targetRequest , depending on where in the flow your JavaScript code executes.
context.*Request child object properties
| نام ملک | توضیحات |
|---|---|
url | The The complete URL of the request is composed of the following properties:
When getting |
مثالها: context.targetRequest.url = 'http://www.example.com/path?q1=1' context.targetRequest.protocol ='https'; | |
headers | HTTP request headers as a mapping of |
مثالها: For this HTTP request: POST /v1/blogs HTTP/1.1 Host: api.example.com Content-Type: application/json Authorization: Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z context.proxyRequest.headers['Content-Type']; context.proxyRequest.headers['Authorization']; will return the following values application/json Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z | |
queryParams | The request message query parameters as a mapping of |
مثالها: "?city=PaloAlto&city=NewYork"can be accessed as: context.proxyRequest.queryParams['city']; // == 'PaloAlto' context.proxyRequest.queryParams['city'][0] // == 'PaloAlto' context.proxyRequest.queryParams['city'][1]; // == 'NewYork' context.proxyRequest.queryParams['city'].length(); // == 2 | |
method | The HTTP verb ( |
مثالها: For this request: POST /v1/blogs HTTP/1.1 Host: api.example.com Content-Type: application/json Authorization: Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z The following JavaScript: context.proxyRequest.method; will return the following value POST | |
body | The message body (payload) of the HTTP request. The request body has the following members:
|
مثالها: For an XML body: <customer number='1'> <name>Fred<name/> <customer/> To access the elements of the XML object as follows: var name = context.targetRequest.body.asXML.name; To access XML attributes attributes, use the var number = context.targetRequest.body.asXML.@number; For a JSON request body: { "a": 1 , "b" : "2" } var a = context.proxyRequest.body.asJSON.a; // == 1 var b = context.proxyRequest.body.asJSON.b; // == 2 To read form parameters: "vehicle=Car&vehicle=Truck"v0 = context.proxyRequest.body.asForm['vehicle'][0]; v1 = context.proxyRequest.body.asForm['vehicle'][1]; |
context.*Response child objects
For each HTTP transaction the executes in an API proxy, two response message objects are created: one inbound (the response from the backend service) and one outbound (the response sent back to the client.)
The context object has child objects that represent these response messages: context.proxyResponse and context.targetResponse . These objects let you access properties within the response flow that is in scope when your JavaScript code executes.
Note: You can also use the shorthand object response to access these properties from a response flow. The response object refers to either context.proxyResponse or context.targetResponse , depending on where in the flow your JavaScript code executes.
context.*Response object properties
| نام ملک | توضیحات |
|---|---|
headers | The HTTP headers of the response message as a mapping of |
مثال: var cookie = context.targetResponse.headers['Set-Cookie']; | |
status | The status code with status message as a property. Both status code and status message are available as properties. |
مثال: var status = context.targetResponse.status.code; // 200 var msg = context.targetResponse.status.message; // "OK" | |
content | The HTTP body (payload content) of the response message. Response content has the following members: context.targetResponse.content.asXML; context.targetResponse.content.asJSON; |
Using .asXML notation
There is a handy way to walk through an XML document using the .asXML notation. This section describes how to use this notation, and how it differs from request.content and context.proxyRequest.content .
برای مثال:
request.content.asXML
یا
context.proxyRequest.content.asXML
Both the *.content and *.content.asXML forms can be used in a string context, and JavaScript will coerce them to become strings. In the former case ( *.content ), the string includes all declarations as well as XML comments. In the latter case ( *.content.asXML ), the string value of the result is cleaned of declarations and comments.
مثال
msg.content:
<?xml version="1.0" encoding="UTF-8"?> <yahoo:error xmlns:yahoo="http://yahooapis.com/v1/base.rng" xml:lang="en-US"> <yahoo:description>Please provide valid credentials. OAuth oauth_problem="unable_to_determine_oauth_type", realm="yahooapis.com" </yahoo:description> </yahoo:error> <!-- mg023.mail.gq1.yahoo.com uncompressed/chunked Sat Dec 14 01:23:35 UTC 2013 -->
msg.content.asXML:
<?xml version="1.0" encoding="UTF-8"?> <yahoo:error xmlns:yahoo="http://yahooapis.com/v1/base.rng" xml:lang="en-US"> <yahoo:description>Please provide valid credentials. OAuth oauth_problem="unable_to_determine_oauth_type", realm="yahooapis.com" </yahoo:description> </yahoo:error>
Furthermore, you can use the .asXML form to traverse the XML hierarchy, by specifying the names of elements and attributes. It is not possible to traverse the hierarchy using the other syntax.
Debug with JavaScript print() statements
If you're using the JavaScript policy to execute custom JavaScript code, note that you can use the print() function to output debug information to the Trace tool . This function is available directly through the JavaScript object model. For example:
if (context.flow=="PROXY_REQ_FLOW") { print("In proxy request flow"); var username = context.getVariable("request.queryparam.user"); print("Got query param: " + username); context.setVariable("USER.name", username); print("Set query param: " + context.getVariable("USER.name")); } if (context.flow=="TARGET_REQ_FLOW") { print("In target request flow"); var username = context.getVariable("USER.name"); var url = "http://mocktarget.apigee.net/user?" context.setVariable("target.url", url + "user=" + username); print("callout to URL: ", context.getVariable("target.url")); }
To see the output, select Output from all transactions at the bottom of the Trace window. You can also find output in the Trace property called stepExecution-stdout .
Making JavaScript callouts with httpClient
Use httpClient to make multiple, parallel, asynchronous HTTP requests to any URL from within custom JavaScript code executing in an API proxy flow. The httpClient object is exposed by the Apigee Edge Javascript object model .
About httpClient
The httpClient object is exposed to custom JavaScript code running on Apigee Edge through the JavaScript object model. To attach custom JavaScript to an API proxy, you use the JavaScript policy . When the policy runs, the custom JavaScript code executes.
The httpClient object is useful for developing composite services or mashups. For example, you can consolidate multiple backend calls into a single API method. This object is commonly used as an alternative to the ServiceCallout policy.
Here's a basic usage pattern. Instantiate a Request object, assign to it a URL (for example, to a backend service you wish to call), and call httpClient.send with that request object.
var myRequest = new Request(); myRequest.url = "http://www.example.com"; var exchangeObj = httpClient.send(myRequest);
httpClient Reference
The HTTP Client exposes two methods: get() and send() .
httpClient.get()
A convenience method for simple HTTP GET requests, with no support for HTTP headers.
کاربرد
var exchangeObj = httpClient.get(url);
بازگشتها
The method returns an exchange object. This object has no properties, and it exposes the following methods:
-
isError(): (boolean) Returnstrueif the httpClient was unable to connect to the server. HTTP status codes4xxand5xxresult inisError()false, as the connection completed and a valid response code was returned. IfisError()returnstrue, then a call togetResponse()returns the JavaScriptundefined. -
isSuccess(): (boolean) Returnstrueif the send was complete and successful. -
isComplete(): (boolean) Returnstrueif the request is complete. -
waitForComplete(): Pauses the thread until the request is complete (by success or error). -
getResponse(): (object) Returns the response object if thehttpClient.send()was complete and successful. The returned object has the identical methods and properties as the context.proxyResponse object. See context object summary . -
getError(): (string) If the call tohttpClient.send()resulted in an error, returns the error message as a string.
مثال
Send a fully configured Request object containing the properties of the HTTP request. Use a non-blocking callback to process the response.
// Add the required the headers for making a specific API request var headers = {'X-SOME-HEADER' : 'some value' }; // Make a GET API request along with headers var myRequest = new Request("http://www.example.com","GET",headers); // Define the callback function and process the response from the GET API request function onComplete(response,error) { // Check if the HTTP request was successful if (response) { context.setVariable('example.status', response.status); } else { context.setVariable('example.error', 'Woops: ' + error); } } // Specify the callback Function as an argument httpClient.get(myRequest, onComplete);
Using the JavaScript policy
Use the JavaScript policy to attach custom JavaScript code to a proxy flow. See JavaScript policy .
مباحث مرتبط
- سیاست جاوا اسکریپت
- مدل شیء جاوا اسکریپت
- For basic samples and instructions, see Programming API proxies with JavaScript .
- For working JavaScript code samples, see the Apigee Edge samples on GitHub.
مقالات انجمن آپیجی
میتوانید این مقالات مرتبط را در انجمن Apigee پیدا کنید: