ปรับปรุงประสิทธิภาพ

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

การบีบอัดโดยใช้ gzip

วิธีที่ง่ายและสะดวกในการลดแบนด์วิดท์ที่จำเป็นสำหรับแต่ละคำขอคือการเปิดใช้การบีบอัด Gzip แม้ว่าการดำเนินการนี้จะต้องใช้เวลา CPU เพิ่มเติมเพื่อคลายการบีบอัดผลลัพธ์ แต่การแลกเปลี่ยนกับค่าใช้จ่ายของเครือข่ายมักจะทำให้คุ้มค่ามาก

หากต้องการรับการตอบกลับที่เข้ารหัส gzip คุณต้องทำ 2 อย่าง ได้แก่ ตั้งค่าส่วนหัว Accept-Encoding และแก้ไข User-Agent ให้มีสตริง gzip ตัวอย่างส่วนหัว HTTP ที่จัดรูปแบบอย่างถูกต้องสำหรับการเปิดใช้การบีบอัด gzip มีดังนี้

Accept-Encoding: gzip
User-Agent: my program (gzip)

การทำงานกับทรัพยากรบางส่วน

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

คำขอบางส่วนมี 2 ประเภท ได้แก่

  • การตอบกลับบางส่วน: คำขอที่คุณระบุฟิลด์ที่จะรวมไว้ในการตอบกลับ (ใช้พารามิเตอร์คำขอ fields)
  • Patch: คำขออัปเดตที่คุณส่งเฉพาะฟิลด์ที่ต้องการเปลี่ยนแปลง (ใช้กริยา HTTP PATCH)

ดูรายละเอียดเพิ่มเติมเกี่ยวกับการส่งคำขอบางส่วนได้ในส่วนต่อไปนี้

การตอบกลับบางส่วน

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

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

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

Patch (การอัปเดตบางส่วน)

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

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

ตัวอย่าง

การจัดการการตอบกลับ Patch

หลังจากประมวลผลคำขอ Patch ที่ถูกต้องแล้ว API จะแสดงรหัสการตอบกลับ HTTP 200 OK พร้อมกับการแสดงทรัพยากรที่แก้ไขแบบสมบูรณ์ หาก API ใช้ ETag เซิร์ฟเวอร์จะอัปเดตค่า ETag เมื่อประมวลผลคำขอ Patch สำเร็จ เช่นเดียวกับที่ทำกับ PUT

คำขอ Patch จะแสดงการแสดงทรัพยากรทั้งหมด เว้นแต่คุณจะใช้พารามิเตอร์ fields เพื่อลดปริมาณข้อมูลที่แสดง

หากคำขอ Patch ทำให้เกิดสถานะทรัพยากรใหม่ที่ไม่ถูกต้องตามไวยากรณ์หรือความหมาย เซิร์ฟเวอร์จะแสดงรหัสสถานะ HTTP 400 Bad Request หรือ 422 Unprocessable Entity และสถานะทรัพยากรจะยังคงไม่เปลี่ยนแปลง ตัวอย่างเช่น หากคุณพยายามลบค่าของฟิลด์ที่ต้องกรอก เซิร์ฟเวอร์จะแสดงข้อผิดพลาด

สัญกรณ์อื่นเมื่อไม่รองรับกริยา HTTP PATCH

หากไฟร์วอลล์ไม่อนุญาตคำขอ HTTP PATCH ให้ส่งคำขอ HTTP POST และตั้งค่าส่วนหัวการลบล้างเป็น PATCH ดังที่แสดงด้านล่าง

POST https://www.googleapis.com/...
X-HTTP-Method-Override: PATCH
...

ความแตกต่างระหว่าง Patch กับ Update

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

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

คำขอแบบกลุ่ม

เอกสารนี้แสดงวิธีจัดกลุ่มการเรียก API เข้าด้วยกันเพื่อลดจำนวนการเชื่อมต่อ HTTP ที่ไคลเอ็นต์ต้องสร้าง

เอกสารนี้จะกล่าวถึงการส่งคำขอ HTTP เพื่อส่งคำขอแบบกลุ่มโดยเฉพาะ แต่หากคุณใช้ไลบรารีของไคลเอ็นต์ Google เพื่อส่งคำขอแบบกลุ่ม โปรดดูเอกสารประกอบของไลบรารีของไคลเอ็นต์

ภาพรวม

การเชื่อมต่อ HTTP แต่ละครั้งที่ไคลเอ็นต์สร้างขึ้นจะทำให้เกิดค่าใช้จ่ายในการดำเนินการบางอย่าง Google Drive API รองรับการจัดกลุ่มเพื่อให้ไคลเอ็นต์สามารถรวมการเรียก API หลายรายการไว้ในคำขอ HTTP เดียวได้

ตัวอย่างสถานการณ์ที่คุณอาจต้องการใช้การจัดกลุ่ม

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

ในแต่ละกรณี คุณสามารถจัดกลุ่มการเรียกแต่ละครั้งเข้าด้วยกันเป็นคำขอ HTTP เดียวแทนที่จะส่งการเรียกแต่ละครั้งแยกกัน คำขอภายในทั้งหมดต้องส่งไปยัง Google API เดียวกัน

คุณส่งคำขอแบบกลุ่มได้สูงสุด 100 รายการ หากต้องส่งคำขอมากกว่านั้น ให้ใช้คำขอแบบกลุ่มหลายรายการ

หมายเหตุ: ระบบแบบกลุ่มสำหรับ Google Drive API ใช้ไวยากรณ์เดียวกับระบบการประมวลผลแบบกลุ่มของ OData แต่ความหมายจะแตกต่างกัน

ข้อจำกัดเพิ่มเติมมีดังนี้

  • คำขอแบบกลุ่มที่มีการเรียกมากกว่า 100 รายการอาจทำให้เกิดข้อผิดพลาด
  • URL สำหรับคำขอภายในแต่ละรายการมีความยาวได้สูงสุด 8,000 อักขระ
  • Google ไดรฟ์ไม่รองรับการดำเนินการแบบกลุ่มสำหรับสื่อ ไม่ว่าจะเป็นการอัปโหลดหรือดาวน์โหลด หรือการส่งออกไฟล์

รายละเอียดแบบกลุ่ม

คำขอแบบกลุ่มประกอบด้วยการเรียก API หลายรายการที่รวมกันเป็นคำขอ HTTP เดียว ซึ่งสามารถส่งไปยัง batchPath ที่ระบุไว้ใน เอกสารการค้นพบ API เส้นทางเริ่มต้นคือ /batch/api_name/api_version ส่วนนี้จะอธิบายไวยากรณ์แบบกลุ่มโดยละเอียด และมีตัวอย่างในส่วนถัดไป

หมายเหตุ: ชุดคำขอ n รายการที่จัดกลุ่มเข้าด้วยกันจะนับรวมในขีดจำกัดการใช้งานเป็นคำขอ n รายการ ไม่ใช่คำขอเดียว ระบบจะแยกคำขอแบบกลุ่มออกเป็นชุดคำขอก่อนประมวลผล

รูปแบบคำขอแบบกลุ่ม

คำขอแบบกลุ่มคือคำขอ HTTP มาตรฐานรายการเดียวที่มีการเรียก Google Drive API หลายรายการ โดยใช้ประเภทเนื้อหา multipart/mixed ภายในคำขอ HTTP หลักนั้น แต่ละส่วนจะมีคำขอ HTTP ที่ซ้อนอยู่

แต่ละส่วนจะเริ่มต้นด้วยส่วนหัว HTTP Content-Type: application/http ของตัวเอง และอาจมีส่วนหัว Content-ID ที่ไม่บังคับด้วย อย่างไรก็ตาม ส่วนหัวของส่วนมีไว้เพื่อทำเครื่องหมายจุดเริ่มต้นของส่วนเท่านั้น โดยจะแยกจากคำขอที่ซ้อนอยู่ หลังจากที่เซิร์ฟเวอร์คลายคำขอแบบกลุ่มออกเป็นคำขอแยกกันแล้ว ระบบจะละเว้นส่วนหัวของส่วน

เนื้อหาของแต่ละส่วนเป็นคำขอ HTTP ที่สมบูรณ์ในตัวเอง โดยมีกริยา, URL, ส่วนหัว และเนื้อหาของตัวเอง คำขอ HTTP ต้องมีเฉพาะส่วนเส้นทางของ URL เท่านั้น โดยไม่อนุญาตให้ใช้ URL แบบเต็มในคำขอแบบกลุ่ม

ส่วนหัว HTTP สำหรับคำขอแบบกลุ่มภายนอก ยกเว้นส่วนหัว Content- เช่น Content-Type จะใช้กับทุกคำขอในกลุ่ม หากคุณระบุส่วนหัว HTTP ที่กำหนดไว้ทั้งในคำขอภายนอกและการเรียกแต่ละครั้ง ค่าของส่วนหัวของการเรียกแต่ละครั้งจะลบล้างค่าของส่วนหัวของคำขอแบบกลุ่มภายนอก ส่วนหัวสำหรับการเรียกแต่ละครั้งจะใช้กับการเรียกนั้นเท่านั้น

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

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

การตอบกลับคำขอแบบกลุ่ม

การตอบกลับของเซิร์ฟเวอร์คือการตอบกลับ HTTP มาตรฐานรายการเดียวที่มีประเภทเนื้อหา multipart/mixed โดยแต่ละส่วนเป็นการตอบกลับคำขอรายการใดรายการหนึ่งในคำขอแบบกลุ่มตามลำดับเดียวกับคำขอ

เช่นเดียวกับส่วนต่างๆ ในคำขอ ส่วนการตอบกลับแต่ละส่วนจะมีการตอบกลับ HTTP ที่สมบูรณ์ ซึ่งรวมถึงรหัสสถานะ ส่วนหัว และเนื้อหา และเช่นเดียวกับส่วนต่างๆ ในคำขอ ส่วนการตอบกลับแต่ละส่วนจะมีส่วนหัว Content-Type นำหน้าเพื่อทำเครื่องหมายจุดเริ่มต้นของส่วน

หากส่วนที่กำหนดของคำขอมีส่วนหัว Content-ID ส่วนที่เกี่ยวข้องของการตอบกลับจะมีส่วนหัว Content-ID ที่ตรงกัน โดยมีสตริง response- นำหน้าค่าเดิม ดังที่แสดงในตัวอย่างต่อไปนี้

หมายเหตุ: เซิร์ฟเวอร์อาจดำเนินการเรียกของคุณตามลำดับใดก็ได้ อย่าคาดหวังว่าระบบจะดำเนินการตามลำดับที่คุณระบุ หากต้องการให้การเรียก 2 รายการเกิดขึ้นตามลำดับที่กำหนด คุณจะส่งการเรียกทั้ง 2 รายการในคำขอเดียวไม่ได้ แต่ให้ส่งการเรียกรายการแรกแยกกัน แล้วรอการตอบกลับการเรียกรายการแรกก่อนที่จะส่งการเรียกรายการที่ 2

ตัวอย่าง

ตัวอย่างต่อไปนี้แสดงการใช้การจัดกลุ่มกับ Google Drive API

ตัวอย่างคำขอแบบกลุ่ม

POST https://www.googleapis.com/batch/drive/v3
Accept-Encoding: gzip
User-Agent: Google-HTTP-Java-Client/1.20.0 (gzip)
Content-Type: multipart/mixed; boundary=END_OF_PART
Content-Length: 963

--END_OF_PART Content-Length: 337 Content-Type: application/http content-id: 1 content-transfer-encoding: binary

POST https://www.googleapis.com/drive/v3/files/fileId/permissions?fields=id Authorization: Bearer authorization_token Content-Length: 70 Content-Type: application/json; charset=UTF-8

{ "emailAddress":"example@appsrocks.com", "role":"writer", "type":"user" } --END_OF_PART Content-Length: 353 Content-Type: application/http content-id: 2 content-transfer-encoding: binary

POST https://www.googleapis.com/drive/v3/files/fileId/permissions?fields=id&sendNotificationEmail=false Authorization: Bearer authorization_token Content-Length: 58 Content-Type: application/json; charset=UTF-8

{ "domain":"appsrocks.com", "role":"reader", "type":"domain" } --END_OF_PART--

ตัวอย่างการตอบกลับแบบกลุ่ม

นี่คือการตอบกลับคำขอตัวอย่างในส่วนก่อนหน้า

HTTP/1.1 200 OK
Alt-Svc: quic=":443"; p="1"; ma=604800
Server: GSE
Alternate-Protocol: 443:quic,p=1
X-Frame-Options: SAMEORIGIN
Content-Encoding: gzip
X-XSS-Protection: 1; mode=block
Content-Type: multipart/mixed; boundary=batch_6VIxXCQbJoQ_AATxy_GgFUk
Transfer-Encoding: chunked
X-Content-Type-Options: nosniff
Date: Fri, 13 Nov 2015 19:28:59 GMT
Cache-Control: private, max-age=0
Vary: X-Origin
Vary: Origin
Expires: Fri, 13 Nov 2015 19:28:59 GMT

--batch_6VIxXCQbJoQ_AATxy_GgFUk Content-Type: application/http Content-ID: response-1

HTTP/1.1 200 OK Content-Type: application/json; charset=UTF-8 Date: Fri, 13 Nov 2015 19:28:59 GMT Expires: Fri, 13 Nov 2015 19:28:59 GMT Cache-Control: private, max-age=0 Content-Length: 35

{ "id": "12218244892818058021i" }

--batch_6VIxXCQbJoQ_AATxy_GgFUk Content-Type: application/http Content-ID: response-2

HTTP/1.1 200 OK Content-Type: application/json; charset=UTF-8 Date: Fri, 13 Nov 2015 19:28:59 GMT Expires: Fri, 13 Nov 2015 19:28:59 GMT Cache-Control: private, max-age=0 Content-Length: 35

{ "id": "04109509152946699072k" }

--batch_6VIxXCQbJoQ_AATxy_GgFUk--

แสดงผลฟิลด์ที่เฉพาะเจาะจงจากคำขอ

หากคุณไม่ได้ระบุพารามิเตอร์ fields เซิร์ฟเวอร์จะแสดงผลชุดฟิลด์เริ่มต้นที่เฉพาะเจาะจงสำหรับเมธอด ตัวอย่างเช่น เมธอด files.list จะแสดงผลเฉพาะฟิลด์ kind, id, name, และ mimeType

ฟิลด์เริ่มต้นที่แสดงผลอาจไม่ใช่สิ่งที่คุณต้องการ หากต้องการระบุ ฟิลด์ที่จะแสดงผลในการตอบกลับ ให้ใช้ fields พารามิเตอร์ ระบบ ดูข้อมูลเพิ่มเติมได้ที่ แสดงผลฟิลด์ที่เฉพาะเจาะจง

สำหรับเมธอดทั้งหมดของทรัพยากร about, comments (ไม่รวม delete) และ replies (ไม่รวม delete) คุณ ต้อง ตั้งค่าพารามิเตอร์ fields เนื่องจากเมธอดเหล่านี้จะไม่แสดงผลชุดฟิลด์เริ่มต้น