เทมเพลตข้อความ

คุณกำลังดูเอกสารประกอบของ Apigee Edge
ไปที่เอกสารประกอบของ Apigee X
info

หัวข้อนี้จะอธิบายวิธีใช้เทมเพลตข้อความในพร็อกซี API และให้ข้อมูลอ้างอิงฟังก์ชัน

เทมเพลตข้อความคืออะไร

เทมเพลตข้อความช่วยให้คุณทำการแทนที่สตริงตัวแปรในนโยบายและองค์ประกอบ TargetEndpoint บางอย่างได้ ฟีเจอร์นี้ช่วยให้คุณป้อนข้อมูลสตริงแบบไดนามิกเมื่อพร็อกซีดำเนินการได้ (หากรองรับ)

คุณสามารถรวมการอ้างอิงตัวแปรโฟลว์และข้อความตามตัวอักษรในเทมเพลตข้อความได้ ชื่อตัวแปรโฟลว์ต้องอยู่ในวงเล็บปีกกา ส่วนข้อความที่ไม่อยู่ในวงเล็บปีกกาจะแสดงเป็นข้อความตามตัวอักษร

ดูเพิ่มเติมที่คุณใช้เทมเพลตข้อความได้ที่ไหนบ้าง

ตัวอย่าง

ตัวอย่างเช่น นโยบายกำหนดข้อความช่วยให้คุณใช้เทมเพลตข้อความภายในองค์ประกอบ <Payload> ได้

<AssignMessage name="set-dynamic-content">
  <AssignTo createNew="false" type="response"></AssignTo>
  <Set>
    <Payload contentType="application/json">
      {"name":"Alert", "message":"You entered an invalid username: {user.name}"}
    </Payload>
  </Set>
  <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
</AssignMessage>

ในตัวอย่างข้างต้น ค่าของตัวแปรโฟลว์ user.name (ในวงเล็บปีกกา) จะได้รับการ ประเมินและแทนที่ลงในสตริงเพย์โหลดที่รันไทม์ เช่น หาก user.name=jdoe, เอาต์พุตข้อความที่ได้ในเพย์โหลดจะเป็น You entered an invalid username: jdoe หากไม่สามารถระบุตัวแปรได้ ระบบจะแสดงสตริงว่าง

ตัวอย่าง

เมื่อใช้โควต้าเกิน ขอแนะนำให้ส่งข้อความที่มีความหมายกลับไปยังผู้โทร รูปแบบนี้ ใช้กันโดยทั่วไปกับ "กฎข้อผิดพลาด" เพื่อแสดงเอาต์พุตที่ให้ข้อมูลแก่ผู้โทร เกี่ยวกับการละเมิดโควต้า ในนโยบายการกำหนดข้อความต่อไปนี้ ระบบจะใช้เทมเพลตข้อความ เพื่อป้อนข้อมูลโควต้าแบบไดนามิกในองค์ประกอบ XML หลายรายการ

<AssignMessage name='AM-QuotaViolationMessage'>
  <Description>message for quota exceeded</Description>
  <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
  <Set>
    <Headers>
      <Header name='X-Quota-Reset'>{ratelimit.Quota-1.expiry.time}</Header>
      <Header name='X-Quota-Allowed'>{ratelimit.Quota-1.allowed.count}</Header>
      <Header name='X-Quota-Available'>{ratelimit.Quota-1.available.count}</Header>
    </Headers>
    <Payload contentType='application/json'>{
  "error" : {
    "message" : "you have exceeded your quota",
    "clientId" : "{request.queryparam.apikey}"
  }
}
    </Payload>
    <StatusCode>429</StatusCode>
    <ReasonPhrase>Quota Exceeded</ReasonPhrase>
  </Set>
</AssignMessage>

ในนโยบาย AssignMessage องค์ประกอบต่อไปนี้ในองค์ประกอบ <Set> รองรับการสร้างเทมเพลตข้อความ

  • ส่วนหัว
  • QueryParam
  • FormParam
  • PayLoad
  • เวอร์ชัน
  • คำกริยา
  • เส้นทาง
  • StatusCode
  • ReasonPhrase

โปรดทราบอีกครั้งว่าตัวแปรโฟลว์ในเทมเพลตข้อความต้องอยู่ในเครื่องหมายปีกกา

เมื่อนโยบายนี้ทำงาน

  • องค์ประกอบส่วนหัวจะได้รับค่าของตัวแปรโฟลว์ที่ระบุ
  • เพย์โหลดประกอบด้วยข้อความตามตัวอักษรและตัวแปร (client_id จะได้รับการป้อนข้อมูลแบบไดนามิก)
  • StatusCode และ ReasonPhrase จะมีเฉพาะข้อความตามตัวอักษรเท่านั้น แต่องค์ประกอบเหล่านี้ยังรองรับการใช้เทมเพลตข้อความด้วยหากคุณต้องการ

ตัวอย่าง

ในคำจำกัดความ TargetEndpoint ของพร็อกซี องค์ประกอบย่อยของ <SSLInfo> รองรับการสร้างเทมเพลตข้อความ เมื่อพร็อกซีดำเนินการ ระบบจะแทนที่ตัวแปรโฟลว์ในวงเล็บปีกกาตามรูปแบบเดียวกันกับที่ใช้ในนโยบาย

<TargetEndpoint name="default">
  
  <HTTPTargetConnection>
    <SSLInfo>
        <Enabled>{myvars.ssl.enabled}</Enabled>
        <ClientAuthEnabled>{myvars.ssl.client.auth.enabled}</ClientAuthEnabled>
        <KeyStore>{myvars.ssl.keystore}</KeyStore>
        <KeyAlias>{myvars.ssl.keyAlias}</KeyAlias>
        <TrustStore>{myvars.ssl.trustStore}</TrustStore>
    </SSLInfo>

  </HTTPTargetConnection>
  
</TargetEndpoint>

คุณใช้เทมเพลตข้อความได้ที่ไหนบ้าง

เทมเพลตข้อความรองรับในนโยบายหลายรายการ รวมถึงองค์ประกอบบางอย่างที่ใช้ในการกำหนดค่า TargetEndpoint

นโยบายที่ยอมรับเทมเพลตข้อความ

นโยบาย องค์ประกอบและองค์ประกอบย่อยที่รองรับเทมเพลตข้อความ
นโยบาย AccessControl <SourceAddress> สำหรับแอตทริบิวต์ mask และที่อยู่ IP
นโยบาย AssignMessage <Set> องค์ประกอบย่อย: Payload, ContentType, Verb, Version, Path, StatusCode, ReasonPhrase, Headers, QueryParams, FormParams

องค์ประกอบย่อย <Add>: Headers, QueryParams, FormParams

องค์ประกอบย่อย <AssignVariable>: <Template>

นโยบาย ExtensionCallout <Input>
นโยบาย ExtractVariables <JsonPath>
นโยบาย GenerateJWS
นโยบาย VerifyJWS
<Payload> (นโยบาย GenerateJWS เท่านั้น)

<AdditionalHeaders><Claim>

* องค์ประกอบเหล่านี้รองรับเทมเพลตข้อความเมื่อ type=map เท่านั้น

นโยบาย GenerateJWT
นโยบาย VerifyJWT
<AdditionalClaims><Claim>

<AdditionalHeaders><Claim>

* องค์ประกอบเหล่านี้รองรับเทมเพลตข้อความเมื่อ type=map เท่านั้น

นโยบาย LDAP <SearchQuery>
นโยบาย MessageLogging <Syslog><Message>

<File><Message>

นโยบาย OASValidation องค์ประกอบ <OASResource>
นโยบาย RaiseFault <Set> elements: Payload, ContentType, Verb, Version, Path, StatusCode, ReasonPhrase, Headers, QueryParams, FormParams

<Add> elements: Headers, QueryParams, FormParams

นโยบาย SAMLAssertion <Template>

* เฉพาะเมื่อลายเซ็นนโยบายเป็น <GenerateSAMLAssertion>

นโยบาย ServiceCallout <Set> elements: Payload, ContentType, Verb, Version, Path, StatusCode, ReasonPhrase, /Headers, QueryParams, FormParams

<Add> elements: Headers, QueryParams, FormParams

<HTTPTargetConnection>/<URL>: โปรดทราบว่าส่วนแรกของสตริงต้องเป็น http หรือ https

องค์ประกอบ TargetEndpoint ที่ยอมรับเทมเพลตข้อความ

องค์ประกอบ HTTPTargetConnection องค์ประกอบย่อยที่รองรับเทมเพลตข้อความ
SSLInfo Enabled, KeyAlias, KeyStore, TrustStore, ClientAuthEnabled, CLRStore
LocalTargetConnection ApiProxy, ProxyEndpoint
เส้นทาง เมื่อใช้องค์ประกอบ LoadBalancer องค์ประกอบ Path จะใช้งานได้และยอมรับเทมเพลตข้อความ

ไวยากรณ์เทมเพลตข้อความ

ส่วนนี้จะอธิบายกฎที่คุณต้องปฏิบัติตามเพื่อใช้เทมเพลตข้อความ

ใช้เครื่องหมายปีกกาเพื่อระบุตัวแปร

ใส่วงเล็บปีกกา { } ครอบชื่อตัวแปร หากไม่มีตัวแปร ระบบจะแสดงผลสตริงว่างเปล่าในเอาต์พุต อย่างไรก็ตาม คุณสามารถระบุค่าเริ่มต้นในเทมเพลตข้อความได้ (ค่าที่จะใช้แทนหากตัวแปรไม่ได้รับการแก้ไข) ดู การตั้งค่าเริ่มต้นในเทมเพลตข้อความ

โปรดทราบว่าคุณสามารถใส่สตริงเทมเพลตข้อความทั้งหมดไว้ในเครื่องหมายคำพูดได้ แต่ไม่บังคับ ตัวอย่างเช่น เทมเพลตข้อความ 2 รายการต่อไปนี้มีความหมายเหมือนกัน

<Set>
    <Headers>
        <Header name="x-h1">"Hello {user.name}"</Header>
        <Header name="x-h1">Hello {user.name}</Header>
    </Headers>
</Set>

การตั้งค่าเริ่มต้นในเทมเพลตข้อความ

หากแก้ไขตัวแปรที่ใช้เทมเพลตไม่ได้ Edge จะแทนที่ด้วยสตริงว่าง อย่างไรก็ตาม คุณสามารถระบุค่าเริ่มต้นได้ดังนี้

<Header name="x-h1">Test message. id = {request.header.id:Unknown}</Header>

ในตัวอย่างข้างต้น หากไม่สามารถระบุตัวแปร request.header.id ได้ ระบบจะแทนที่ค่าด้วย Unknown เช่น

Test message. id = Unknown

ไม่อนุญาตให้เว้นวรรคในนิพจน์ฟังก์ชัน

ไม่อนุญาตให้มีช่องว่างในนิพจน์ฟังก์ชันของเทมเพลตข้อความ เช่น

ตัวอย่างที่อนุญาต

{substring(alpha,0,4)}
{createUuid()}
{randomLong(10)}

ไม่อนุญาต

{substring( alpha, 0, 4 )}
{ createUuid( ) }
{randomLong( 10 )}

ไวยากรณ์เดิมสำหรับเพย์โหลด JSON

ใน Edge เวอร์ชันก่อน Cloud เวอร์ชัน 16.08.17 คุณไม่ สามารถใช้วงเล็บปีกกาเพื่อระบุการอ้างอิงตัวแปรภายในเพย์โหลด JSON ได้ ในเวอร์ชันเก่ากว่านั้น คุณ ต้องใช้แอตทริบิวต์ variablePrefix และ variableSuffix เพื่อระบุ อักขระคั่น และใช้อักขระเหล่านั้นเพื่อครอบชื่อตัวแปร ดังนี้

<Set>
  <Payload contentType="application/json" variablePrefix="@" variableSuffix="#">
    {"name":"foo", "type":"@variable_name#"}
  </Payload>
</Set>

แม้ว่า Apigee จะแนะนำให้คุณใช้ไวยากรณ์วงเล็บปีกกาแบบใหม่ แต่ไวยากรณ์แบบเก่าก็ยังใช้งานได้

การใช้ฟังก์ชันเทมเพลตข้อความ

Edge มีชุดฟังก์ชันที่คุณใช้ภายในเทมเพลตข้อความเพื่อหลีกเลี่ยงการเปลี่ยนแปลง, เข้ารหัส, แฮช และจัดรูปแบบตัวแปรสตริงได้

ฟังก์ชันเทมเพลตข้อความมีคำอธิบายโดยละเอียดในการอ้างอิงฟังก์ชันเทมเพลตข้อความ

ตัวอย่าง: toLowerCase()

ใช้ฟังก์ชัน toLowerCase() ในตัวเพื่อเปลี่ยนตัวแปรสตริงเป็น ตัวพิมพ์เล็ก

<AssignMessage name="AM-Set-Custom-Response">
    <AssignTo createNew="false" type="response"/>
    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
    <Set>
        <Headers>
            <Header name="x-h1">Test header: {toLowerCase(foo.bar:FOO)}</Header>
        </Headers>
    </Set>
</AssignMessage>

หากfoo.barตัวแปรโฟลว์ได้รับการแก้ไข อักขระทั้งหมดจะเป็นตัวพิมพ์เล็ก หาก foo.bar ไม่ได้รับการแก้ไข ระบบจะแทนที่ด้วยค่าเริ่มต้น FOO และแปลงเป็นอักขระตัวพิมพ์เล็ก เช่น

Test header: foo

ตัวอย่าง: escapeJSON()

ต่อไปนี้คือกรณีการใช้งานที่น่าสนใจ สมมติว่าแอปแบ็กเอนด์แสดงผลการตอบกลับเป็น JSON ที่มีอักขระหลีกที่ถูกต้อง เช่น

{
      "code": "INVALID",
      "user_message": "Invalid value for \"logonId\" check your input."
}

จากนั้น สมมติว่าคุณต้องการส่งข้อความนี้กลับไปยังผู้โทรที่เป็นไคลเอ็นต์ในเพย์โหลดที่กำหนดเอง โดยปกติแล้ว วิธีการนี้คือการแยกข้อความจากเพย์โหลดการตอบกลับเป้าหมาย แล้วใช้ Assign Message เพื่อเพิ่มข้อความลงในการตอบกลับของพร็อกซีที่กำหนดเอง (นั่นคือส่งกลับไปยังไคลเอ็นต์)

ต่อไปนี้คือนโยบาย Extract Variables ที่ดึงข้อมูล user_message ไปยังตัวแปรที่ชื่อ standard.systemMessage

<ExtractVariables name="EV-BackendErrorResponse">
    <DisplayName>EV-BackendErrorResponse</DisplayName>
    <JSONPayload>
        <Variable name="standard.systemMessage">
            <JSONPath>$.user_message</JSONPath>
        </Variable>
    </JSONPayload>
</ExtractVariables>

ตอนนี้เรามาดูนโยบาย Assign Message ที่ถูกต้องอย่างสมบูรณ์ซึ่งจะเพิ่มตัวแปรที่แยกออกมาไปยังเพย์โหลดการตอบกลับ (การตอบกลับของพร็อกซี)

<AssignMessage name="AM-SetStandardFaultResponse">
    <DisplayName>AM-SetStandardFaultResponse</DisplayName>
    <Set>
        <Payload contentType="application/json">
           {
              "systemMessage": "{standard.systemMessage}"
           }
        </Payload>
    </Set>
    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
    <AssignTo createNew="false" transport="http" type="response"/>
</AssignMessage>


ขออภัย เกิดปัญหาขึ้น นโยบาย Extract Variables นำอักขระเครื่องหมายคำพูดที่หลีกเลี่ยงแล้วออกจากข้อความบางส่วน ซึ่งหมายความว่าการตอบกลับที่ส่งคืนไปยังไคลเอ็นต์เป็น JSON ที่ไม่ถูกต้อง นี่ไม่ใช่สิ่งที่คุณต้องการอย่างแน่นอน

{
    "systemMessage": "Invalid value for "logonId" check your input."
}

หากต้องการแก้ไขปัญหานี้ คุณสามารถแก้ไขนโยบาย Assign Message เพื่อใช้ฟังก์ชันเทมเพลตข้อความที่หลีกเลี่ยงเครื่องหมายคำพูดภายใน JSON ให้คุณได้ ฟังก์ชัน escapeJSON() นี้จะกำหนดเป็นอักขระหลีกสำหรับเครื่องหมายคำพูดหรืออักขระพิเศษอื่นๆ ที่เกิดขึ้นภายในนิพจน์ JSON

<AssignMessage name="AM-SetStandardFaultResponse">
    <DisplayName>AM-SetStandardFaultResponse</DisplayName>
    <Set>
        <Payload contentType="application/json">
           {
              "systemMessage": "{escapeJSON(standard.systemMessage)}"
           }
        </Payload>
    </Set>
    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
    <AssignTo createNew="false" transport="http" type="response"/>
</AssignMessage>


ฟังก์ชันจะกำหนดเครื่องหมายคำพูดที่ฝังเป็นอักขระหลีก ทำให้ได้ JSON ที่ถูกต้อง ซึ่งตรงกับสิ่งที่คุณต้องการ

{
      "systemMessage": "Invalid value for \"logonId\" check your input.",
}

เทมเพลตข้อความคือฟีเจอร์การแทนที่สตริงแบบไดนามิกที่คุณใช้ได้ในนโยบายบางอย่างและในคำจำกัดความ TargetEndpoint ฟังก์ชันเทมเพลตข้อความช่วยให้คุณดำเนินการที่เป็นประโยชน์ได้ เช่น การแฮช การจัดการสตริง การหลีกอักขระ และอื่นๆ ภายในเทมเพลตข้อความ

ตัวอย่างเช่น ในนโยบาย AssignMessage ต่อไปนี้ มีการใช้ฟังก์ชัน toLowerCase() ในเทมเพลตข้อความ

<AssignMessage name="AM-Set-Custom-Response">
    <AssignTo createNew="false" type="response"/>
    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
    <Set>
       <Headers>
         <Header name="x-h1">Test header: {Hello, toLowerCase(user.name)}</Header>
       </Headers>
    </Set>
</AssignMessage>

หัวข้อนี้อธิบายฟังก์ชันเทมเพลตข้อความ อาร์กิวเมนต์ และเอาต์พุต หัวข้อนี้ถือว่าคุณคุ้นเคยกับเทมเพลตข้อความและบริบทที่ใช้เทมเพลต

ฟังก์ชันแฮช

คำนวณค่าแฮชและแสดงผลการแสดงสตริงของแฮชนั้น

ฟังก์ชันแฮชฐานสิบหก

คำนวณค่าแฮชและแสดงผลการแสดงสตริงของแฮชนั้นเป็นตัวเลขฐานสิบหก

ไวยากรณ์

การทำงาน คำอธิบาย
md5Hex(string) คำนวณแฮช MD5 ที่แสดงเป็นเลขฐานสิบหก
sha1Hex(string) คำนวณแฮช SHA1 ที่แสดงเป็นเลขฐานสิบหก
sha256Hex(string) คำนวณแฮช SHA256 ที่แสดงเป็นเลขฐานสิบหก
sha384Hex(string) คำนวณแฮช SHA384 ที่แสดงเป็นเลขฐานสิบหก
sha512Hex(string) คำนวณแฮช SHA512 ที่แสดงเป็นเลขฐานสิบหก

อาร์กิวเมนต์

สตริง - ฟังก์ชันแฮชจะใช้อาร์กิวเมนต์สตริงเดียวเมื่อ มีการคำนวณอัลกอริทึมแฮช อาร์กิวเมนต์อาจเป็นสตริงตัวอักษรหรือตัวแปรโฟลว์สตริงก็ได้

ตัวอย่าง

การเรียกใช้ฟังก์ชัน

sha256Hex('abc')

ผลลัพธ์:

ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad

การเรียกใช้ฟังก์ชัน

var str = 'abc';
sha256Hex(str)

ผลลัพธ์:

ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad

ฟังก์ชันแฮช Base64

คำนวณค่าแฮชและแสดงผลการแสดงสตริงของแฮชนั้นเป็นค่าที่เข้ารหัส Base64

ไวยากรณ์

การทำงาน คำอธิบาย
md5Base64(string) คำนวณแฮช MD5 ที่แสดงเป็นค่าที่เข้ารหัส Base64
sha1Base64(string) คำนวณแฮช SHA1 ที่แสดงเป็นค่าที่เข้ารหัส Base64
sha256Base64(string) คำนวณแฮช SHA256 ที่แสดงเป็นค่าที่เข้ารหัส Base64
sha384Base64(string) คำนวณแฮช SHA384 ที่แสดงเป็นค่าที่เข้ารหัส Base64
sha512Base64(string) คำนวณแฮช SHA512 ที่แสดงเป็นค่าที่เข้ารหัส Base64

อาร์กิวเมนต์

สตริง - ฟังก์ชันแฮชจะใช้อาร์กิวเมนต์สตริงเดียวเมื่อ มีการคำนวณอัลกอริทึมแฮช อาร์กิวเมนต์อาจเป็นสตริงตัวอักษรหรือตัวแปรโฟลว์สตริง

ตัวอย่าง

การเรียกใช้ฟังก์ชัน

sha256Base64('abc')

ผลลัพธ์:

ungWv48Bz+pBQUDeXa4iI7ADYaOWF3qctBD/YfIAFa0=

การเรียกใช้ฟังก์ชัน

var str = 'abc';
sha256Base64(str)

ผลลัพธ์:

ungWv48Bz+pBQUDeXa4iI7ADYaOWF3qctBD/YfIAFa0=

ฟังก์ชันสตริง

ดำเนินการกับสตริงภายในเทมเพลตข้อความ

ฟังก์ชันการเข้ารหัส Base64

เข้ารหัสและถอดรหัสสตริงโดยใช้รูปแบบการเข้ารหัส Base64

ไวยากรณ์

การทำงาน คำอธิบาย
encodeBase64(string) เข้ารหัสสตริงโดยใช้การเข้ารหัส Base64 เช่น encodeBase64(value) เมื่อ value มีค่า abc ฟังก์ชันจะแสดงผลสตริง YWJj
decodeBase64(string) ถอดรหัสสตริงที่เข้ารหัส Base64 เช่น decodeBase64(value) เมื่อ value มีค่า aGVsbG8sIHdvcmxk ฟังก์ชันจะแสดงผลสตริง hello, world

อาร์กิวเมนต์

string - สตริงที่จะเข้ารหัสหรือถอดรหัส อาจเป็นสตริงตามตัวอักษรหรือตัวแปรโฟลว์สตริง

ตัวอย่าง

<AssignMessage name="AM-Set-Custom-Response">
    <AssignTo createNew="false" type="response"/>
    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
    <Set>
       <Headers>
         <Header name="x-h1">Hello, {decodeBase64('d29ybGQK')}</Header>
       </Headers>
    </Set>
</AssignMessage>

ฟังก์ชันการแปลงตัวพิมพ์

แปลงสตริงเป็นตัวพิมพ์ใหญ่ทั้งหมดหรือตัวพิมพ์เล็กทั้งหมด

ไวยากรณ์

การทำงาน คำอธิบาย
toUpperCase(string) แปลงสตริงเป็นตัวพิมพ์ใหญ่
toLowerCase(string) แปลงสตริงเป็นตัวพิมพ์เล็ก


อาร์กิวเมนต์

string - สตริงที่จะแปลง อาจเป็นสตริงตามตัวอักษรหรือตัวแปรโฟลว์สตริง

ตัวอย่าง

<AssignMessage name="AM-Set-Custom-Response">
    <AssignTo createNew="false" type="response"/>
    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
    <Set>
       <Headers>
         <Header name="x-h1">Hello, {toLowerCase(user.name)}</Header>
       </Headers>
    </Set>
</AssignMessage>

ฟังก์ชันสตริงย่อย

แสดงผลอักขระระหว่างดัชนีเริ่มต้นและดัชนีสิ้นสุดของสตริงที่ระบุ

ไวยากรณ์

substring(str,start_index,end_index)

อาร์กิวเมนต์

  • str - สตริงตัวอักษรหรือตัวแปรโฟลว์สตริง
  • start_index - ดัชนีเริ่มต้นในสตริง
  • end_index - (ไม่บังคับ) ดัชนีสิ้นสุดในสตริง หากไม่ได้ระบุไว้ ดัชนีสิ้นสุด คือจุดสิ้นสุดของสตริง

ตัวอย่าง

สำหรับตัวอย่างต่อไปนี้ สมมติว่ามีตัวแปรโฟลว์ต่อไปนี้

ชื่อตัวแปร ค่า
alpha กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรลวศษสหฬอฮ
seven 7


ต่อไปนี้คือผลลัพธ์ของการเรียกใช้ฟังก์ชันที่ใช้ตัวแปรเหล่านี้

นิพจน์เทมเพลตข้อความ ผลลัพธ์
{substring(alpha,22)} WXYZ
hello {substring(alpha,22)} hello WXYZ
{substring(alpha,-4)} WXYZ
{substring(alpha,-8,-4)} STUV
{substring(alpha,0,10)} ABCDEFGHIJ
{substring(alpha,0,seven)} ABCDEFG

ฟังก์ชันแทนที่ทั้งหมด

ใช้นิพจน์ทั่วไปกับสตริง และแทนที่ค่าที่ตรงกันด้วยค่าการแทนที่

ไวยากรณ์

replaceAll(string,regex,value)

อาร์กิวเมนต์

  • string - สตริงตามตัวอักษรหรือตัวแปรโฟลว์สตริงที่จะใช้แทนที่
  • regex - นิพจน์ทั่วไป
  • value - ค่าที่จะแทนที่การจับคู่นิพจน์ทั่วไปทั้งหมดภายในสตริง

ตัวอย่าง

สำหรับตัวอย่างต่อไปนี้ สมมติว่ามีตัวแปรโฟลว์ต่อไปนี้

ชื่อตัวแปร ค่า
header Bearer ABCDEFGHIJKLMNOPQRSTUVWXYZ-9993
regex1 "^Bearer "
replacement "TOKEN: "

ผลลัพธ์ของการเรียกใช้ฟังก์ชันที่ใช้ตัวแปรเหล่านี้มีดังนี้

นิพจน์เทมเพลตข้อความ ผลลัพธ์
{replaceAll(header,"9993",'')} Bearer ABCDEFGHIJKLMNOPQRSTUVWXYZ-
{replaceAll(header,regex1,'')} ABCDEFGHIJKLMNOPQRSTUVWXYZ-9993
{replaceAll(header,regex1,replacement)} TOKEN: ABCDEFGHIJKLMNOPQRSTUVWXYZ-9993

ฟังก์ชัน Replace First

แทนที่เฉพาะการเกิดครั้งแรกของการจับคู่นิพจน์ทั่วไปที่ระบุในสตริง

ไวยากรณ์

replaceFirst(string,regex,value)

อาร์กิวเมนต์

  • string - สตริงตามตัวอักษรหรือตัวแปรโฟลว์สตริงที่จะใช้แทนที่
  • regex - นิพจน์ทั่วไป
  • value - ค่าที่จะแทนที่การจับคู่นิพจน์ทั่วไปภายในสตริง

ฟังก์ชันการหลีกและการเข้ารหัสอักขระ

ฟังก์ชันที่หลีกเลี่ยงหรือเข้ารหัสอักขระพิเศษในสตริง

ไวยากรณ์

การทำงาน คำอธิบาย
escapeJSON(string) ใช้แบ็กสแลชเพื่อหลีกเครื่องหมายคำพูดคู่
escapeXML(string) แทนที่เครื่องหมายวงเล็บปีกกา เครื่องหมายอัญประกาศเดี่ยว เครื่องหมายอัญประกาศคู่ และเครื่องหมาย & ด้วยเอนทิตี XML ที่เกี่ยวข้อง ใช้สำหรับเอกสาร XML 1.0

escapeXML11(สตริง) ทำงานในลักษณะเดียวกับ escapeXML แต่ใช้กับเอนทิตี XML v1.1 ดูหมายเหตุการใช้งานด้านล่าง
encodeHTML(string) เข้ารหัสเครื่องหมายอัญประกาศเดี่ยว วงเล็บมุม และเครื่องหมายและ

อาร์กิวเมนต์

string - สตริงที่จะหลีกเลี่ยง อาจเป็นสตริงตามตัวอักษรหรือตัวแปรโฟลว์สตริง

หมายเหตุการใช้งาน

XML 1.1 สามารถแสดงอักขระควบคุมบางตัวได้ แต่ไม่สามารถแสดงไบต์ Null หรือจุดรหัส Unicode Surrogate ที่ไม่จับคู่ แม้ว่าจะมีการหลีกเลี่ยงแล้วก็ตาม ฟังก์ชัน escapeXML11() จะนำอักขระที่ไม่อยู่ในช่วงต่อไปนี้ออก

[#x1-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]

ฟังก์ชัน escapeXML11() จะหลีกเลี่ยงอักขระในช่วงต่อไปนี้

[#x1-#x8] | [#xB-#xC] | [#xE-#x1F] | [#x7F-#x84] | [#x86-#x9F]

ตัวอย่าง

สมมติว่ามีตัวแปรโฟลว์ชื่อ food ที่มีค่าเป็น "bread" & "butter" จากนั้นฟังก์ชันจะทำสิ่งต่อไปนี้

{escapeHTML(food)}

ซึ่งจะส่งผลดังนี้

&quot;bread&quot; &amp; &quot;butter&quot;

ฟังก์ชันรูปแบบเวลา

แสดงผลการแสดงสตริงของเวลาที่จัดรูปแบบในเขตเวลาท้องถิ่นหรือใน UTC

ไวยากรณ์

การทำงาน คำอธิบาย
timeFormat(format,str) แสดงผลวันที่ที่จัดรูปแบบในเขตเวลาท้องถิ่น
timeFormatMs(format,str) แสดงผลวันที่ที่จัดรูปแบบในเขตเวลาท้องถิ่น
timeFormatUTC(format,str) แสดงผลวันที่ที่จัดรูปแบบใน UTC
timeFormatUTCMs(format,str) แสดงผลวันที่ที่จัดรูปแบบใน UTC

อาร์กิวเมนต์

  • format - สตริงรูปแบบวันที่/เวลา อาจเป็นสตริงตามตัวอักษรหรือตัวแปรสตริง
  • str - ตัวแปรสตริงหรือโฟลว์สตริงที่มีค่าเวลา ค่าอาจเป็นวินาทีตั้งแต่ Epoch หรือมิลลิวินาทีตั้งแต่ Epoch สำหรับ timeFormatMs

ตัวอย่าง

สมมติว่ามีค่าต่อไปนี้และเขตเวลาท้องถิ่นคือแปซิฟิก

  • epoch_time_ms = 1494390266000
  • epoch_time = 1494390266
  • fmt1 = yyyy-MM-dd
  • fmt2 = yyyy-MM-dd HH-mm-ss
  • fmt3 = yyyyMMddHHmmss

ฟังก์ชันจะแสดงผลลัพธ์ต่อไปนี้

    ฟังก์ชัน เอาต์พุต
    timeFormatMs(fmt1,epoch_time_ms) 2017-05-09
    timeFormat(fmt1,epoch_time) 2017-05-09
    timeFormat(fmt2,epoch_time) 2017-05-09 21:24:26
    timeFormat(fmt3,epoch_time) 20170509212426
    timeFormatUTC(fmt1,epoch_time) 2017-05-10
    timeFormatUTC(fmt2,epoch_time) 2017-05-10 04:24:26
    timeFormatUTC(fmt3,epoch_time) 20170510042426

    ฟังก์ชันการคำนวณ HMAC

    ฟังก์ชันการคำนวณ HMAC เป็นอีกทางเลือกหนึ่งแทนการใช้นโยบาย HMAC เพื่อคำนวณ HMAC ฟังก์ชันเหล่านี้มีประโยชน์เมื่อทำการคำนวณ HMAC แบบเรียงซ้อน เช่น เมื่อใช้เอาต์พุตของ HMAC หนึ่งเป็นคีย์สำหรับ HMAC ที่สอง

    ไวยากรณ์

    การทำงาน คำอธิบาย
    hmacSha224(key,valueToSign[,keyencoding[,outputencoding]]) คำนวณ HMAC ด้วยฟังก์ชันแฮช SHA-224
    hmacSha256(key,valueToSign[,keyencoding[,outputencoding]]) เข้ารหัส HMAC ด้วยฟังก์ชันแฮช SHA-256
    hmacSha384(key,valueToSign[,keyencoding[,outputencoding]]) เข้ารหัส HMAC ด้วยฟังก์ชันแฮช SHA-384
    hmacSha512(key,valueToSign[,keyencoding[,outputencoding]]) เข้ารหัส HMAC ด้วยฟังก์ชันแฮช SHA-512
    hmacMd5(key,valueToSign[,keyencoding[,outputencoding]]) เข้ารหัส HMAC ด้วยฟังก์ชันแฮช MD5
    hmacSha1(key, valueToSign [,keyencoding[,outputencoding]]) เข้ารหัส HMAC ด้วยอัลกอริทึมการเข้ารหัส SHA-1

    อาร์กิวเมนต์

    • คีย์ - (ต้องระบุ) ระบุคีย์ลับที่เข้ารหัสเป็นสตริงซึ่งใช้ในการคำนวณ HMAC
    • valueToSign - (ต้องระบุ) ระบุข้อความที่จะลงนาม ควรเป็นสตริง
    • keyencoding - (ไม่บังคับ) ระบบจะถอดรหัสสตริงคีย์ลับตามการเข้ารหัสที่ระบุนี้ ค่าที่ถูกต้อง: hex, base16, base64, utf-8 ค่าเริ่มต้น: utf-8
    • outputencoding - (ไม่บังคับ) ระบุอัลกอริทึมการเข้ารหัสที่จะใช้สำหรับเอาต์พุต ค่าที่ถูกต้อง: hex, base16, base64 ค่าต่างๆ ไม่คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ โดย hex และ base16 เป็นคำพ้องความหมาย ค่าเริ่มต้น: base64

    ตัวอย่าง

    ตัวอย่างนี้ใช้นโยบาย AssignMessage เพื่อคำนวณ HMAC-256 และกำหนดให้กับตัวแปรโฟลว์

    <AssignMessage name='AM-HMAC-1'>
      <AssignVariable>
        <Name>valueToSign</Name>
        <Template>{request.header.apikey}.{request.header.date}</Template>
      </AssignVariable>
      <AssignVariable>
        <Name>hmac_value</Name>
        <Template>{hmacSha256(private.secretkey,valueToSign)}</Template>
      </AssignVariable>
    </AssignMessage>

    ตัวอย่างนี้แสดงวิธีสร้าง HMAC แบบเรียงซ้อนที่ใช้กับกระบวนการลงนาม ลายเซ็น AWS v4 ได้ ตัวอย่างนี้ใช้นโยบาย AssignMessage เพื่อสร้าง HMAC แบบเรียงซ้อน 5 ระดับที่ใช้ ในการคำนวณลายเซ็นสำหรับลายเซ็น AWS v4

    <AssignMessage name='AM-HMAC-AWS-1'>
      <!-- 1 -->
      <AssignVariable>
        <Name>DateValue</Name>
        <Template>{timeFormatUTCMs('yyyyMMdd',system.timestamp)}</Template>
      </AssignVariable>
      <!-- 2 -->
      <AssignVariable>
        <Name>FirstKey</Name>
        <Template>AWS4{private.secret_aws_access_key}</Template>
      </AssignVariable>
      <!-- 3 -->
      <AssignVariable>
        <Name>DateKey</Name>
        <Template>{hmacSha256(FirstKey,DateValue,'utf-8','base16')}</Template>
      </AssignVariable>
      <!-- 4 -->
      <AssignVariable>
        <Name>DateRegionKey</Name>
        <Template>{hmacSha256(DateKey,aws_region,'base16','base16')}</Template>
      </AssignVariable>
      <!-- 5 -->
      <AssignVariable>
        <Name>DateRegionServiceKey</Name>
        <Template>{hmacSha256(DateRegionKey,aws_service,'base16','base16')}</Template>
      </AssignVariable>
      <!-- 6 -->
      <AssignVariable>
        <Name>SigningKey</Name>
        <Template>{hmacSha256(DateRegionServiceKey,'aws4_request','base16','base16')}</Template>
      </AssignVariable>
      <!-- 7 -->
      <AssignVariable>
        <Name>aws4_hmac_value</Name>
        <Template>{hmacSha256(SigningKey,stringToSign,'base16','base16')}</Template>
      </AssignVariable>
    </AssignMessage>

    ฟังก์ชันอื่นๆ

    สร้างฟังก์ชัน UUID

    สร้างและแสดงผล UUID

    ไวยากรณ์

    createUuid()

    อาร์กิวเมนต์

    ไม่มี

    ตัวอย่าง

    {createUuid()}

    ตัวอย่างผลลัพธ์

    ec3ca9be-d1e1-4ef4-aee4-4a58f3130db8

    ฟังก์ชัน Random Long Generator

    แสดงผลจำนวนเต็มแบบยาวแบบสุ่ม

    ไวยากรณ์

    randomLong(args)

    อาร์กิวเมนต์

    • หากไม่ได้ระบุอาร์กิวเมนต์ ฟังก์ชันจะแสดงผลจำนวนเต็มแบบยาวแบบสุ่มตามที่คลาส SecureRandom ของ Java คำนวณ
    • หากมีอาร์กิวเมนต์ 1 รายการ ระบบจะถือว่าอาร์กิวเมนต์นั้นเป็นค่าต่ำสุดของการคำนวณ
    • หากมีอาร์กิวเมนต์ที่ 2 ระบบจะถือว่าเป็นค่าสูงสุดของการคำนวณ

    ตัวอย่าง

    {random()}

    ผลลัพธ์ที่ได้จะเป็นดังนี้

    5211338197474042880

    เครื่องมือสร้างข้อความนิพจน์ทั่วไป

    สร้างสตริงข้อความที่ตรงกับนิพจน์ทั่วไปที่ระบุ

    ไวยากรณ์

    xeger(regex)

    อาร์กิวเมนต์

    regex - นิพจน์ทั่วไป

    ตัวอย่าง

    ตัวอย่างนี้สร้างสตริง 7 หลักที่ไม่มีเลข 0

    xeger('[1-9]{7}')

    ตัวอย่างผลลัพธ์

    9857253

    ฟังก์ชันการรวมค่า Null

    ฟังก์ชัน firstnonnull() จะแสดงผลค่าของอาร์กิวเมนต์ซ้ายสุดที่ไม่ใช่ค่าว่าง

    ไวยากรณ์

    firstnonnull(var1,varnn>)

    อาร์กิวเมนต์

    var1 - ตัวแปรบริบท

    varn - ตัวแปรบริบทอย่างน้อย 1 รายการ คุณตั้งค่าอาร์กิวเมนต์ทางขวาสุด เป็นสตริงเพื่อระบุค่าสำรอง (ค่าที่จะตั้งหากไม่ได้ตั้งค่าอาร์กิวเมนต์ทางซ้ายมือ ใดๆ) ได้

    ตัวอย่าง

    ตารางต่อไปนี้แสดงวิธีใช้ฟังก์ชัน

    เทมเพลต Var1 Var2 Var3 ผลลัพธ์
    {firstnonnull(var1,var2)} ไม่ได้ตั้งค่า foo ไม่มี foo
    {firstnonnull(var1,var2)} foo bar ไม่มี foo
    {firstnonnull(var1,var2)} foo ไม่ได้ตั้งค่า ไม่มี foo
    {firstnonnull(var1,var2,var3)} foo bar baz foo
    {firstnonnull(var1,var2,var3)} ไม่ได้ตั้งค่า bar baz bar
    {firstnonnull(var1,var2,var3)} ไม่ได้ตั้งค่า ไม่ได้ตั้งค่า baz baz
    {firstnonnull(var1,var2,var3)} ไม่ได้ตั้งค่า ไม่ได้ตั้งค่า ไม่ได้ตั้งค่า null
    {firstnonnull(var1)} ไม่ได้ตั้งค่า ไม่มี ไม่มี null
    {firstnonnull(var1)} foo ไม่มี ไม่มี foo
    {firstnonnull(var1,var2)} "" bar ไม่มี ""
    {firstnonnull(var1,var2,'fallback value')} null null fallback value fallback value

    ฟังก์ชัน XPath

    ใช้การแสดงผล XPath กับตัวแปร XML

    ไวยากรณ์

    xpath(xpath_expression,xml_string,[datatype])

    อาร์กิวเมนต์

    xpath_expression - นิพจน์ XPath

    xml_string - ตัวแปรโฟลว์หรือสตริงที่มี XML

    datatype - (ไม่บังคับ) ระบุ ประเภทการแสดงผลที่ต้องการของคำค้นหา โดยอาจเป็นชุดโหนด โหนด ตัวเลข บูลีน สตริง โดยค่าเริ่มต้นจะเป็น nodeset โดยปกติแล้ว ค่าเริ่มต้นมักจะเป็นตัวเลือกที่เหมาะสม

    ตัวอย่างที่ 1

    สมมติว่าตัวแปรบริบทเหล่านี้กำหนดสตริง XML และนิพจน์ XPath ดังนี้

    xml = "<tag><tagid>250397</tagid><readerid>1</readerid><rssi>74</rssi><date>2019/06/15</date></tag>"
    xpath = "/tag/tagid"

    และใช้ฟังก์ชัน xpath() ในนโยบาย AssignMessage ดังนี้

    <AssignMessage>
      <AssignVariable>
        <Name>extracted_tag</Name>
        <Template>{xpath(xpath,xml)}</Template>
      </AssignVariable>
    </AssignMessage><

    ฟังก์ชันจะแสดงผลค่า <tagid>250397</tagid> ค่านี้จะอยู่ในตัวแปรบริบทที่เรียกว่า extracted_tag

    ตัวอย่างที่ 2

    หากต้องการเฉพาะค่าของโหนด ให้ใช้ฟังก์ชัน text() ดังนี้

    <AssignMessage>
      <AssignVariable>
        <Name>extracted_tag</Name>
        <Template>{xpath('/tag/tagid/text()',xml)}</Template>
      </AssignVariable>
    </AssignMessage>

    การดำเนินการนี้จะตั้งค่าตัวแปรบริบท extracted_tag เป็น 250397

    หากเลือกหลายโหนด ผลลัพธ์ของ xpath() คือค่าทั้งหมด ของการเลือกที่ต่อกันด้วยคอมมา

    ตัวอย่างที่ 3: เนมสเปซ XML

    หากต้องการระบุเนมสเปซ ให้ต่อท้ายพารามิเตอร์เพิ่มเติม โดยแต่ละพารามิเตอร์จะเป็นสตริงที่มีลักษณะดังนี้ prefix:namespaceuri ตัวอย่างเช่น xpath()ฟังก์ชันที่เลือก องค์ประกอบย่อยของเนื้อหา SOAP อาจมีลักษณะดังนี้

    <AssignMessage>
      <AssignVariable>
        <Name>soapns</Name>
        <Value>soap:http://schemas.xmlsoap.org/soap/envelope/</Value>
      </AssignVariable>
      <AssignVariable>
        <Name>xpathexpression</Name>
        <Value>/soap:Envelope/soap:Body/*</Value>
      </AssignVariable>
      <AssignVariable>
        <Name>extracted_element</Name>
        <Template>{xpath(xpathexpression,xml,soapns)}</Template>
      </AssignVariable>
    </AssignMessage>

    สำหรับเนมสเปซเพิ่มเติม คุณสามารถเพิ่มพารามิเตอร์เพิ่มเติมได้สูงสุด 10 รายการในฟังก์ชัน xpath()

    คุณระบุนิพจน์ XPath อย่างง่ายเป็นสตริงที่ล้อมรอบด้วยเครื่องหมายคำพูดเดี่ยวได้ดังนี้

    {xpath('/tag/tagid/text()',xml)}

    หากนิพจน์ XPath มีคำนำหน้าเนมสเปซ (และเครื่องหมายโคลอน) คุณจะต้องกำหนดนิพจน์ XPath นั้นให้กับตัวแปรและระบุชื่อตัวแปรแทนการระบุนิพจน์โดยตรง

    {xpath(xpathexpression,xml,ns1)}

    ตัวอย่างที่ 4: การระบุประเภทการแสดงผลที่ต้องการ

    พารามิเตอร์ที่ 3 ที่ไม่บังคับซึ่งส่งผ่านไปยังฟังก์ชัน xpath() จะระบุประเภทการส่งกลับที่ต้องการของคำค้นหา

    การค้นหา XPath บางรายการสามารถแสดงค่าตัวเลขหรือค่าบูลีนได้ เช่น ฟังก์ชัน count() จะแสดงผลเป็นตัวเลข นี่คือคำค้นหา XPath ที่ถูกต้อง

    count(//Record/Fields/Pair)

    การค้นหาที่ถูกต้องนี้จะแสดงค่าบูลีน

    count(//Record/Fields/Pair)>0

    ในกรณีดังกล่าว ให้เรียกใช้ฟังก์ชัน xpath() โดยมีพารามิเตอร์ที่ 3 ซึ่งระบุประเภทดังกล่าว

    {xpath(expression,xml,'number')}
    {xpath(expression,xml,'boolean')}

    หากพารามิเตอร์ที่ 3 มีเครื่องหมายโคลอน ระบบจะตีความว่าเป็นอาร์กิวเมนต์เนมสเปซ หากไม่ระบุ ระบบจะถือว่าประเภทการแสดงผลดังกล่าวเป็นประเภทที่ต้องการ ในกรณีนี้ หากพารามิเตอร์ที่ 3 ไม่ใช่ค่าที่ถูกต้องค่าใดค่าหนึ่ง (ไม่สนใจตัวพิมพ์เล็กและตัวพิมพ์ใหญ่) ฟังก์ชัน xpath() จะแสดงผลชุดโหนดโดยค่าเริ่มต้น

    ฟังก์ชันเส้นทาง JSON

    ใช้การแสดงออก JSON Path กับตัวแปร JSON

    ไวยากรณ์

    jsonPath(json-path,json-var,want-array)

    อาร์กิวเมนต์

    • (ต้องระบุ) json-path: (สตริง) นิพจน์เส้นทาง JSON
    • (ต้องระบุ) json-var: (สตริง) ตัวแปรโฟลว์หรือสตริงที่มี JSON
    • (ไม่บังคับ) want-array: (สตริง) หากตั้งค่าพารามิเตอร์นี้เป็น 'true' และหากชุดผลลัพธ์เป็นอาร์เรย์ ระบบจะแสดงผลองค์ประกอบอาร์เรย์ทั้งหมด หากตั้งค่าเป็นค่าอื่นหรือหากละเว้นพารามิเตอร์นี้ ระบบจะแสดงผลเฉพาะองค์ประกอบที่ 0 ของอาร์เรย์ชุดผลลัพธ์ หากชุดผลลัพธ์ไม่ใช่อาร์เรย์ ระบบจะไม่สนใจพารามิเตอร์ที่ 3 นี้ หากมี

    ตัวอย่างที่ 1

    หากเทมเพลตข้อความมีลักษณะดังนี้

    The address is {jsonPath($.results[?(@.name == 'Mae West')].address.line1,the_json_variable)}

    และ the_json_variable ประกอบด้วย

    {
      "results" : [
        {
          "address" : {
            "line1" : "18250 142ND AV NE",
            "city" : "Woodinville",
            "state" : "Washington",
            "zip" : "98072"
          },
          "name" : "Fred Meyer"
        },
        {
          "address" : {
            "line1" : "1060 West Addison Street",
            "city" : "Chicago",
            "state" : "Illinois",
            "zip" : "60613"
          },
          "name" : "Mae West"
        }
      ]
    } 

    ผลลัพธ์ของฟังก์ชันคือ

    The address is 1060 West Addison Street

    โปรดทราบว่าในกรณีนี้ ชุดผลลัพธ์คือองค์ประกอบเดียว (ไม่ใช่อาร์เรย์ขององค์ประกอบ) หากชุดผลลัพธ์เป็นอาร์เรย์ ระบบจะแสดงผลเฉพาะองค์ประกอบที่ 0 ของอาร์เรย์ หากต้องการแสดงผล อาร์เรย์ทั้งหมด ให้เรียกใช้ฟังก์ชันโดยมี 'true' เป็นพารามิเตอร์ที่ 3 ดังที่แสดงใน ตัวอย่างถัดไป

    ตัวอย่างที่ 2

    หากเทมเพลตข้อความมีลักษณะดังนี้

    {jsonPath($.config.quota[?(@.operation=='ManageOrder')].appname,the_json_variable,'true')}

    และ the_json_variable ประกอบด้วย

    {
      "results" : [
         {
          "config": {
            "quota": [
              {
                "appname": "A",
                "operation": "ManageOrder",
                "value": "900"
              },
              {
                "appname": "B",
                "operation": "ManageOrder",
                "value": "1000"
              },
              {
                "appname": "B",
                "operation": "SubmitOrder",
                "value": "800"
              }
            ]
          }
        }
      ]
    } 

    ผลลัพธ์ของฟังก์ชันคือ

    ['A','B']