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

คุณกําลังดูเอกสารประกอบของ 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>

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

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

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

นโยบาย องค์ประกอบและองค์ประกอบย่อยที่รองรับเทมเพลตข้อความ
นโยบายการควบคุมการเข้าถึง <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>
นโยบายการบันทึกข้อความ <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 เวอร์ชันก่อนรุ่น 16.08.17 ของ Cloud คุณไม่สามารถใช้วงเล็บปีกกาเพื่อระบุการอ้างอิงตัวแปรภายในเพย์โหลด 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()

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

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

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

นโยบายการดึงข้อมูลตัวแปรที่ดึงข้อมูล 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>


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

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

หากต้องการแก้ปัญหานี้ คุณสามารถแก้ไขนโยบายกำหนดข้อความให้ใช้ฟังก์ชันเทมเพลตข้อความซึ่งจะหลีกหนีเครื่องหมายคำพูดภายใน 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>

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

ฟังก์ชันแฮช

คํานวณค่าแฮชและแสดงผลสตริงที่แสดงแฮชนั้น

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

คํานวณค่าแฮชและแสดงผลสตริงที่แสดงแฮชนั้นเป็นตัวเลขฐาน 16

ไวยากรณ์

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

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

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

ตัวอย่าง

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

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

แทนที่ฟังก์ชัน First

แทนที่เฉพาะรายการแรกที่ตรงกับนิพจน์ทั่วไปที่ระบุในสตริง

ไวยากรณ์

replaceFirst(string,regex,value)

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

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

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

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

ไวยากรณ์

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

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

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

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

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

XML 1.1 สามารถแสดงตัวอักขระควบคุมบางตัวได้ แต่จะแสดงไบต์ว่างหรือโค้ดจุดแทน Unicode ที่ไม่จับคู่กันไม่ได้ แม้ว่าจะมีการหลีกก็ตาม ฟังก์ชัน 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 - สตริงหรือตัวแปรการไหลของสตริงที่มีค่าเวลา ค่าอาจเป็นวินาทีนับจากจุดเริ่มต้นหรือมิลลิวินาทีนับจากจุดเริ่มต้นสำหรับ 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 แบบ Cascade เช่น เมื่อใช้เอาต์พุตของ HMAC รายการหนึ่งเป็นคีย์สําหรับ HMAC รายการที่ 2

    ไวยากรณ์

    การทำงาน คำอธิบาย
    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

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

    • key - (ต้องระบุ) ระบุคีย์ลับที่เข้ารหัสเป็นสตริงซึ่งใช้ในการคํานวณ 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 Signature v4 ตัวอย่างนี้ใช้นโยบาย AssignMessage เพื่อสร้าง HMAC แบบเรียงซ้อน 5 ระดับที่ใช้คำนวณลายเซ็นสำหรับ AWS Signature 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)

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

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

    ตัวอย่าง

    {random()}

    ผลลัพธ์ที่ได้จะมีลักษณะดังนี้

    5211338197474042880

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

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

    ไวยากรณ์

    xeger(regex)

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

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

    ตัวอย่าง

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

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

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

    9857253

    ฟังก์ชัน Null Coalescing

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

    ไวยากรณ์

    firstnonnull(var1,varn)

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

    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 กับตัวแปร 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']