조건 참조

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

조건을 통해 API 프록시가 런타임 시 동적으로 작동할 수 있습니다. 조건은 Apigee Edge 처리 파이프라인에서 평가하는 변수 작업을 정의합니다. 조건문은 부울이며 항상 true 또는 false로 평가됩니다.

조건 개요

이 섹션에서는 Edge에서 조건문을 사용하는 방법과 위치를 설명합니다. 또한 다음 섹션에서는 구문을 설명합니다.

조건문 구조

조건문의 기본 구조는 다음과 같습니다.

<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에서의 사전 흐름 및 사후 흐름(요청 및 응답 둘 다)은 모든 트랜잭션에서 실행되므로 조건부 '실패 방지' 기능을 제공합니다.

요청 메시지의 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 Edge는 java.util.regex에 구현된 정규 표현식을 사용합니다.

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

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

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

~ Matches, Like '*' 와일드 카드 문자를 사용하는 glob 스타일 패턴과 일치합니다. 일치시킬 때 대소문자를 구분합니다. 예시를 보려면 조건을 통한 패턴 일치를 참조하세요.
~/ MatchesPath, LikePath 경로 표현식과 일치합니다. 일치시킬 때 대소문자를 구분합니다. 예시를 보려면 조건을 통한 패턴 일치를 참조하세요.
=| StartsWith 문자열의 첫 번째 문자와 일치합니다. 일치시킬 때 대소문자를 구분합니다.

피연산자

Apigee Edge는 피연산자를 비교하기 전에 일반적인 데이터 유형에 맞게 조정합니다. 예를 들어 응답 상태 코드가 404인 경우 표현식 response.status.code = "400"response.status.code = 400은 동일합니다.

숫자 피연산자의 경우, 다음과 같이 종료되지 않는 한 데이터 유형은 정수로 해석됩니다.

  • "f" 또는 "F" (부동 소수점, 예시: 3.142f, 91.1F)
  • "d" 또는 "D" (double, 예시: 3.142d, 100.123D)
  • "l" 또는 "L" (long, 예시: 12321421312L)

이러한 경우 시스템은 다음 표에 표시된 조정 작업을 수행합니다. 여기서 RHS는 등식의 오른쪽을 나타내며 LHS는 왼쪽을 의미합니다.

RHS LHS 불리언 정수 Long 부동 소수점 Double 문자열 Comparable 객체
부울 불리언 정수 Long 부동 소수점 Double 문자열 -
정수 정수 정수 Long 부동 소수점 Double 문자열 Comparable -
Long 부동 소수점 Double 문자열 Comparable -
부동 소수점 부동 소수점 부동 소수점 부동 소수점 부동 소수점 Double 문자열 Comparable -
Double Double Double Double Double Double 문자열 Comparable -
문자열 문자열 문자열 문자열 문자열 문자열 문자열 Comparable -
Comparable Comparable Comparable Comparable Comparable Comparable Comparable Comparable -
객체 - - - - - - - -

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 N/A false
~~ false N/A false
!~ true false false
~/ false N/A 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>