สํารวจนโยบายการจัดการ API

เสร็จสมบูรณ์เมื่อ

ใน Azure API Management นโยบายอนุญาตให้ผู้เผยแพร่เปลี่ยนลักษณะการทํางานของ API ผ่านการกําหนดค่า นโยบายคือคอลเลกชันของคําสั่งที่ดําเนินการตามลําดับคําขอหรือการตอบสนองของ API

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

ทําความเข้าใจเกี่ยวกับการกําหนดค่านโยบาย

ข้อกําหนดของนโยบายเป็นเอกสาร XML อย่างง่ายที่อธิบายลําดับของคําสั่งขาเข้าและขาออก คุณสามารถแก้ไข XML ได้โดยตรงในหน้าต่างข้อกําหนด

โครงแบบจะแบ่งออกเป็น inbound, backend, outbound, และ on-error ชุดคําสั่งนโยบายที่ระบุจะดําเนินการตามลําดับคําขอและการตอบสนอง

<policies>
  <inbound>
    <!-- statements to be applied to the request go here -->
  </inbound>
  <backend>
    <!-- statements to be applied before the request is forwarded to 
         the backend service go here -->
  </backend>
  <outbound>
    <!-- statements to be applied to the response go here -->
  </outbound>
  <on-error>
    <!-- statements to be applied if there is an error condition go here -->
  </on-error>
</policies>

ถ้ามีข้อผิดพลาดในระหว่างการประมวลผลคําขอ ขั้นตอนใด ๆ ที่เหลือใน inboundbackendหรือส่วน outbound จะถูกข้ามไป และการดําเนินการข้ามไปยังคําสั่งในส่วน on-error โดยการวางคําสั่งนโยบายในส่วน on-error คุณสามารถตรวจสอบข้อผิดพลาดโดยใช้คุณสมบัติ context.LastError ตรวจสอบและกําหนดค่าการตอบสนองข้อผิดพลาดโดยใช้นโยบาย set-body และกําหนดค่าสิ่งที่เกิดขึ้นถ้าเกิดข้อผิดพลาด

นิพจน์นโยบาย

เว้นแต่ว่านโยบายจะระบุเป็นอย่างอื่น นิพจน์นโยบายสามารถใช้เป็นค่าแอตทริบิวต์หรือค่าข้อความในนโยบายการจัดการ API ได้ นิพจน์นโยบายคือ:

  • คําสั่ง C# เดียวที่ล้อมรอบด้วย @(expression)หรือ
  • บล็อกรหัส C# หลายคําสั่ง ซึ่งอยู่ใน @{expression}ซึ่งส่งกลับค่า

แต่ละนิพจน์มีสิทธิ์เข้าถึงตัวแปร context ที่ระบุโดยนัยและชุดย่อยที่ได้รับอนุญาตของ .NET Framework ชนิด

นิพจน์นโยบาย เป็นวิธีที่ซับซ้อนในการควบคุมปริมาณการใช้งานและปรับเปลี่ยนลักษณะการทํางานของ API โดยที่คุณไม่จําเป็นต้องเขียนรหัสพิเศษหรือปรับเปลี่ยนบริการ Backend

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

<policies>
    <inbound>
        <base />
        <set-header name="x-request-context-data" exists-action="override">
            <value>@(context.User.Id)</value>
            <value>@(context.Deployment.Region)</value>
      </set-header>
    </inbound>
</policies>

ใช้นโยบายที่ระบุในขอบเขตที่ต่างกัน

ถ้าคุณมีนโยบายในระดับส่วนกลางและนโยบายที่กําหนดค่าสําหรับ API แล้ว เมื่อใดก็ตามที่มีการใช้ API เฉพาะทั้งสองนโยบาย การจัดการ API ช่วยให้สามารถจัดลําดับคําสั่งนโยบายแบบรวมผ่านองค์ประกอบพื้นฐานได้

<policies>
    <inbound>
        <cross-domain />
        <base />
        <find-and-replace from="xyz" to="abc" />
    </inbound>
</policies>

ในข้อกําหนดนโยบายตัวอย่างก่อนหน้า คําสั่ง cross-domain จะดําเนินการก่อน นโยบาย find-and-replace จะดําเนินการหลังจากนโยบายใดๆ ก็ตามในขอบเขตที่กว้างขึ้น

กรองเนื้อหาการตอบสนอง

นโยบายที่กําหนดไว้ในตัวอย่างต่อไปนี้สาธิตวิธีการกรององค์ประกอบข้อมูลจากส่วนข้อมูลการตอบสนองตามผลิตภัณฑ์ที่เกี่ยวข้องกับคําขอ

ส่วนย่อยสันนิษฐานว่าเนื้อหาคําตอบถูกจัดรูปแบบเป็น JSON และมีคุณสมบัติระดับรากที่ชื่อว่า รายนาทีรายชั่วโมงรายวัน และ ธง

<policies>
  <inbound>
    <base />
  </inbound>
  <backend>
    <base />
  </backend>
  <outbound>
    <base />
    <choose>
      <when condition="@(context.Response.StatusCode == 200 && context.Product.Name.Equals("Starter"))">
        <!-- NOTE that we are not using preserveContent=true when deserializing response body stream into a JSON object since we don't intend to access it again. See details on /azure/api-management/api-management-transformation-policies#SetBody -->
        <set-body>
          @{
            var response = context.Response.Body.As<JObject>();
            foreach (var key in new [] {"minutely", "hourly", "daily", "flags"}) {
            response.Property (key).Remove ();
           }
          return response.ToString();
          }
    </set-body>
      </when>
    </choose>    
  </outbound>
  <on-error>
    <base />
  </on-error>
</policies>