이 페이지는 Apigee 및 Apigee Hybrid에 적용됩니다.
Apigee Edge 문서 보기
조건을 통해 API 프록시가 런타임 시 동적으로 작동할 수 있습니다. 조건은 변수에 대한 작업을 정의하며, 이는 Apigee 처리 파이프라인에 의해 평가됩니다. 조건문은 부울이며 항상 true
또는 false
로 평가됩니다.
조건 개요
이 섹션에서는 Apigee에서 조건문을 사용하는 방법과 위치를 설명합니다. 또한 다음 섹션에서는 구문을 설명합니다.
조건문 구조
조건문의 기본 구조는 다음과 같습니다.
<Condition>variable.name operator "value"</Condition>
예를 들면 다음과 같습니다.
<Condition>request.verb = "GET"</Condition>
조건을 AND
와 결합하면 한 번에 둘 이상의 항목을 적용할 수 있습니다. 예를 들어 다음 조건은 요청의 URI가 /statuses
와 일치하고 그리고 요청의 HTTP 동사가 GET
인 경우에만 true
로 평가됩니다.
<Condition>(proxy.pathsuffix MatchesPath "/statuses") and (request.verb = "GET")</Condition>
조건문을 사용할 수 있는 위치
조건을 사용하여 다음 동작을 제어할 수 있습니다.
정책 실행
조건문을 사용하면 정책의 시행을 제어할 수 있습니다. 일반적인 사용 사례는 HTTP 헤더 또는 메시지 콘텐츠를 기반으로 한 응답 메시지의 조건부 변환입니다.
다음 예시에서는 Accept
헤더를 기반으로 조건부로 XML을 JSON으로 변환합니다.
<Step> <Condition>request.header.accept = "application/json"</Condition> <Name>XMLToJSON</Name> </Step>
흐름 실행
조건문을 사용하면 ProxyEndpoints
및 TargetEndpoints
에서 이름이 지정된 흐름 실행을 제어할 수 있습니다. 이름이 지정된 흐름만 조건부로 실행할 수 있다는 점에 유의하세요. ProxyEndpoints
및 TargetEndpoints
에서의 사전 흐름 및 사후 흐름(요청 및 응답 모두)이 모든 트랜잭션에서 실행되므로 비조건부 failsafe 기능을 제공합니다.
요청 메시지의 HTTP 동사를 기반으로 조건부 요청 흐름을 실행하고 오류를 나타내는 (잠재적) HTTP 상태 코드를 기반으로 한 조건부 응답 흐름을 실행하는 예시:
<Flow name="GetRequests"> <Condition>request.verb = "GET"</Condition> <Request> <Step> <Condition>request.path MatchesPath "/statuses/**"</Condition> <Name>StatusesRequestPolicy</Name> </Step> </Request> <Response> <Step> <Condition>(response.status.code = 503) or (response.status.code = 400)</Condition> <Name>MaintenancePolicy</Name> </Step> </Response> </Flow>
대상 엔드포인트 경로 선택
조건문을 사용하면 프록시 엔드포인트 구성에서 호출된 대상 엔드포인트를 제어할 수 있습니다. 라우팅 규칙은 요청을 특정 대상 엔드포인트로 전달합니다. 대상 엔드포인트를 두 개 이상 사용할 수 있는 경우 라우팅 규칙이 조건에 대해 평가되며, true이면 요청이 이름이 지정된 대상 엔드포인트로 전달됩니다.
Content-Type
을 기준으로 지정된 대상 엔드포인트로 메시지를 조건부로 라우팅하는 예시:
<RouteRule name="default">
<!--this routing executes if the header indicates that this is an XML call. If true, the call is routed to the endpoint XMLTargetEndpoint-->
<Condition>request.header.Content-Type = "text/xml"</Condition>
<TargetEndpoint>XmlTargetEndpoint</TargetEndpoint>
</RouteRule>
자세한 내용은 흐름 변수 및 조건을 참조하세요.
경로 표현식
경로 표현식은 URI 경로를 일치시키는 데 사용되며, *
를 사용하여 단일 경로 요소를 나타내고 **
를 사용하여 여러 URI 수준을 나타냅니다.
예를 들면 다음과 같습니다.
패턴 | 샘플 URI 경로 일치 |
---|---|
/*/a/ |
/x/a/ 또는 /y/a/ |
/*/a/* |
/x/a/b 또는 /y/a/foo |
/*/a/** |
/x/a/b/c/d |
/*/a/*/feed/ |
/x/a/b/feed/ 또는 /y/a/foo/feed/ |
/a/**/feed/** |
/a/b/feed/rss/1234 |
%
는 이스케이프 문자로 취급합니다. %{user%}
패턴은 {user}
와 일치하지만 user
와는 일치하지 않습니다.
변수
조건문에서 기본 제공 흐름 변수와 맞춤 변수를 모두 사용할 수 있습니다. 자세한 내용은 다음을 참고하세요.
- 흐름 변수 참조: 기본 제공 변수의 전체 목록
- ExtractVariables 정책: 맞춤 변수 설정 안내
연산자
연산자를 사용할 때는 다음 제한사항을 준수하세요.
- 연산자는 변수 이름으로 사용할 수 없습니다.
- 연산자 앞뒤에 공백이 있어야 합니다.
- 변수에 연산자를 포함하려면 변수 이름을 작은따옴표로 묶어야 합니다(예:
예를 들면
'request.header.help!me'
입니다. - 산술 연산자(
+ * - / %
)는 지원되지 않습니다. - 자바 우선순위가 연산자에 사용됩니다.
- Apigee는
java.util.regex
에서 구현된 정규 표현식을 사용합니다.
다음은 지원되는 연산자를 정리한 표입니다. 표현식에 기호나 단어를 사용할 수 있습니다.
기호 | Word | 설명 |
---|---|---|
! |
Not , not |
단항 연산자(단일 입력 사용) |
= |
Equals , Is |
같음 (대소문자 구분) |
!= |
NotEquals , IsNot |
같지 않음(대소문자 구분) |
:= |
EqualsCaseInsensitive |
같지만 대소문자를 구분하지 않음 |
> 또는 > |
GreaterThan |
보다 큼 Apigee UI에서 조건을 정의할 때 >를 사용하면 >로 변환됩니다. |
>= 또는 >= |
GreaterThanOrEquals |
크거나 같음 Apigee UI에서 조건을 정의할 때 >= 를 사용하면 >=로 변환됩니다. |
< |
LesserThan |
보다 작음 Apigee UI는 리터럴 <를 지원하지 않습니다. |
<= |
LesserThanOrEquals |
작거나 같음 Apigee UI는 리터럴 <=를 지원하지 않습니다. |
&& |
And , and |
그리고 |
|| |
Or |
OR 연산자는 대소문자를 구분하지 않습니다. 예를 들어 OR , Or , or 는 모두 유효합니다. |
() |
표현식을 그룹화합니다. ( 는 표현식을 열고 ) 는 닫습니다. |
|
~~ |
JavaRegex |
|
~ |
Matches , Like |
* 와일드 카드 문자를 사용하는 glob 스타일 패턴과 일치합니다. 일치시킬 때 대소문자를 구분합니다. 예시는 패턴 일치를 참조하세요. |
~/ |
MatchesPath , LikePath |
경로 표현식과 일치합니다. 일치시킬 때 대소문자를 구분합니다. 예시는 패턴 일치를 참조하세요. |
=| |
StartsWith |
문자열의 첫 번째 문자와 일치합니다. 일치시킬 때 대소문자를 구분합니다. |
피연산자
Apigee는 피연산자를 비교하기 전에 공통 데이터 유형에 맞게 피연산자를 조정합니다. 예를 들어 응답 상태 코드가 404
인 경우 표현식 response.status.code = "400"
과 response.status.code = 400
은 동일합니다.
숫자 피연산자의 경우, 다음과 같이 종료되지 않는 한 데이터 유형은 정수로 해석됩니다.
f
또는F
(float
, 예시:3.142f, 91.1F
)d
또는D
(double
, 예시:3.142d, 100.123D
)l
또는L
(long
, 예시:12321421312L
)
이러한 경우 시스템은 다음 표에 표시된 조정 작업을 수행합니다. 여기서 RHS는 등식의 오른쪽을 나타내며 LHS는 왼쪽을 의미합니다.
RHS LHS | 불리언 | 정수 | Long | Float | Double | 문자열 | 비교 가능 | 객체 |
---|---|---|---|---|---|---|---|---|
불리언 | 불리언 | 정수 | Long | Float | Double | 문자열 | - | |
정수 | 정수 | 정수 | Long | Float | Double | 문자열 | 비교 가능 | - |
Long | Long | Long | Long | Float | Double | 문자열 | 비교 가능 | - |
부동 소수점 수 | 부동 소수점 수 | 부동 소수점 수 | 부동 소수점 수 | 부동 소수점 수 | Double | 문자열 | 비교 가능 | - |
Double | Double | Double | Double | Double | Double | 문자열 | 비교 가능 | - |
문자열 | 문자열 | 문자열 | 문자열 | 문자열 | 문자열 | 문자열 | 비교 가능 | - |
비교 가능 | 비교 가능 | 비교 가능 | 비교 가능 | 비교 가능 | 비교 가능 | 비교 가능 | 비교 가능 | - |
객체 | - | - | - | - | - | - | - | - |
Null 피연산자
다음은 표시된 피연산자의 좌항(LHS) 및 우항(RHS) 값이 null일 때 조건이 true
인지 false
인지 평가하는 표입니다.
연산자 | LHS null | RHS null | LHS 및 RHS null |
---|---|---|---|
= , == , := |
false | false | true |
=| |
false | false | false |
!= |
true | true | false |
> 또는 > |
true | false | false |
>= 또는 >= |
false | true | true |
< |
true | false | false |
<= |
true | false | true |
~ |
false | 해당 사항 없음 | false |
~~ |
false | 해당 사항 없음 | false |
!~ |
true | false | false |
~/ |
false | 해당 사항 없음 | false |
리터럴
문자열 및 숫자 리터럴 외에도 조건문에는 다음과 같은 리터럴을 사용할 수 있습니다.
null
true
false
예를 들면 다음과 같습니다.
request.header.host is null
flow.cachehit is true
예시
<RouteRule name="default"> <Condition>request.header.content-type = "text/xml"</Condition> <TargetEndpoint>XmlTargetEndpoint</TargetEndpoint> </RouteRule>
<Step> <Condition>response.status.code = 503</Condition> <Name>MaintenancePolicy</Name> </Step>
<Flow name="GetRequests"> <Condition>response.verb="GET"</Condition> <Request> <Step> <Condition>request.path ~ "/statuses/**"</Condition> <Name>StatusesRequestPolicy</Name> </Step> </Request> <Response> <Step> <Condition>(response.status.code = 503) or (response.status.code = 400)</Condition> <Name>MaintenancePolicy</Name> </Step> </Response> </Flow>