500 ข้อผิดพลาดภายในเซิร์ฟเวอร์ - EmptyPath

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

ลักษณะปัญหา

แอปพลิเคชันไคลเอ็นต์จะได้รับรหัสสถานะ HTTP เป็น 500 Internal Server Error พร้อมรหัสข้อผิดพลาด protocol.http.EmptyPath เป็นการตอบกลับสำหรับการเรียก API

ข้อความแสดงข้อผิดพลาด

แอปพลิเคชันไคลเอ็นต์จะได้รับโค้ดตอบกลับต่อไปนี้

HTTP/1.1 500 Internal Server Error

นอกจากนี้ คุณอาจพบข้อความแสดงข้อผิดพลาดต่อไปนี้

{
   "fault":{
      "faultstring":"Request path cannot be empty",
      "detail":{
         "errorcode":"protocol.http.EmptyPath"
      }
   }
}

สาเหตุที่เป็นไปได้

ข้อผิดพลาดนี้จะเกิดขึ้นหาก URL คำขอของเซิร์ฟเวอร์แบ็กเอนด์ที่แสดงโดยตัวแปรโฟลว์ target.url มีเส้นทางที่ว่างเปล่า

ตามข้อกำหนดเฉพาะ RFC 3986 ส่วนที่ 3: คอมโพเนนต์ไวยากรณ์ และ RFC 3986 ส่วนที่ 3.3: เส้นทาง

  1. ไวยากรณ์ URI มีคอมโพเนนต์ต่อไปนี้

            foo://example.com:8042/over/there?name=ferret#nose
            \_/   \______________/\_________/ \_________/ \__/
             |            |            |            |       |
          scheme      authority       path        query   fragment
    
  2. คุณต้องระบุคอมโพเนนต์ path และต้องมีเครื่องหมายทับ (/) เสมอ แม้จะไม่มีอักขระอื่นๆ เป็นส่วนหนึ่งของเส้นทางก็ตาม

ดังนั้น หาก URL คำขอของเซิร์ฟเวอร์แบ็กเอนด์ไม่มีคอมโพเนนต์ path เลย กล่าวคือไม่มีเครื่องหมายทับ (/) Apigee Edge จะตอบกลับด้วย 500 Internal Server Error และรหัสข้อผิดพลาด protocol.http.EmptyPath

เช่น หาก target.url มีค่า https://www.mocktarget.apigee.net ข้อผิดพลาดนี้จะเกิดขึ้นเนื่องจาก path คอมโพเนนต์ว่างเปล่าหรือขาดหายไป

สาเหตุ คำอธิบาย วิธีการแก้ปัญหาที่ใช้กับ
URL ของเซิร์ฟเวอร์แบ็กเอนด์ (target.url) มีเส้นทางที่ว่างเปล่า URL เซิร์ฟเวอร์แบ็กเอนด์ที่แสดงด้วยตัวแปรโฟลว์ target.url มีเส้นทางที่ว่างเปล่า ผู้ใช้ Edge Public และ Private Cloud

ขั้นตอนการวินิจฉัยทั่วไป

ใช้เครื่องมือ/เทคนิคอย่างใดอย่างหนึ่งต่อไปนี้เพื่อวิเคราะห์ข้อผิดพลาดนี้

การตรวจสอบ API

ขั้นตอนที่ 1: การใช้ API Monitoring

วิธีวินิจฉัยข้อผิดพลาดโดยใช้ API Monitoring

  1. ลงชื่อเข้าใช้ UI ของ Apigee Edge ในฐานะผู้ใช้ที่มีบทบาทที่เหมาะสม
  2. เปลี่ยนเป็นองค์กรที่คุณต้องการตรวจสอบปัญหา

  3. ไปที่หน้าวิเคราะห์ > การตรวจสอบ API > ตรวจสอบ
  4. เลือกกรอบเวลาเฉพาะที่คุณพบข้อผิดพลาด
  5. พล็อตโค้ดข้อผิดพลาดเทียบกับเวลา

  6. เลือกเซลล์ที่มีรหัสข้อผิดพลาด protocol.http.EmptyPath ดังที่แสดงด้านล่าง

  7. ข้อมูลเกี่ยวกับรหัสข้อผิดพลาด protocol.http.EmptyPath จะแสดงอยู่ดังที่แสดงด้านล่าง

  8. คลิกดูบันทึก เพื่อขยายแถวสำหรับคำขอที่ไม่สำเร็จ

  9. ดูรายละเอียดต่อไปนี้จากหน้าต่าง Logs
    • รหัสสถานะ: 500
    • แหล่งที่มาของข้อผิดพลาด: target
    • รหัสข้อผิดพลาด: protocol.http.EmptyPath
  10. หากแหล่งที่มาของข้อผิดพลาดคือ target และรหัสข้อผิดพลาดคือ protocol.http.EmptyPath แสดงว่า URL ของเซิร์ฟเวอร์แบ็กเอนด์มีเส้นทางที่ว่างเปล่า

Trace

ขั้นตอนที่ 2: การใช้เครื่องมือติดตาม

วิธีวินิจฉัยข้อผิดพลาดโดยใช้เครื่องมือติดตาม

  1. เปิดใช้เซสชันการติดตามและ
    • รอจนกว่าจะเกิดข้อผิดพลาด 500 Internal Server Error หรือ
    • หากทำให้ปัญหาเกิดซ้ำได้ ให้เรียก API เพื่อจำลองปัญหา 500 Internal Server Error
  2. ตรวจสอบว่าเปิดใช้ Show FlowInfos ทั้งหมดแล้ว โดยทำดังนี้

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

  6. บันทึกค่าของข้อผิดพลาดจากการติดตาม

    ข้อผิดพลาด: ต้องระบุเส้นทางคำขอ

    เนื่องจากข้อผิดพลาดเกิดขึ้นโดย Apigee Edge หลังช่วงเริ่มต้นโฟลว์คำขอเป้าหมาย จึงบ่งชี้ว่า path ใน URL เซิร์ฟเวอร์แบ็กเอนด์ว่างเปล่า กรณีนี้อาจเกิดขึ้นอย่างมากหากตัวแปรโฟลว์ target.url (ซึ่งแสดง URL สำหรับเซิร์ฟเวอร์แบ็กเอนด์) ได้รับการอัปเดตด้วยเส้นทางว่างผ่านนโยบายใดนโยบายหนึ่งในโฟลว์คําขอ

  7. ตรวจสอบส่วนอ่านและกำหนดตัวแปรในแต่ละกระบวนการที่ย้อนกลับจากจุดแสดงข้อผิดพลาดไปยังช่วงเริ่มต้นโฟลว์คำขอเป้าหมาย
  8. กำหนดนโยบายที่จะอัปเดตตัวแปรโฟลว์ target.url

    การติดตามตัวอย่างที่แสดงนโยบาย JavaScript ได้อัปเดตตัวแปรโฟลว์ target.url:

    ในการติดตามตัวอย่างที่แสดงข้างต้น โปรดทราบว่าระบบจะอัปเดตค่าของตัวแปรโฟลว์ target.url ในนโยบาย JavaScript ที่ชื่อว่า SetTargetURL ดังนี้

    target.url : https://mocktarget.apigee.net
    
  9. โปรดทราบว่า target.url มีคอมโพเนนต์ต่อไปนี้
    • แบบแผน: https://mocktarget.apigee.net
    • path: ว่างเปล่า
  10. ดังนั้น คุณจะได้รับข้อผิดพลาด Request path cannot be empty
  11. ไปที่เฟส AX (บันทึกข้อมูล Analytics) ในการติดตามแล้วคลิกเลือกดังกล่าว
  12. เลื่อนลงไปที่ส่วน Phase Details - Error Headers และระบุค่าของ X-Apigee-fault-code และ X-Apigee-fault-source ดังที่แสดงด้านล่าง

  13. คุณจะเห็นค่าของ X-Apigee-fault-code และ X-Apigee-fault-source เป็น protocol.http.EmptyPath และtarget ตามลำดับ ซึ่งหมายความว่าข้อผิดพลาดนี้เกิดจาก URL ของเซิร์ฟเวอร์แบ็กเอนด์มีเส้นทางที่ว่างเปล่า
    ส่วนหัวการตอบกลับ ค่า
    X-Apigee-fault-code protocol.http.EmptyPath
    X-Apigee-fault-source target

NGINX

ขั้นตอนที่ 3: การใช้บันทึกการเข้าถึง NGINX

วิธีวินิจฉัยข้อผิดพลาดโดยใช้บันทึกการเข้าถึง NGINX

  1. หากเป็นผู้ใช้ Private Cloud คุณจะใช้บันทึกการเข้าถึง NGINX เพื่อระบุข้อมูลคีย์เกี่ยวกับ HTTP 500 Internal Server Error ได้
  2. ตรวจสอบบันทึกการเข้าถึง NGINX ดังนี้

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

  3. ค้นหาเพื่อดูว่ามีข้อผิดพลาด 500 ที่มีรหัสข้อผิดพลาด protocol.http.EmptyPath ในช่วงเวลาที่ระบุหรือไม่ (หากเกิดปัญหาในอดีต) หรือมีคำขอใดที่ยังคงดำเนินการไม่สำเร็จเมื่อใช้ 500
  4. หากพบข้อผิดพลาด 500 ที่ X-Apigee-fault-code ตรงกับค่าของ protocol.http.EmptyPath ให้ระบุค่าของ X-Apigee-fault-source

    ตัวอย่างข้อผิดพลาด 500 จากบันทึกการเข้าถึง NGINX

    ตัวอย่างรายการด้านบนจากบันทึกการเข้าถึง NGINX มีค่าต่อไปนี้สำหรับ X- Apigee-fault-code และ X-Apigee-fault-source

    ส่วนหัว ค่า
    X-Apigee-fault-code protocol.http.EmptyPath
    X-Apigee-fault-source target

    โปรดสังเกตว่าค่าของ X-Apigee-fault-code และ X-Apigee-fault-source คือ protocol.http.EmptyPath และtarget ตามลำดับ ซึ่งหมายความว่าข้อผิดพลาดนี้เกิดจาก URL ของเซิร์ฟเวอร์แบ็กเอนด์มีเส้นทางว่าง

สาเหตุ: URL ของเซิร์ฟเวอร์แบ็กเอนด์ (target.url) มีเส้นทางที่ว่างเปล่า

การวินิจฉัย

  1. กำหนด Fault Code และ Fault Source สำหรับ 500 Internal Server Error โดยใช้การตรวจสอบ API, เครื่องมือติดตาม หรือบันทึกการเข้าถึง NGINX ตามที่อธิบายไว้ในขั้นตอนการวินิจฉัยทั่วไป
  2. หาก Fault Code คือ protocol.http.EmptyPath และ Fault Source มีค่า target แสดงว่า URL ของเซิร์ฟเวอร์แบ็กเอนด์มีเส้นทางว่าง
  3. URL เซิร์ฟเวอร์แบ็กเอนด์จะแสดงด้วยตัวแปรโฟลว์ target.url ใน Apigee Edge ข้อผิดพลาดนี้มักเกิดขึ้นเมื่อคุณพยายามอัปเดต URL ของเซิร์ฟเวอร์แบ็กเอนด์ กล่าวคือ target.url แบบไดนามิกโดยใช้นโยบายใดก็ได้ (ภายในพร็อกซี/ขั้นตอนที่แชร์) ในขั้นตอนการส่งคำขอ "เป้าหมาย" เพื่อให้มีเส้นทางว่าง

  4. พิจารณาว่าตัวแปรโฟลว์ target.url มีเส้นทางว่างและต้นทางสำหรับค่าจริงหรือไม่ โดยใช้ขั้นตอนใดขั้นตอนหนึ่งต่อไปนี้

    Trace

    การใช้เครื่องมือติดตาม

    หากคุณบันทึกการติดตามสำหรับข้อผิดพลาดนี้แล้ว ให้ใช้ขั้นตอนตามที่อธิบายไว้ในการใช้เครื่องมือติดตาม และ

    1. ตรวจสอบว่า target.url มีเส้นทางที่ว่างเปล่าหรือไม่
    2. หากใช่ ให้ดูว่านโยบายใดที่แก้ไขหรืออัปเดตค่าของ target.url ให้มีเส้นทางที่ว่างเปล่า

      การติดตามตัวอย่างที่แสดงนโยบาย JavaScript ได้อัปเดตตัวแปรโฟลว์ target.url:

    3. ในการติดตามตัวอย่างด้านบน ให้สังเกตว่านโยบาย JavaScript ได้แก้ไขหรืออัปเดตค่าของ target.url ให้มีเส้นทางที่ว่างเปล่า
    4. โปรดทราบว่า target.url มีคอมโพเนนต์ต่อไปนี้
      • แบบแผน: https://mocktarget.apigee.net
      • path: ว่างเปล่า

    บันทึก

    การใช้บันทึกในเซิร์ฟเวอร์บันทึก

    1. หากไม่มีการติดตามสำหรับข้อผิดพลาดนี้ (ปัญหาที่เกิดเป็นครั้งคราว) ให้ตรวจสอบเพื่อดูว่าคุณได้บันทึกข้อมูลเกี่ยวกับค่าของตัวแปรโฟลว์ target.url โดยใช้นโยบายต่างๆ เช่น MessageLogging หรือ Serviceที่แตกต่างกัน ไปยังเซิร์ฟเวอร์บันทึกหรือไม่
    2. หากมีบันทึก ให้ตรวจสอบดังนี้
      1. ตรวจสอบว่า target.url มีเส้นทางที่ว่างเปล่าหรือไม่ และ
      2. ดูว่าคุณระบุนโยบายที่แก้ไข target.url ให้มีเส้นทางว่างได้หรือไม่

    พร็อกซี API

    การตรวจสอบพร็อกซี API ที่ล้มเหลว

    หากไม่มีการติดตามหรือบันทึกสำหรับข้อผิดพลาดนี้ ให้ตรวจสอบพร็อกซี API ที่ล้มเหลวเพื่อหาสิ่งที่แก้ไขหรืออัปเดตตัวแปรโฟลว์ target.url ให้มีเส้นทางที่ไม่ถูกต้อง โปรดตรวจสอบสิ่งต่อไปนี้

    • นโยบายภายในพร็อกซี API
    • โฟลว์ที่แชร์ซึ่งเรียกใช้จากพร็อกซี
  5. ตรวจสอบนโยบายเฉพาะ (เช่น AssignMessage หรือ JavaScript) ที่แก้ไขหรืออัปเดตตัวแปรโฟลว์ target.url อย่างรอบคอบ และหาสาเหตุที่ทำให้ target.url มีเส้นทางว่าง

    ตัวอย่างนโยบายที่อัปเดตตัวแปรโฟลว์ target.url อย่างไม่ถูกต้องให้มีเส้นทางว่างซึ่งนำไปสู่ข้อผิดพลาดนี้

    ตัวอย่าง #1

    ตัวอย่างที่ 1: การอัปเดตนโยบาย JavaScript target.url ตัวแปร

    var url = "https://mocktarget.apigee.net"
    context.setVariable("target.url", url);
    

    ในตัวอย่างข้างต้น สังเกตว่าตัวแปรโฟลว์ target.url ได้รับการอัปเดตด้วยค่า https://mocktarget.apigee.net ที่อยู่ในตัวแปรอื่น url

    โปรดทราบว่า target.url มีคอมโพเนนต์ต่อไปนี้

    • แบบแผน: https://mocktarget.apigee.net
    • path: ว่างเปล่า

    เนื่องจากเส้นทางว่างเปล่า Apigee Edge จึงแสดงผล 500 Internal Server Error ที่มีรหัสข้อผิดพลาด protocol.http.EmptyPath

    ตัวอย่าง #2

    ตัวอย่างที่ 2: การอัปเดตนโยบาย JavaScript สำหรับตัวแปร target.url รายการ

    var path = context.getVariable("request.header.Path");
    var url = "https://mocktarget.apigee.net" + path
    context.setVariable("target.url", url);

    ในตัวอย่างข้างต้น สังเกตว่าตัวแปรโฟลว์ target.url ได้รับการอัปเดตโดยการเชื่อมโยงค่า https://mocktarget.apigee.net ที่มีอยู่ในตัวแปร url และ ค่าของตัวแปรอื่น path ซึ่งดึงค่ามาจาก request.header.Path.

    หากคุณมีสิทธิ์เข้าถึงคำขอหรือการติดตามจริง คุณจะยืนยันค่าจริงที่ส่งไปยัง request.header.Path ได้

    ตัวอย่างคำขอจากผู้ใช้

    curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token>
    

    ในตัวอย่างนี้ เส้นทางส่วนหัวไม่ได้ส่งเป็นส่วนหนึ่งของคำขอ ดังนั้นค่าของเส้นทางตัวแปรในนโยบาย JavaScript จะเป็น null

    ดังนั้น

    • url = https://mocktarget.apigee.net + path
    • url = https://mocktarget.apigee.net + null
    • target.url = https://mocktarget.apigee.netnull

    โปรดทราบว่า target.url มีคอมโพเนนต์ต่อไปนี้

    • แบบแผน: https://mocktarget.apigee.netnull
    • path: ว่างเปล่า

    ตัวอย่าง #3

    ตัวอย่าง #3: นโยบาย AssignMessage ที่อัปเดตตัวแปร target.url ผ่านตัวแปรอื่น

    <AssignMessage async="false" continueOnError="false" enabled="true" name=">AM-SetTargetURL">
        <DisplayName>AM-SetTargetURL</DisplayName>
        <AssignVariable>
             <Name>target.url</Name>
             <Value>https://mocktarget.apigee.net</Value>
        </AssignVariable>
        <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
        <AssignTo createNew="false" transport="http" type="request"/>
    </AssignMessage>
    

    โปรดทราบว่า target.url มีคอมโพเนนต์ต่อไปนี้

    • แบบแผน: https://mocktarget.apigee.net
    • path: ว่างเปล่า

    ในตัวอย่างข้างต้นทั้งหมด เส้นทางใน URL ของเซิร์ฟเวอร์แบ็กเอนด์ซึ่งก็คือ target.url ว่างเปล่า ดังนั้น Apigee Edge จึงแสดงผล 500 Internal Server Error ที่มีรหัสข้อผิดพลาด protocol.http.EmptyPath

ความละเอียด

ตามข้อกำหนดของ RFC 3986 ส่วนที่ 2: คอมโพเนนต์ไวยากรณ์ ต้องระบุคอมโพเนนต์ path และต้องมีเครื่องหมายทับ (/) เสมอ แม้ว่าจะไม่มีอักขระอื่นๆ เป็นส่วนหนึ่งของ path ก็ตาม ทำตามขั้นตอนต่อไปนี้เพื่อแก้ไขปัญหานี้

  1. ตรวจสอบว่า URL เซิร์ฟเวอร์แบ็กเอนด์ที่แสดงโดยตัวแปรโฟลว์ target.url มีเส้นทางที่ไม่ว่างเปล่าเสมอ
    1. ในบางกรณี คุณอาจไม่มีชื่อทรัพยากรในเส้นทาง จากนั้นตรวจสอบว่าอย่างน้อยเส้นทางมีเครื่องหมายทับ (/)
    2. หากคุณใช้ตัวแปรอื่นในการกำหนดค่าของตัวแปรโฟลว์ target.url ให้ตรวจสอบว่าตัวแปรอื่นๆ ไม่มีเส้นทางว่าง
    3. หากคุณดำเนินการสตริงเพื่อระบุค่าของตัวแปรโฟลว์ target.url ให้ตรวจสอบว่าผลลัพธ์หรือผลลัพธ์ของการดำเนินการสตริงไม่มีเส้นทางว่าง
  2. ในตัวอย่างที่กล่าวถึงในการวิเคราะห์ คุณแก้ไขปัญหานี้ได้ตามที่อธิบายไว้ด้านล่าง

    ตัวอย่าง #1

    ตัวอย่าง #1: การอัปเดตนโยบาย JavaScript สำหรับตัวแปร target.url รายการ

    เพิ่มเครื่องหมายทับ (/) ลงในตัวแปร url เพื่อแก้ไขปัญหานี้ ดังที่แสดงด้านล่าง

    var url = "https://mocktarget.apigee.net/"
    context.setVariable("target.url", url);
    

    ตัวอย่าง #2

    ตัวอย่างที่ 2: การอัปเดตนโยบาย JavaScript สำหรับตัวแปร target.url รายการ

    var path = context.getVariable("request.header.Path");
    var url = "https://mocktarget.apigee.net" + path
    context.setVariable("target.url", url);
    

    ตรวจสอบว่าคุณส่งเส้นทางที่ถูกต้อง เช่น /iloveapis เป็นส่วนหนึ่งของส่วนหัวของคำขอ Path เพื่อแก้ไขปัญหานี้ดังที่แสดงด้านล่าง

    ตัวอย่างคำขอ

    curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: /iloveapis"
    

    ตัวอย่าง #3

    ตัวอย่างที่ 3: นโยบาย AssignMessage ที่อัปเดตตัวแปร target.url ผ่านตัวแปรอื่น

    เพิ่มเส้นทางที่ถูกต้องในองค์ประกอบ <Value> ของนโยบาย AssignMessage เช่น คุณอาจมี /json เป็นเส้นทางสำหรับ MockTarget API กล่าวคือ ให้แก้ไของค์ประกอบ <Value> เป็น https://mocktarget.apigee.net/json ดังที่แสดงด้านล่าง

    <AssignMessage async="false" continueOnError="false" enabled="true" name="AM-SetTargetURL">
        <DisplayName>AM-SetTargetURL</DisplayName>
        <AssignVariable>
             <Name>target.url</Name>
             <Value>https://mocktarget.apigee.net/json</Value>
        </AssignVariable>
        <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
        <AssignTo createNew="false" transport="http" type="request"/>
    </AssignMessage>
    

ข้อมูลจำเพาะ

Apigee Edge คาดหวังว่า URL เซิร์ฟเวอร์แบ็กเอนด์ ไม่มีเส้นทางว่างตามข้อกำหนดต่อไปนี้

ข้อมูลจำเพาะ
RFC 3986 ส่วนที่ 3: คอมโพเนนต์ไวยากรณ์
RFC 3986 ส่วนที่ 3.3: เส้นทาง

หากยังต้องการความช่วยเหลือจากทีมสนับสนุนของ Apigee ให้ไปที่หัวข้อต้องรวบรวมข้อมูลการวินิจฉัย

ต้องรวบรวมข้อมูลการวินิจฉัย

หากปัญหายังคงอยู่แม้ว่าจะทำตามวิธีการข้างต้นแล้ว ให้รวบรวมข้อมูลการวินิจฉัยต่อไปนี้ จากนั้นติดต่อฝ่ายสนับสนุนของ Apigee Edge

หากคุณเป็นผู้ใช้ระบบคลาวด์สาธารณะ โปรดระบุข้อมูลต่อไปนี้

  • ชื่อองค์กร
  • ชื่อสภาพแวดล้อม
  • ชื่อพร็อกซี API
  • ใช้คำสั่ง curl เพื่อทำซ้ำ 500 Internal Server Error ที่มีรหัสข้อผิดพลาด protocol.http.EmptyPath
  • ไฟล์การติดตามสำหรับคำขอ API

หากคุณเป็นผู้ใช้ Private Cloud โปรดระบุข้อมูลต่อไปนี้

  • สังเกตข้อความแสดงข้อผิดพลาดสำหรับคำขอที่ไม่สำเร็จ
  • ชื่อสภาพแวดล้อม
  • ชุดพร็อกซี API
  • ไฟล์การติดตามสำหรับคำขอ API
  • บันทึกการเข้าถึง NGINX:

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    ที่ไหน จะแทนที่ ORG, ENV และ PORT# ด้วยค่าจริง

  • บันทึกระบบของผู้ประมวลผลข้อความ /opt/apigee/var/log/edge-message- processor/logs/system.log

รายการอ้างอิง

ตัวแปรโฟลว์ - เป้าหมาย