مدل شی جاوا اسکریپت

شما در حال مشاهده مستندات 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() است که می‌توانید از آن برای ارسال اطلاعات اشکال‌زدایی به ابزار 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 یک ویژگی مناسب برای خواندن/نوشتن است که پارامترهای scheme، host، port، path و query را برای targetRequest ترکیب می‌کند.

URL کامل درخواست از ویژگی‌های زیر تشکیل شده است:

  • پروتکل: پروتکل URL (برای مثال، HTTP، HTTPS)
  • پورت: پورت (برای مثال، :80، :443)
  • میزبان: میزبان URL (برای مثال، www.example.com)
  • مسیر: مسیر URI (برای مثال، /v1/mocktarget)

هنگام دریافت url ، یک URL با فرمت زیر برگردانده می‌شود:

protocol://host:port/path?queryParams

مثال‌ها:

context.targetRequest.url = 'http://www.example.com/path?q1=1'
context.targetRequest.protocol ='https';
headers

هدرهای درخواست HTTP به عنوان نگاشتی از String => List

مثال‌ها:

برای این درخواست 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

پارامترهای کوئری پیام درخواست به صورت نگاشتی از String => List .

مثال‌ها:

"?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 ( GET ، POST ، PUT ، DELETE ، PATCH و غیره) مرتبط با درخواست

مثال‌ها:

برای این درخواست:

POST /v1/blogs HTTP/1.1
Host: api.example.com
Content-Type: application/json
Authorization: Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z

جاوا اسکریپت زیر:

context.proxyRequest.method;

مقدار زیر را برمی‌گرداند

POST
body

بدنه پیام (بار داده) درخواست HTTP.

نهاد درخواست دارای اعضای زیر است:

  • context.targetRequest.body.asXML;
  • context.targetRequest.body.asJSON;
  • context.targetRequest.body.asForm;

مثال‌ها:

برای بدنه 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 پیام پاسخ به صورت نگاشتی از String => List .

مثال:

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 را برمی‌گرداند. کدهای وضعیت HTTP 4xx و 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);

استفاده از سیاست جاوا اسکریپت

از سیاست جاوا اسکریپت برای پیوست کردن کد جاوا اسکریپت سفارشی به یک جریان پروکسی استفاده کنید. به سیاست جاوا اسکریپت مراجعه کنید.

مباحث مرتبط

مقالات انجمن آپیجی

می‌توانید این مقالات مرتبط را در انجمن 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() است که می‌توانید از آن برای ارسال اطلاعات اشکال‌زدایی به ابزار 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 url property is a read/write convenience property that combines scheme, host, port, path and query parameters for the targetRequest.

The complete URL of the request is composed of the following properties:

  • protocol: The protocol of the URL (for example, HTTP, HTTPS)
  • port: The port (for example, :80, :443)
  • host: The host of the URL (for example, www.example.com)
  • path: The path of the URI (for example, /v1/mocktarget)

When getting url , a URL is returned in the following format:

protocol://host:port/path?queryParams

مثال‌ها:

context.targetRequest.url = 'http://www.example.com/path?q1=1'
context.targetRequest.protocol ='https';
headers

HTTP request headers as a mapping of String => List

مثال‌ها:

For this HTTP request:

POST /v1/blogs HTTP/1.1
Host: api.example.com
Content-Type: application/json
Authorization: Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z
The following JavaScript:
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 String => List .

مثال‌ها:

"?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 ( GET , POST , PUT , DELETE , PATCH , and so on) associated with the request

مثال‌ها:

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:

  • context.targetRequest.body.asXML;
  • context.targetRequest.body.asJSON;
  • context.targetRequest.body.asForm;

مثال‌ها:

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 @ notation.

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 String => List .

مثال:

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) Returns true if the httpClient was unable to connect to the server. HTTP status codes 4xx and 5xx result in isError() false , as the connection completed and a valid response code was returned. If isError() returns true , then a call to getResponse() returns the JavaScript undefined .
  • isSuccess() : (boolean) Returns true if the send was complete and successful.
  • isComplete() : (boolean) Returns true if the request is complete.
  • waitForComplete() : Pauses the thread until the request is complete (by success or error).
  • getResponse() : (object) Returns the response object if the httpClient.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 to httpClient.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 .

مباحث مرتبط

مقالات انجمن آپیجی

می‌توانید این مقالات مرتبط را در انجمن Apigee پیدا کنید: