JavaScript 객체 모델

현재 Apigee Edge 문서가 표시되고 있습니다.
Apigee X 문서로 이동
정보

이 주제에서는 Apigee Edge 자바스크립트 객체 모델을 설명합니다. 자바스크립트 정책을 사용하여 API 프록시에 커스텀 자바스크립트를 추가하려면 이 모델을 이해하는 것이 중요합니다.

Edge 자바스크립트 객체 모델 정보

Apigee Edge 자바스크립트 객체 모델은 Apigee Edge 프록시 흐름 내에서 실행되는 JavaScript 코드에 사용할 수 있는 연결된 속성이 있는 객체를 정의합니다. 자바스크립트 정책을 사용하여 이 커스텀 코드를 API 프록시 흐름에 연결합니다.

이 모델에서 정의하는 객체에는 API 프록시 흐름 내 범위가 있습니다. 즉, 특정 객체와 속성을 흐름의 특정 지점에서만 사용할 수 있습니다. 자바스크립트가 실행되면 실행에 대한 범위가 생성됩니다. 이 범위에 다음 객체 참조가 생성됩니다.

  • 컨텍스트: 메시지 컨텍스트에 대한 액세스를 제공하는 객체
  • 요청: 요청 객체에 대한 액세스를 허용하는 단축형
  • 응답: 요청 객체에 대한 액세스를 허용하는 단축형
  • crypto: 다양한 해시 함수 제공
  • 출력: 출력을 내보내는 함수
  • 속성: 정책의 구성 속성에 대한 읽기 액세스를 허용합니다.

컨텍스트 객체

context 객체에는 전역 범위가 있습니다. API 프록시 흐름 내의 모든 곳에서 사용할 수 있습니다. 여기에는 하위 객체 4개(proxyRequest, proxyResponse, targetRequest, targetResponse)가 있습니다. 이러한 하위 객체의 범위는 대기 중인 요청 및 응답, 프록시 요청 및 응답 또는 대상 요청 및 응답으로 지정됩니다. 예를 들어 흐름의 프록시 엔드포인트 부분에서 자바스크립트 정책이 실행되면 context.proxyRequestcontext.proxyResponse 객체가 범위에 포함됩니다. 자바스크립트가 대상 흐름에서 실행되는 경우 context.targetRequestcontext.targetResponse 객체는 범위 내에 있습니다.

또한 context 객체에는 속성 및 메서드가 있으며 이 주제에서 자세하게 설명합니다. 예를 들어 다음 JavaScript 코드 예에서는 context.flow 속성을 사용하고 context에서 get/setVariable() 메서드를 호출합니다.

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를 사용하면 흐름 변수를 설정할 수 있습니다. 이러한 변수는 일반적으로 프록시 흐름에서 사용할 수 있으며 다른 정책에서 사용할 수 있습니다.

자세한 내용과 예는 아래 컨텍스트 객체 참조를 확인하세요.

암호화 객체

암호화 객체는 자바스크립트 객체 모델에 기본적인 고성능 암호화 지원을 추가합니다. 자세한 내용과 예시는 아래의 암호화 객체 참조를 참조하세요.

요청 및 응답 객체

requestresponse 객체는 프록시 요청 및 응답 또는 대상 요청 및 응답과 같이 대기 중인 요청 및 응답에 대한 약칭 참조입니다. 이러한 변수가 참조하는 객체는 자바스크립트 정책이 실행되는 컨텍스트에 따라 다릅니다. 자바스크립트가 프록시 엔드포인트 흐름에서 실행되면 요청 및 응답 변수는 context.proxyRequestcontext.proxyResponse를 참조합니다. 자바스크립트가 대상 흐름에서 실행되면 변수는 context.targetRequestcontext.targetResponse를 나타냅니다.

자바스크립트 객체 모델에는 Edge Trace 도구에 디버그 정보를 출력하는 데 사용할 수 있는 print() 함수가 포함되어 있습니다. JavaScript 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 프록시 흐름 내에서 사용할 수 있습니다. Crypto를 사용하면 다음과 같은 해시 객체로 작업할 수 있습니다.

  • SHA-1
  • SHA256
  • SHA512
  • MD5

SHA-1 객체 작업

SHA-1 객체를 만들고 업데이트하고 16진수 및 base64 값으로 변환할 수 있습니다.

새 SHA-1 객체 만들기

var _sha1 = crypto.getSHA1();

SHA-1 객체 업데이트

구문

_sha1.update(value);

매개변수

  • - (문자열) 모든 문자열 값

예시

SHA-1 객체를 업데이트합니다.

_sha1.update("salt_value");

_sha1.update("some text");

SHA-1 객체를 16진수 문자열로 반환합니다.

var _hashed_token = _sha1.digest();

SHA-1 객체를 base64 문자열로 반환합니다.

var _hashed_token = _sha1.digest64();

SHA-256 객체 작업

SHA-256 객체를 만들고 업데이트하고 16진수 및 base64 값으로 변환할 수 있습니다.

새 SHA-256 객체 만들기

var _sha256 = crypto.getSHA256();

SHA-256 객체 업데이트

구문

_sha256.update(value);

매개변수

  • - (문자열) 모든 문자열 값

예시

SHA-256 객체를 업데이트합니다.

_sha256.update("salt_value");

_sha256.update("some text");

SHA-256 객체를 16진수 문자열로 반환합니다.

var _hashed_token = _sha256.digest();

SHA-256 객체를 base64 문자열로 반환합니다.

var _hashed_token = _sha256.digest64();

SHA-512 객체 작업

SHA-512 객체를 만들고 업데이트하고 16진수 및 base64 값으로 변환할 수 있습니다.

새 SHA-512 객체 만들기

var _sha512 = crypto.getSHA512();

SHA-512 객체 업데이트

구문

_sha512.update(value);

매개변수

  • - (문자열) 모든 문자열 값

예시

SHA-512 객체를 업데이트합니다.

_sha512.update("salt_value");

_sha512.update("some text");

SHA-512 객체를 16진수 문자열로 반환합니다.

var _hashed_token = _sha512.digest();

SHA-512 객체를 base64 문자열로 반환합니다.

var _hashed_token = _sha512.digest64();

MD5 객체 작업

MD5 객체를 만들고 업데이트하고 16진수 및 base64 값으로 변환할 수 있습니다.

새 MD5 객체 만들기

var _md5 = crypto.getMD5();

MD5 객체 업데이트

구문

_md5.update(value);

매개변수

  • - (문자열) 모든 문자열 값

예시

MD5 객체를 업데이트합니다.

_md5.update("salt_value");

_md5.update("some text");

MD5 객체를 16진수 문자열로 반환

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입니다. 이 매개변수는 sameDefault: UTC입니다.
  • 시간 - (숫자, 선택사항) 형식을 지정할 Unix 타임스탬프 값입니다. 기본값: 현재 시간

예시

현재 시간을 밀리초 단위로 단축해 가져옵니다.

var _now = crypto.dateFormat('yyyy-MM-DD HH:mm:ss.SSS');

태평양 표준시 시간대에 대한 현재 시간을 가져옵니다.

var _pst = crypto.dateFormat('yyyy-MM-DD HH:mm:ss.SSS','PST');

지금부터 10초의 값을 가져옵니다.

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';
}

컨텍스트 객체 참조

context 객체는 API 프록시에서 실행되는 각 요청/응답 트랜잭션에 대해 생성됩니다. context 객체는 각 트랜잭션과 관련된 변수를 가져오고 설정하고 삭제하는 메서드를 노출합니다.

변수는 트랜잭션 고유의 속성을 정의합니다. 시간, 요청 클라이언트의 언어, 요청 클라이언트의 사용자 에이전트, 대상 서비스의 URL은 context에서 사용할 수 있는 변수의 모든 예시입니다. 따라서 context는 이러한 속성을 사용하여 커스텀 동작을 실행하는 논리를 빌드하는 데 유용합니다.

흐름 변수 참조변수 추출 정책을 확인하세요.

컨텍스트 객체 요약

이 표에서는 컨텍스트 객체와 그 하위 요소를 간단히 설명하고 서로 연결된 속성을 보여줍니다.

이름 설명 속성
context 메시지 처리 파이프라인 컨텍스트와 ProxyEndpoint 및 TargetEndpoint에서 실행되는 요청 및 응답 흐름을 위한 래퍼입니다. 흐름, 세션
context.proxyRequest ProxyEndpoint로 수신되는 요청 메시지를 표현하는 객체입니다(요청 앱에서 API 프록시로). 헤더, 쿼리 매개변수, 메서드, 본문, URL
context.targetRequest TargetEndpoint의 발신 요청 메시지를 표현하는 객체입니다(API 프록시에서 백엔드 서비스로). 헤더, 쿼리 매개변수, 메서드, 본문, URL
context.targetResponse 수신 대상 응답 메시지를 표현하는 객체(백엔드 서비스에서 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을 동적으로 작성해야 하는 경우입니다. 다음 JavaScript는 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');

컨텍스트 객체 속성

context.flow

flow 속성은 현재 API 프록시 흐름을 식별하는 문자열입니다. 이 속성은 자바스크립트가 연결되는 흐름을 나타내는 데 사용됩니다. 지원되는 값은 다음과 같습니다.

  • PROXY_REQ_FLOW
  • PROXY_RESP_FLOW
  • TARGET_REQ_FLOW
  • TARGET_RESP_FLOW

각 흐름 이름에는 PreFlow, PostFlow, ProxyEndpoint 또는 TargetEndpoint에 정의된 모든 조건부 흐름이 포함됩니다.

이 선택적 속성은 둘 이상의 흐름에서 공통 자바스크립트를 실행하는 경우에 유용하지만 실행된 흐름에 따라 동작이 달라질 수 있습니다. 여러 API 프록시에서 재사용될 자바스크립트 모듈의 흐름 속성을 사용하려면 로직을 실행하기 전에 코드가 현재 흐름을 확인해야 합니다.

targetRequest 흐름에서만 HTTP 헤더를 설정합니다.

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

동일한 메시지 컨텍스트 내에서 실행되는 두 정책 간에 객체를 전달하는 데 사용할 수 있는 이름/값 쌍의 맵입니다.

세션에서 값을 설정합니다.

context.session['key']  = 123;

세션에서 값을 가져옵니다.

var value = context.session['key']; // 123

컨텍스트 객체 하위 요소

아래 표시된 것처럼 전체 API 프록시 흐름에는 컨텍스트 객체의 하위 요소인 연관된 메시지 객체가 있는 4가지 고유한 단계가 포함됩니다.

  • context.proxyRequest: 요청 클라이언트에서 수신된 수신 요청 메시지입니다.
  • context.targetRequest: 백엔드 서비스로 전송된 발신 요청 메시지입니다.
  • context.proxyResponse: 요청 클라이언트로 반환된 발신 응답 메시지입니다.
  • context.targetResponse: 백엔드 서비스에서 수신된 수식 요청 메시지입니다.

다음 섹션에서는 이러한 객체의 메서드와 속성을 설명합니다.

context.*하위 객체 요청

API 프록시에서 실행되는 각 HTTP 트랜잭션에 대해 두 개의 요청 메시지 객체가 생성됩니다. 하나는 inbound(클라이언트로부터의 요청)이고 다른 하나는 inbound(API 프록시에서 생성하고 백엔드 대상에 제출된 요청)입니다.

context 객체에는 context.proxyRequestcontext.targetRequest 요청 메시지를 나타내는 하위 객체가 있습니다. 이러한 객체를 사용하면 자바스크립트 코드가 실행될 때 범위 내에 있는 요청 흐름 내의 속성에 액세스할 수 있습니다.

참고: 약식 객체 request를 사용하여 요청 흐름에서 이러한 속성에 액세스할 수도 있습니다. request 객체는 자바스크립트 코드가 실행되는 흐름의 어느 위치에 따라 context.proxyRequest 또는 context.targetRequest를 참조합니다.

context.*하위 객체 속성 요청

속성 이름 설명
url

url 속성은 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

String => List의 매핑으로 표시된 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

요청 메시지 쿼리 매개변수는 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];

context.*하위 객체 응답

API 프록시에서 실행되는 각 HTTP 트랜잭션에 대해 두 개의 응답 메시지 객체가 생성됩니다. 하나는 inbound(백엔드 서비스로부터의 응답)이고 다른 하나는 inbound(클라이언트에게 다시 보낸 응답)입니다.

컨텍스트 객체에는 응답 메시지(context.proxyResponsecontext.targetResponse)를 나타내는 하위 객체가 있습니다. 이러한 객체를 사용하면 자바스크립트 코드가 실행될 때 범위 내에 있는 응답 흐름 내의 속성에 액세스할 수 있습니다.

참고: 약식 객체 response를 사용하여 응답 흐름에서 이러한 속성에 액세스할 수도 있습니다. response 객체는 자바스크립트 코드가 실행되는 흐름의 어느 위치에 따라 context.proxyResponse 또는 context.targetResponse를 참조합니다.

context.*객체 속성 응답

속성 이름 설명
headers

String => List의 매핑으로서의 응답 메시지의 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 본문(페이로드 콘텐츠)입니다.

응답 콘텐츠의 구성원은 다음과 같습니다.

context.targetResponse.content.asXML;
context.targetResponse.content.asJSON;

.asXML 표기법 사용

.asXML 표기법을 사용하여 XML 문서를 편리하게 실행할 수 있습니다. 이 섹션에서는 이 표기법을 사용하는 방법과 request.contentcontext.proxyRequest.content의 차이점에 대해 설명합니다.

예를 들면 다음과 같습니다.

request.content.asXML

또는

context.proxyRequest.content.asXML

*.content*.content.asXML 형태는 문자열 컨텍스트에서 사용할 수 있으며 자바스크립트에서 이를 문자열로 변환합니다. 전자의 경우(*.content) 문자열에는 XML 주석뿐 아니라 모든 선언이 포함됩니다. 후자의 경우(*.content.asXML)는 결과의 문자열 값에서 선언과 주석이 삭제됩니다.

예시

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>

또한 .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 창 하단에서 모든 트랜잭션에서 출력을 선택합니다. stepExecution-stdout이라는 Trace 속성에서 출력을 찾을 수도 있습니다.

httpClient로 자바스크립트 콜아웃 만들기

API 프록시 흐름에서 실행되는 커스텀 자바스크립트 코드 내에서 모든 URL에 대해 여러 개의 병렬, 비동기 HTTP 요청을 보내려면 httpClient를 사용합니다. httpClient 객체는 Apigee Edge 자바스크립트 객체 모델을 통해 노출됩니다.

httpClient 정보

httpClient 객체는 자바스크립트 객체 모델을 통해 Apigee Edge에서 실행되는 커스텀 자바스크립트 코드에 노출됩니다. API 프록시에 커스텀 자바스크립트를 연결하려면 자바스크립트 정책을 사용합니다. 정책이 실행되면 커스텀 자바스크립트 코드가 실행됩니다.

httpClient 객체는 복합 서비스 또는 매시업을 개발하는 데 유용합니다. 예를 들어 여러 개의 백엔드 호출을 단일 API 메서드에 통합할 수 있습니다. 이 객체는 일반적으로 서비스 콜아웃 정책의 대안으로 사용됩니다.

다음은 기본적인 사용 패턴입니다. 요청 객체를 인스턴스화하고 여기에 URL (예: 호출하려는 백엔드 서비스)을 할당한 후 해당 요청 객체로 httpClient.send를 호출합니다.

var myRequest = new Request();
myRequest.url = "http://www.example.com";
var exchangeObj = httpClient.send(myRequest);

httpClient 참조

HTTP 클라이언트는 두 가지의 get()send() 메서드를 노출합니다.

httpClient.get()

HTTP 헤더를 지원하지 않는 간단한 HTTP GET 요청을 위한 편의 메서드입니다.

사용량

var exchangeObj = httpClient.get(url);

반환

이 메서드는 exchange 객체를 반환합니다. 이 객체에는 속성이 없으며 다음 메서드를 노출합니다.

  • isError(): (부울) httpClient가 서버에 연결할 수 없는 경우 true를 반환합니다. 연결이 완료되고 유효한 응답 코드가 반환되면 HTTP 상태 코드 4xx5xxisError() false를 반환합니다. isError()true를 반환하면 getResponse()를 호출하면 자바스크립트 undefined가 반환됩니다.
  • isSuccess(): (부울) 전송이 성공적으로 완료되면 true를 반환합니다.
  • isComplete(): (부울) 요청이 완료되면 true를 반환합니다.
  • waitForComplete(): 요청이 성공하거나 오류가 발생할 때까지 스레드를 일시중지합니다.
  • getResponse(): (객체) httpClient.send()가 완료되고 성공한 경우 응답 객체를 반환합니다. 반환된 객체에는 context.proxyResponse 객체와 같이 동일한 메서드 및 속성이 있습니다. 컨텍스트 객체 요약을 참고하세요.
  • getError(): (문자열) httpClient.send() 호출로 인해 오류가 발생하면 오류 메시지를 문자열로 반환합니다.

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 커뮤니티에서 관련 자료를 찾아보세요.