เอกสารนี้ครอบคลุมเทคนิคบางอย่างที่คุณสามารถใช้เพื่อปรับปรุงประสิทธิภาพของแอปพลิเคชันของคุณ ในบางกรณี อาจมีการใช้ตัวอย่างจาก API อื่นๆ หรือ API ทั่วไปเพื่อแสดงให้เห็นแนวคิดที่นำเสนอ แต่ Google Photos Library API ก็ใช้แนวคิดเดียวกันนี้ได้เช่นกัน
การบีบอัดโดยใช้ gzip
วิธีที่ง่ายและสะดวกในการลดแบนด์วิดท์ที่ต้องใช้สำหรับแต่ละคำขอคือการเปิดใช้การบีบอัด gzip แม้ว่าวิธีนี้ต้องใช้เวลา CPU เพิ่มเติมเพื่อยกเลิกการบีบอัดผลลัพธ์ แต่การแลกกับค่าใช้จ่ายเครือข่ายมักจะคุ้มค่ามาก
หากต้องการรับการตอบกลับที่เข้ารหัส gzip คุณต้องดำเนินการ 2 อย่าง ได้แก่ ตั้งค่าส่วนหัว Accept-Encoding และแก้ไข User Agent ให้มีสตริง gzip ตัวอย่างส่วนหัว HTTP ที่มีรูปแบบถูกต้องสำหรับเปิดใช้การบีบอัด gzip มีดังนี้
Accept-Encoding: gzip User-Agent: my program (gzip)
การทำงานกับทรัพยากรบางส่วน
อีกวิธีหนึ่งในการปรับปรุงประสิทธิภาพการเรียก API คือการขอเฉพาะข้อมูลส่วนที่คุณสนใจ ซึ่งช่วยให้แอปพลิเคชันหลีกเลี่ยงการโอน แยกวิเคราะห์ และจัดเก็บช่องที่ไม่จำเป็นได้ เพื่อให้ใช้ทรัพยากรต่างๆ รวมถึงเครือข่าย, CPU และหน่วยความจำได้อย่างมีประสิทธิภาพมากขึ้น
คำตอบเพียงบางส่วน
โดยค่าเริ่มต้น เซิร์ฟเวอร์จะส่งการแสดงผลแบบเต็มของทรัพยากรกลับมาหลังจากประมวลผลคำขอ เพื่อประสิทธิภาพที่ดีขึ้น คุณสามารถขอให้เซิร์ฟเวอร์ส่งเฉพาะช่องที่คุณต้องการจริงๆ แล้วรับการตอบกลับบางส่วนแทน
หากต้องการขอการตอบกลับบางส่วน ให้ใช้พารามิเตอร์คำขอ fields เพื่อระบุช่องที่คุณต้องการให้แสดงผล คุณใช้พารามิเตอร์นี้กับคำขอใดก็ได้ที่แสดงข้อมูลการตอบกลับ
ตัวอย่าง
ตัวอย่างต่อไปนี้แสดงการใช้พารามิเตอร์ fields กับ "การสาธิต" ทั่วไป (สมมติ) API
คำขอแบบง่าย: คำขอ HTTP GET นี้ละเว้นพารามิเตอร์ fields และแสดงผลทรัพยากรทั้งหมด
https://www.googleapis.com/demo/v1
การตอบกลับแบบเต็มของทรัพยากร: ข้อมูลทรัพยากรแบบเต็มจะมีช่องต่อไปนี้ พร้อมกับช่องอื่นๆ อีกหลายช่องที่มีการละไว้เพื่อความกระชับ
{
  "kind": "demo",
  ...
  "items": [
  {
    "title": "First title",
    "comment": "First comment.",
    "characteristics": {
      "length": "short",
      "accuracy": "high",
      "followers": ["Jo", "Will"],
    },
    "status": "active",
    ...
  },
  {
    "title": "Second title",
    "comment": "Second comment.",
    "characteristics": {
      "length": "long",
      "accuracy": "medium"
      "followers": [ ],
    },
    "status": "pending",
    ...
  },
  ...
  ]
}คำขอการตอบกลับบางส่วน: คำขอต่อไปนี้สำหรับทรัพยากรเดียวกันนี้ใช้พารามิเตอร์ fields เพื่อลดจำนวนข้อมูลที่ส่งคืนลงอย่างมาก
https://www.googleapis.com/demo/v1?fields=kind,items(title,characteristics/length)
การตอบกลับบางส่วน: เพื่อตอบสนองคำขอข้างต้น เซิร์ฟเวอร์จะส่งการตอบกลับที่มีเฉพาะข้อมูลชนิด พร้อมด้วยอาร์เรย์รายการที่แยกวิเคราะห์ซึ่งมีเฉพาะชื่อ HTML และข้อมูลลักษณะความยาวในแต่ละรายการ
200 OK
{
  "kind": "demo",
  "items": [{
    "title": "First title",
    "characteristics": {
      "length": "short"
    }
  }, {
    "title": "Second title",
    "characteristics": {
      "length": "long"
    }
  },
  ...
  ]
}โปรดทราบว่าการตอบกลับจะเป็นออบเจ็กต์ JSON ที่มีเฉพาะช่องที่เลือกและออบเจ็กต์หลักที่ล้อมรอบอยู่
ต่อไปเราจะกล่าวถึงรายละเอียดวิธีจัดรูปแบบพารามิเตอร์ fields ตามด้วยรายละเอียดเพิ่มเติมเกี่ยวกับผลลัพธ์ที่จะแสดงในคำตอบ
สรุปไวยากรณ์พารามิเตอร์ของช่อง
รูปแบบของค่าพารามิเตอร์คำขอ fields จะอิงตามไวยากรณ์ XPath แบบคร่าวๆ ดูสรุปไวยากรณ์ที่สนับสนุนได้ที่ด้านล่าง และแสดงตัวอย่างเพิ่มเติมในส่วนต่อไปนี้
- ใช้รายการที่คั่นด้วยเครื่องหมายจุลภาคเพื่อเลือกหลายช่อง
- ใช้ a/bเพื่อเลือกช่องbที่ซ้อนอยู่ภายในช่องaใช้a/b/cเพื่อเลือกช่องcที่ฝังอยู่ในb
 ข้อยกเว้น: สำหรับการตอบกลับจาก API ที่ใช้ "ข้อมูล" Wrapper ที่การตอบสนองฝังอยู่ในออบเจ็กต์ dataที่มีลักษณะคล้ายกับdata: { ... }ไม่ต้องรวม "data" ในข้อกำหนดจำเพาะfieldsการรวมออบเจ็กต์ข้อมูลตามข้อกำหนดของช่อง เช่นdata/a/bจะทำให้เกิดข้อผิดพลาด แต่ให้ใช้ข้อกำหนดของfieldsเช่นa/bแทน
- ใช้ตัวเลือกย่อยเพื่อขอชุดฟิลด์ย่อยของอาร์เรย์หรือวัตถุที่ระบุ โดยวางนิพจน์ในวงเล็บ "( )"เช่น fields=items(id,author/email)จะแสดงเฉพาะรหัสสินค้าและอีเมลของผู้เขียนสำหรับองค์ประกอบแต่ละรายการในอาร์เรย์ items คุณยังระบุช่องย่อยช่องเดียวได้ด้วย โดยfields=items(id)มีค่าเท่ากับfields=items/id
- ใช้ไวลด์การ์ดในการเลือกช่อง หากจำเป็น
      เช่น fields=items/pagemap/*เลือกออบเจ็กต์ทั้งหมดในแผนที่หน้าเว็บ
ตัวอย่างเพิ่มเติมของการใช้พารามิเตอร์ "ฟิลด์"
ตัวอย่างด้านล่างจะมีคำอธิบายว่าค่าพารามิเตอร์ fields ส่งผลต่อการตอบกลับอย่างไร
หมายเหตุ: เช่นเดียวกับค่าพารามิเตอร์การค้นหาทั้งหมด ค่าพารามิเตอร์ fields ต้องเป็น URL ที่เข้ารหัส ตัวอย่างในเอกสารนี้ละเว้นการเข้ารหัสเพื่อให้อ่านง่ายขึ้น
- ระบุช่องที่คุณต้องการให้แสดงผล หรือทำเลือกช่อง
- ค่าพารามิเตอร์คำขอ fieldsคือรายการช่องที่คั่นด้วยคอมมา และมีการระบุแต่ละช่องซึ่งสัมพันธ์กับรูทของการตอบกลับ ดังนั้นถ้าคุณดำเนินการ list การตอบกลับจะเป็นคอลเล็กชัน และโดยทั่วไปจะประกอบด้วยอาร์เรย์ของทรัพยากร หากคุณกำลังดำเนินการที่ส่งคืนทรัพยากรเดียว จะมีการระบุช่องซึ่งสัมพันธ์กับทรัพยากรนั้น ถ้าช่องที่คุณเลือกเป็น (หรือเป็นส่วนหนึ่งของ) อาร์เรย์ เซิร์ฟเวอร์จะส่งคืนส่วนที่เลือกขององค์ประกอบทั้งหมดในอาร์เรย์
 
 ตัวอย่างระดับคอลเล็กชันบางส่วนมีดังนี้
 ตัวอย่าง ผลกระทบ itemsแสดงผลองค์ประกอบทั้งหมดในอาร์เรย์ items โดยรวมช่องทั้งหมดในแต่ละองค์ประกอบ แต่ไม่แสดงช่องอื่นๆ etag,itemsแสดงผลทั้งฟิลด์ etagและองค์ประกอบทั้งหมดในอาร์เรย์ itemsitems/titleแสดงผลเฉพาะช่อง titleสำหรับองค์ประกอบทั้งหมดในอาร์เรย์ items
 
 เมื่อใดก็ตามที่มีการส่งคืนช่องที่ซ้อนกัน การตอบสนองจะรวมออบเจ็กต์หลักที่ล้อมรอบอยู่ ช่องหลักไม่มีช่องย่อยอื่นๆ เว้นแต่จะเลือกไว้อย่างชัดเจนcontext/facets/labelแสดงผลเฉพาะช่อง labelสำหรับสมาชิกทั้งหมดของอาร์เรย์facetsซึ่งฝังอยู่ใต้ออบเจ็กต์contextitems/pagemap/*/titleสำหรับองค์ประกอบแต่ละรายการในอาร์เรย์ items จะแสดงเฉพาะช่อง title(หากมี) ของออบเจ็กต์ทั้งหมดที่เป็นระดับย่อยของpagemap
 ตัวอย่างระดับแหล่งข้อมูลบางส่วนมีดังนี้
 ตัวอย่าง ผลกระทบ titleแสดงผลฟิลด์ titleของทรัพยากรที่ขอauthor/uriแสดงผลฟิลด์ย่อย uriของออบเจ็กต์authorในทรัพยากรที่ขอlinks/*/hrefแสดงผลฟิลด์ hrefของออบเจ็กต์ทั้งหมดที่เป็นรายการย่อยของlinks
- ขอเฉพาะบางช่องโดยใช้การเลือกย่อย
- โดยค่าเริ่มต้น หากคำขอของคุณระบุช่องเฉพาะ เซิร์ฟเวอร์จะส่งกลับออบเจ็กต์หรือองค์ประกอบอาร์เรย์ทั้งหมด คุณระบุการตอบกลับที่มีเฉพาะช่องย่อยบางช่องได้ คุณดำเนินการนี้โดยใช้ "( )" ไวยากรณ์การเลือกย่อย ดังที่แสดงในตัวอย่างด้านล่างตัวอย่าง ผลกระทบ items(title,author/uri)แสดงผลเฉพาะค่าของ titleและuriของผู้เขียนสำหรับแต่ละองค์ประกอบในอาร์เรย์ items
การจัดการคำตอบบางส่วน
หลังจากที่เซิร์ฟเวอร์ประมวลผลคำขอที่ถูกต้องซึ่งมีพารามิเตอร์การค้นหา fields แล้ว เซิร์ฟเวอร์จะส่งรหัสสถานะ HTTP 200 OK กลับมาพร้อมข้อมูลที่ขอ หากพารามิเตอร์การค้นหาของ fields มีข้อผิดพลาดหรือไม่ถูกต้อง เซิร์ฟเวอร์จะส่งกลับรหัสสถานะ HTTP 400 Bad Request พร้อมกับข้อความแสดงข้อผิดพลาดที่แจ้งให้ผู้ใช้ทราบความผิดพลาดในการเลือกช่อง (เช่น "Invalid field selection a/b")
ต่อไปนี้คือตัวอย่างคำตอบบางส่วนที่แสดงในส่วนแนะนำด้านบน คำขอใช้พารามิเตอร์ fields เพื่อระบุช่องที่จะแสดง
https://www.googleapis.com/demo/v1?fields=kind,items(title,characteristics/length)
การตอบกลับบางส่วนจะมีลักษณะดังนี้
200 OK
{
  "kind": "demo",
  "items": [{
    "title": "First title",
    "characteristics": {
      "length": "short"
    }
  }, {
    "title": "Second title",
    "characteristics": {
      "length": "long"
    }
  },
  ...
  ]
}หมายเหตุ: สำหรับ API ที่รองรับพารามิเตอร์การค้นหาสำหรับการแบ่งหน้าข้อมูล (เช่น maxResults และ nextPageToken) ให้ใช้พารามิเตอร์เหล่านั้นเพื่อลดผลลัพธ์ของการค้นหาแต่ละรายการให้เป็นขนาดที่จัดการได้ มิฉะนั้น ประสิทธิภาพจะเพิ่มขึ้นเมื่อใช้การตอบกลับบางส่วน
