조건 참조

이 페이지는 ApigeeApigee 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>

흐름 실행

조건문을 사용하면 ProxyEndpointsTargetEndpoints에서 이름이 지정된 흐름 실행을 제어할 수 있습니다. 이름이 지정된 흐름만 조건부로 실행할 수 있다는 점에 유의하세요. ProxyEndpointsTargetEndpoints에서의 사전 흐름 및 사후 흐름(요청 및 응답 모두)이 모든 트랜잭션에서 실행되므로 비조건부 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와는 일치하지 않습니다.

변수

조건문에서 기본 제공 흐름 변수와 맞춤 변수를 모두 사용할 수 있습니다. 자세한 내용은 다음을 참고하세요.

연산자

연산자를 사용할 때는 다음 제한사항을 준수하세요.

  • 연산자는 변수 이름으로 사용할 수 없습니다.
  • 연산자 앞뒤에 공백이 있어야 합니다.
  • 변수에 연산자를 포함하려면 변수 이름을 작은따옴표로 묶어야 합니다(예: 'request.header.help!me').
  • 산술 연산자(+ * - / %)는 지원되지 않습니다.
  • 자바 우선순위가 연산자에 사용됩니다.
  • Apigee는 java.util.regex에서 구현된 정규 표현식을 사용합니다.

다음은 지원되는 연산자를 정리한 표입니다. 표현식에 기호나 단어를 사용할 수 있습니다.

기호 Word 설명
! Not, not 단항 연산자(단일 입력 사용)
= Equals, Is 같음 (대소문자 구분)
!= NotEquals, IsNot 같지 않음(대소문자 구분)
:= EqualsCaseInsensitive 같지만 대소문자를 구분하지 않음
> 또는 &gt; GreaterThan 보다 큼 Apigee UI에서 조건을 정의할 때 >를 사용하면 &gt로 변환됩니다.
>= 또는 &gt;= GreaterThanOrEquals 크거나 같음 Apigee UI에서 조건을 정의할 때 >= 를 사용하면 &gt;=로 변환됩니다.
&lt; LesserThan 보다 작음 Apigee UI는 리터럴 <를 지원하지 않습니다.
&lt;= LesserThanOrEquals 작거나 같음 Apigee UI는 리터럴 <=를 지원하지 않습니다.
&& And, and 그리고
|| Or OR 연산자는 대소문자를 구분하지 않습니다. 예를 들어 OR, Or, or는 모두 유효합니다.
() 표현식을 그룹화합니다. (는 표현식을 열고 )는 닫습니다.
~~ JavaRegex

javax.util.regex를 준수하는 정규 표현식과 일치합니다. 일치시킬 때 대소문자를 구분합니다. 예시는 패턴 일치를 참조하세요.

~ 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 부동 소수점 수 실수 문자열 비교 가능 객체
부울 부울 정수 Long 부동 소수점 수 실수 문자열 -
정수 정수 정수 Long 부동 소수점 수 실수 문자열 비교 가능 -
Long Long Long Long 부동 소수점 수 실수 문자열 비교 가능 -
부동 소수점 수 부동 소수점 수 부동 소수점 수 부동 소수점 수 부동 소수점 수 실수 문자열 비교 가능 -
실수 실수 실수 실수 실수 실수 문자열 비교 가능 -
문자열 문자열 문자열 문자열 문자열 문자열 문자열 비교 가능 -
비교 가능 비교 가능 비교 가능 비교 가능 비교 가능 비교 가능 비교 가능 비교 가능 -
객체 - - - - - - - -

Null 피연산자

다음은 표시된 피연산자의 좌항(LHS) 및 우항(RHS) 값이 null일 때 조건이 true인지 false인지 평가하는 표입니다.

연산자 LHS null RHS null LHS 및 RHS null
=, ==, := false false true
=| false false false
!= true true false
> 또는 &gt; true false false
>= 또는 &gt;= false true true
&lt; true false false
&lt;= 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>