Gmail API ช่วยให้คุณอัปโหลดข้อมูลไฟล์ได้เมื่อสร้างหรืออัปเดตฉบับร่าง หรือเมื่อแทรกหรือส่งข้อความ
ตัวเลือกการอัปโหลด
Gmail API อนุญาตให้คุณอัปโหลดข้อมูลไบนารีหรือสื่อบางประเภท ลักษณะเฉพาะของข้อมูลที่คุณอัปโหลดได้จะระบุไว้ในหน้าอ้างอิงสำหรับเมธอดที่รองรับการอัปโหลดสื่อ
- ขนาดไฟล์อัปโหลดสูงสุด: ปริมาณข้อมูลสูงสุดที่คุณจัดเก็บได้ด้วยวิธีนี้
- ประเภท MIME ของสื่อที่ยอมรับ: ประเภทของข้อมูลไบนารีที่คุณจัดเก็บได้โดยใช้วิธีนี้
คุณส่งคำขออัปโหลดได้ด้วยวิธีใดวิธีหนึ่งต่อไปนี้ ระบุวิธีการที่คุณใช้กับพารามิเตอร์คำขอ uploadType
- อัปโหลดง่ายๆ:
uploadType=media
สำหรับการโอนไฟล์ขนาดเล็กอย่างรวดเร็ว เช่น 5 MB หรือน้อยกว่า - การอัปโหลดแบบหลายส่วน:
uploadType=multipart
สำหรับการโอนไฟล์ขนาดเล็กและข้อมูลเมตาอย่างรวดเร็ว จะโอนไฟล์พร้อมข้อมูลเมตาที่อธิบายไฟล์นั้นทั้งหมดในคำขอเดียว - การอัปโหลดต่อ:
uploadType=resumable
เพื่อการโอนที่เชื่อถือได้ โดยเฉพาะอย่างยิ่งเมื่อใช้กับไฟล์ขนาดใหญ่ วิธีนี้จะใช้คำขอเริ่มต้นเซสชัน ซึ่งอาจมีข้อมูลเมตาหรือไม่ก็ได้ นี่เป็นกลยุทธ์ที่ดีที่ควรใช้กับแอปพลิเคชันส่วนใหญ่ เนื่องจากใช้ได้กับไฟล์ขนาดเล็กด้วย โดยมีค่าใช้จ่ายเป็นคำขอ HTTP เพิ่มเติม 1 รายการต่อการอัปโหลด
เมื่ออัปโหลดสื่อ คุณจะใช้ URI พิเศษ ในความเป็นจริงแล้ว เมธอดที่รองรับการอัปโหลดสื่อจะมีปลายทาง URI 2 รายการ ได้แก่
URI /upload สำหรับสื่อ รูปแบบของปลายทางการอัปโหลดคือ URI ของทรัพยากรมาตรฐานที่มีคำนำหน้า "/upload" ใช้ URI นี้เมื่อ โอนข้อมูลสื่อเอง
ตัวอย่าง:
POST /upload/gmail/v1/users/userId/messages/send
URI ของทรัพยากรมาตรฐานสำหรับข้อมูลเมตา หากทรัพยากรมีฟิลด์ข้อมูล ฟิลด์เหล่านั้นจะใช้เพื่อจัดเก็บข้อมูลเมตาที่อธิบายไฟล์ที่อัปโหลด คุณใช้ URI นี้ได้เมื่อสร้างหรืออัปเดตค่าข้อมูลเมตา
ตัวอย่าง
POST /gmail/v1/users/userId/messages/send
อัปโหลดง่ายๆ
วิธีที่ตรงไปตรงมาที่สุดในการอัปโหลดไฟล์คือการส่งคำขออัปโหลดอย่างง่าย ตัวเลือกนี้เป็นตัวเลือกที่ดีในกรณีต่อไปนี้
- ไฟล์มีขนาดเล็กพอที่จะอัปโหลดอีกครั้งได้ทั้งหมดหากการเชื่อมต่อล้มเหลว
- ไม่มีข้อมูลเมตาที่จะส่ง ซึ่งอาจเป็นจริงหากคุณวางแผนที่จะส่งข้อมูลเมตาสำหรับทรัพยากรนี้ในคำขอแยกต่างหาก หรือหากไม่มีการรองรับหรือไม่มีข้อมูลเมตา
หากต้องการใช้การอัปโหลดแบบง่าย ให้ส่งคำขอ POST
หรือ PUT
ไปยัง
URI /upload ของเมธอด แล้วเพิ่มพารามิเตอร์การค้นหา
uploadType=media
เช่น
POST https://www.googleapis.com/upload/gmail/v1/users/userId/messages/send?uploadType=media
ส่วนหัว HTTP ที่จะใช้เมื่อส่งคำขออัปโหลดอย่างง่ายมีดังนี้
Content-Type
ตั้งค่าเป็นประเภทข้อมูลสื่อการอัปโหลดที่เมธอดยอมรับประเภทใดประเภทหนึ่ง ซึ่งระบุไว้ในข้อมูลอ้างอิงของ APIContent-Length
ตั้งค่าเป็นจำนวนไบต์ที่คุณกำลังอัปโหลด ไม่จำเป็นหากคุณใช้การเข้ารหัสการโอนแบบเป็นกลุ่ม
ตัวอย่าง: การอัปโหลดอย่างง่าย
ตัวอย่างต่อไปนี้แสดงการใช้คำขออัปโหลดอย่างง่ายสำหรับ Gmail API
POST /upload/gmail/v1/users/userId/messages/send?uploadType=media HTTP/1.1 Host: www.googleapis.com Content-Type: message/rfc822 Content-Length: number_of_bytes_in_file Authorization: Bearer your_auth_token Email Message data
หากคำขอสำเร็จ เซิร์ฟเวอร์จะแสดงรหัสสถานะ HTTP 200 OK
พร้อมกับข้อมูลเมตา
HTTP/1.1 200 Content-Type: application/json {
"id": string,
"threadId": string,
"labelIds": [
string
],
"snippet": string,
"historyId": unsigned long,
"payload": {
"partId": string,
"mimeType": string,
"filename": string,
"headers": [
{
"name": string,
"value": string
}
],
"body": users.messages.attachments Resource,
"parts": [
(MessagePart)
]
},
"sizeEstimate": integer,
"raw": bytes
}
การอัปโหลดหลายส่วน
หากมีข้อมูลเมตาที่ต้องการส่งพร้อมกับข้อมูลที่จะอัปโหลด คุณสามารถส่งmultipart/related
คำขอเดียวได้ ตัวเลือกนี้เหมาะสำหรับกรณีที่ข้อมูลที่คุณส่งมีขนาดเล็กพอที่จะอัปโหลดอีกครั้งได้ทั้งหมดหากการเชื่อมต่อล้มเหลว
หากต้องการใช้การอัปโหลดหลายส่วน ให้ส่งคำขอ POST
หรือ PUT
ไปยัง URI /upload ของเมธอด แล้วเพิ่มพารามิเตอร์การค้นหา
uploadType=multipart
เช่น
POST https://www.googleapis.com/upload/gmail/v1/users/userId/messages/send?uploadType=multipart
ส่วนหัว HTTP ระดับบนสุดที่จะใช้เมื่อส่งคำขออัปโหลดแบบหลายส่วน ได้แก่
Content-Type
ตั้งค่าเป็น multipart/related และรวมสตริงขอบเขตที่คุณใช้เพื่อระบุส่วนต่างๆ ของคำขอContent-Length
ตั้งค่าเป็นจำนวนไบต์ทั้งหมดในเนื้อหาคำขอ ส่วนสื่อของคำขอต้องมีขนาดเล็กกว่าขนาดไฟล์สูงสุดที่ระบุไว้สำหรับเมธอดนี้
เนื้อหาของคำขอจะจัดรูปแบบเป็นmultipart/related
ประเภทเนื้อหา [RFC2387] และมี 2 ส่วนที่แน่นอน โดยระบบจะระบุชิ้นส่วนด้วยสตริงขอบเขต และสตริงขอบเขตสุดท้ายจะตามด้วยขีดกลาง 2 ขีด
คำขอแบบหลายส่วนแต่ละส่วนต้องมีส่วนหัว Content-Type
เพิ่มเติมดังนี้
- ส่วนข้อมูลเมตา: ต้องอยู่เป็นส่วนแรก และ
Content-Type
ต้องตรงกับรูปแบบข้อมูลเมตาที่ยอมรับ - พาร์ทสื่อ: ต้องมาเป็นอันดับที่ 2 และ
Content-Type
ต้องตรงกับประเภท MIME ของสื่อที่เมธอดนั้นยอมรับ
ดูข้อมูลอ้างอิงของ API สำหรับรายการประเภท MIME ของสื่อที่ยอมรับและขีดจำกัดขนาดของไฟล์ที่อัปโหลดสำหรับแต่ละเมธอด
หมายเหตุ: หากต้องการสร้างหรืออัปเดตเฉพาะส่วนข้อมูลเมตา
โดยไม่ต้องอัปโหลดข้อมูลที่เกี่ยวข้อง ให้ส่งคำขอ POST
หรือ PUT
ไปยังปลายทางของทรัพยากรมาตรฐาน
https://www.googleapis.com/gmail/v1/users/userId/messages/send
ตัวอย่าง: การอัปโหลดแบบหลายส่วน
ตัวอย่างด้านล่างแสดงคำขออัปโหลดแบบหลายส่วนสำหรับ Gmail API
POST /upload/gmail/v1/users/userId/messages/send?uploadType=multipart HTTP/1.1 Host: www.googleapis.com Authorization: Bearer your_auth_token Content-Type: multipart/related; boundary=foo_bar_baz Content-Length: number_of_bytes_in_entire_request_body --foo_bar_baz Content-Type: application/json; charset=UTF-8 {
"id": string,
"threadId": string,
"labelIds": [
string
],
"snippet": string,
"historyId": unsigned long,
"payload": {
"partId": string,
"mimeType": string,
"filename": string,
"headers": [
{
"name": string,
"value": string
}
],
"body": users.messages.attachments Resource,
"parts": [
(MessagePart)
]
},
"sizeEstimate": integer,
"raw": bytes
} --foo_bar_baz Content-Type: message/rfc822 Email Message data --foo_bar_baz--
หากคำขอสำเร็จ เซิร์ฟเวอร์จะแสดงรหัสสถานะ HTTP 200 OK
พร้อมกับข้อมูลเมตา
HTTP/1.1 200 Content-Type: application/json {
"id": string,
"threadId": string,
"labelIds": [
string
],
"snippet": string,
"historyId": unsigned long,
"payload": {
"partId": string,
"mimeType": string,
"filename": string,
"headers": [
{
"name": string,
"value": string
}
],
"body": users.messages.attachments Resource,
"parts": [
(MessagePart)
]
},
"sizeEstimate": integer,
"raw": bytes
}
การอัปโหลดที่ดำเนินการต่อได้
คุณสามารถใช้โปรโตคอลการอัปโหลดต่อได้เพื่ออัปโหลดไฟล์ข้อมูลได้อย่างน่าเชื่อถือมากขึ้น โปรโตคอลนี้ช่วยให้คุณดำเนินการอัปโหลดต่อได้หลังจากที่การสื่อสารล้มเหลวทำให้การรับส่งข้อมูลหยุดชะงัก ซึ่งจะมีประโยชน์อย่างยิ่งหากคุณกำลังโอนไฟล์ขนาดใหญ่และมีโอกาสสูงที่เครือข่ายจะหยุดชะงักหรือการส่งล้มเหลว เช่น เมื่ออัปโหลดจากแอปไคลเอ็นต์บนอุปกรณ์เคลื่อนที่ นอกจากนี้ยังช่วยลดการใช้แบนด์วิดท์ในกรณีที่เครือข่ายล้มเหลวได้ด้วย เนื่องจากคุณไม่ต้องเริ่มการอัปโหลดไฟล์ขนาดใหญ่ตั้งแต่ต้น
ขั้นตอนการใช้การอัปโหลดต่อได้มีดังนี้
- เริ่มเซสชันที่สามารถกลับมาดำเนินการต่อได้ ส่งคำขอเริ่มต้นไปยัง URI การอัปโหลดที่มีข้อมูลเมตา (หากมี)
- บันทึก URI ของเซสชันที่สามารถดำเนินการต่อได้ บันทึก URI เซสชันที่แสดงผลในการตอบกลับของคำขอเริ่มต้น คุณจะต้องใช้ URI นี้สำหรับคำขอที่เหลือในเซสชันนี้
- อัปโหลดไฟล์ ส่งไฟล์สื่อไปยัง URI ของเซสชันที่สามารถดำเนินการต่อได้
นอกจากนี้ แอปที่ใช้การอัปโหลดต่อได้จะต้องมีโค้ดเพื่ออัปโหลดต่อเมื่อถูกขัดจังหวะ หากการอัปโหลดถูกขัดจังหวะ ให้ดูว่าระบบได้รับข้อมูลเรียบร้อยแล้วเท่าใด จากนั้นอัปโหลดต่อจากจุดนั้น
หมายเหตุ: URI การอัปโหลดจะหมดอายุหลังจากผ่านไป 1 สัปดาห์
ขั้นตอนที่ 1: เริ่มเซสชันที่สามารถกลับมาดำเนินการต่อได้
หากต้องการเริ่มการอัปโหลดต่อ ให้ส่งคำขอ POST
หรือ PUT
ไปยัง URI /upload ของเมธอด และเพิ่มพารามิเตอร์การค้นหา
uploadType=resumable
เช่น
POST https://www.googleapis.com/upload/gmail/v1/users/userId/messages/send?uploadType=resumable
สำหรับคำขอเริ่มต้นนี้ เนื้อความจะว่างเปล่าหรือมีเฉพาะข้อมูลเมตาเท่านั้น คุณจะโอนเนื้อหาจริงของไฟล์ที่ต้องการอัปโหลดในคำขอที่ตามมา
ใช้ส่วนหัว HTTP ต่อไปนี้กับคำขอเริ่มต้นX-Upload-Content-Type
ตั้งค่าเป็นประเภท MIME ของสื่อของข้อมูลการอัปโหลดที่จะโอนในคำขอที่ตามมาX-Upload-Content-Length
ตั้งค่าเป็นจำนวนไบต์ของข้อมูลการอัปโหลดที่จะโอนในคำขอที่ตามมา หากไม่ทราบความยาว ณ เวลาที่ส่งคำขอนี้ คุณสามารถละเว้นส่วนหัวนี้ได้- หากระบุข้อมูลเมตา ให้ทำดังนี้
Content-Type
ตั้งค่าตามประเภทข้อมูลของข้อมูลเมตา Content-Length
. ตั้งค่าเป็นจำนวนไบต์ที่ระบุในเนื้อหาของคำขอเริ่มต้นนี้ ไม่จำเป็นหากคุณใช้การเข้ารหัสการโอนแบบเป็นกลุ่ม
ดูข้อมูลอ้างอิงของ API สำหรับรายการประเภท MIME ของสื่อที่ยอมรับและขีดจำกัดขนาดของไฟล์ที่อัปโหลดสำหรับแต่ละเมธอด
ตัวอย่าง: คำขอเริ่มต้นเซสชันที่ดำเนินการต่อได้
ตัวอย่างต่อไปนี้แสดงวิธีเริ่มต้นเซสชันที่สามารถกลับมาทำงานต่อได้สำหรับ Gmail API
POST /upload/gmail/v1/users/userId/messages/send?uploadType=resumable HTTP/1.1 Host: www.googleapis.com Authorization: Bearer your_auth_token Content-Length: 38 Content-Type: application/json; charset=UTF-8 X-Upload-Content-Type: message/rfc822 X-Upload-Content-Length: 2000000 {
"id": string,
"threadId": string,
"labelIds": [
string
],
"snippet": string,
"historyId": unsigned long,
"payload": {
"partId": string,
"mimeType": string,
"filename": string,
"headers": [
{
"name": string,
"value": string
}
],
"body": users.messages.attachments Resource,
"parts": [
(MessagePart)
]
},
"sizeEstimate": integer,
"raw": bytes
}
หมายเหตุ: สำหรับคำขออัปเดตที่สามารถดำเนินการต่อได้ครั้งแรกที่ไม่มีข้อมูลเมตา ให้เว้นเนื้อหาของคำขอว่างไว้ และตั้งค่าส่วนหัว Content-Length
เป็น 0
ส่วนถัดไปจะอธิบายวิธีจัดการการตอบกลับ
ขั้นตอนที่ 2: บันทึก URI ของเซสชันที่สามารถดำเนินการต่อได้
หากคำขอเริ่มต้นเซสชันสำเร็จ เซิร์ฟเวอร์ API จะตอบกลับด้วยรหัสสถานะ HTTP 200 OK
นอกจากนี้ ยังมีส่วนหัว Location
ที่ระบุ URI ของเซสชันที่สามารถกลับมาทำงานต่อได้ ส่วนหัว Location
ที่แสดงในตัวอย่างด้านล่างมีส่วนพารามิเตอร์การค้นหา upload_id
ซึ่งให้รหัสการอัปโหลดที่ไม่ซ้ำกันเพื่อใช้สำหรับเซสชันนี้
ตัวอย่าง: การตอบกลับการเริ่มต้นเซสชันที่สามารถกลับมาดำเนินการต่อได้
คำตอบสำหรับคำขอในขั้นตอนที่ 1 มีดังนี้
HTTP/1.1 200 OK Location: https://www.googleapis.com/upload/gmail/v1/users/userId/messages/send?uploadType=resumable&upload_id=xa298sd_sdlkj2 Content-Length: 0
ค่าของส่วนหัว Location
ตามที่แสดงในการตอบกลับตัวอย่างข้างต้นคือ URI ของเซสชันที่คุณจะใช้เป็นปลายทาง HTTP สำหรับการอัปโหลดไฟล์จริงหรือการค้นหาสถานะการอัปโหลด
คัดลอกและบันทึก URI ของเซสชันเพื่อให้คุณใช้กับคำขอที่ตามมาได้
ขั้นตอนที่ 3: อัปโหลด
หากต้องการอัปโหลดไฟล์ ให้ส่งคำขอ PUT
ไปยัง URI การอัปโหลดที่คุณได้รับในขั้นตอนก่อนหน้า รูปแบบของคำขออัปโหลดมีดังนี้
PUT session_uri
ส่วนหัว HTTP ที่จะใช้เมื่อส่งคำขออัปโหลดไฟล์ต่อได้มี Content-Length
ตั้งค่านี้เป็นจำนวนไบต์ที่คุณอัปโหลดในคำขอนี้ ซึ่งโดยทั่วไปคือขนาดไฟล์ที่อัปโหลด
ตัวอย่าง: คำขออัปโหลดไฟล์ที่สามารถดำเนินการต่อได้
ต่อไปนี้คือคำขอที่สามารถดำเนินการต่อเพื่ออัปโหลดไฟล์ข้อความอีเมลขนาด 2,000,000 ไบต์ทั้งหมดสำหรับตัวอย่างปัจจุบัน
PUT https://www.googleapis.com/upload/gmail/v1/users/userId/messages/send?uploadType=resumable&upload_id=xa298sd_sdlkj2 HTTP/1.1 Content-Length: 2000000 Content-Type: message/rfc822 bytes 0-1999999
หากคำขอสำเร็จ เซิร์ฟเวอร์จะตอบกลับด้วย HTTP 201 Created
พร้อมกับข้อมูลเมตาที่เชื่อมโยงกับทรัพยากรนี้ หากคำขอเริ่มต้นของเซสชันที่สามารถดำเนินการต่อได้เป็น PUT
เพื่ออัปเดตทรัพยากรที่มีอยู่ การตอบกลับที่สำเร็จจะเป็น 200 OK
พร้อมกับข้อมูลเมตาที่เชื่อมโยงกับทรัพยากรนี้
หากคำขออัปโหลดถูกขัดจังหวะหรือคุณได้รับคำตอบ HTTP 503 Service Unavailable
หรือคำตอบ 5xx
อื่นๆ จากเซิร์ฟเวอร์ ให้ทำตามขั้นตอนที่ระบุไว้ในดำเนินการอัปโหลดต่อที่ถูกขัดจังหวะ
การอัปโหลดไฟล์เป็นก้อน
การอัปโหลดต่อได้ช่วยให้คุณแบ่งไฟล์ออกเป็นหลายๆ ส่วนและส่งคำขอหลายรายการเพื่ออัปโหลดแต่ละส่วนตามลำดับได้ เราไม่แนะนำให้ใช้วิธีนี้เนื่องจากคำขอเพิ่มเติมจะทำให้เกิดค่าใช้จ่ายด้านประสิทธิภาพ และโดยทั่วไปแล้วไม่จำเป็นต้องใช้ อย่างไรก็ตาม คุณอาจต้องใช้การแบ่งกลุ่มเพื่อลดปริมาณข้อมูลที่โอนในคำขอเดียว ซึ่งจะเป็นประโยชน์เมื่อมีการจำกัดเวลาที่แน่นอนสำหรับคำขอแต่ละรายการ เช่น คำขอ Google App Engine บางคลาส นอกจากนี้ยังช่วยให้คุณทำสิ่งต่างๆ ได้ เช่น แสดงข้อบ่งชี้ความคืบหน้าในการอัปโหลดสำหรับเบราว์เซอร์รุ่นเดิมที่ไม่รองรับความคืบหน้าในการอัปโหลดโดยค่าเริ่มต้น
ดำเนินการอัปโหลดที่หยุดชะงักต่อ
หากคำขออัปโหลดสิ้นสุดลงก่อนที่จะได้รับการตอบกลับ หรือหากคุณได้รับการตอบกลับ HTTP 503 Service Unavailable
จากเซิร์ฟเวอร์ คุณจะต้องอัปโหลดต่อจากที่หยุดชะงัก หากต้องการทำสิ่งต่อไปนี้
- สถานะคำขอ ค้นหาสถานะปัจจุบันของการอัปโหลดโดยส่งคำขอ
PUT
ที่ว่างเปล่าไปยัง URI ของการอัปโหลด สำหรับคำขอนี้ ส่วนหัว HTTP ควรมีส่วนหัวContent-Range
ที่ระบุว่าไม่ทราบตำแหน่งปัจจุบันในไฟล์ เช่น ตั้งค่าContent-Range
เป็น*/2000000
หากความยาวไฟล์ทั้งหมดคือ 2,000,000 หากไม่ทราบขนาดเต็มของไฟล์ ให้ตั้งค่าContent-Range
เป็น*/*
หมายเหตุ: คุณขอสถานะระหว่างก้อนได้ ไม่ใช่แค่ในกรณีที่การอัปโหลดถูกขัดจังหวะ ซึ่งจะเป็นประโยชน์ เช่น หากคุณต้องการแสดงข้อบ่งชี้ความคืบหน้าในการอัปโหลดสำหรับเบราว์เซอร์รุ่นเดิม
- รับจำนวนไบต์ที่อัปโหลด ประมวลผลการตอบกลับจากการค้นหาสถานะ เซิร์ฟเวอร์ใช้ส่วนหัว
Range
ในการตอบกลับเพื่อระบุไบต์ที่ได้รับจนถึงตอนนี้ เช่นRange
ส่วนหัวของ0-299999
แสดงว่าได้รับไบต์แรก 300,000 ไบต์ของไฟล์แล้ว - อัปโหลดข้อมูลที่เหลือ สุดท้ายนี้ เมื่อทราบตำแหน่งที่จะดำเนินการต่อในคำขอแล้ว ให้ส่งข้อมูลที่เหลือหรือก้อนข้อมูลปัจจุบัน โปรดทราบว่าคุณต้องถือว่าข้อมูลที่เหลือเป็นก้อนข้อมูลแยกต่างหากในทั้ง 2 กรณี ดังนั้นคุณจึงต้องส่งส่วนหัว
Content-Range
เมื่ออัปโหลดต่อ
ตัวอย่าง: การอัปโหลดต่อจากที่หยุดชะงัก
1) ขอสถานะการอัปโหลด
คำขอต่อไปนี้ใช้ส่วนหัว Content-Range
เพื่อระบุว่าระบบไม่ทราบตำแหน่งปัจจุบันในไฟล์ขนาด 2,000,000 ไบต์
PUT {session_uri} HTTP/1.1 Content-Length: 0 Content-Range: bytes */2000000
2) แยกจำนวนไบต์ที่อัปโหลดไปแล้วออกจากคำตอบ
การตอบกลับของเซิร์ฟเวอร์ใช้ส่วนหัว Range
เพื่อระบุว่าได้รับไบต์แรก 43 ไบต์ของไฟล์แล้ว ใช้ค่าบนของส่วนหัว Range
เพื่อกำหนดจุดเริ่มต้นของการอัปโหลดต่อ
HTTP/1.1 308 Resume Incomplete Content-Length: 0 Range: 0-42
หมายเหตุ: หากอัปโหลดเสร็จสมบูรณ์แล้ว การตอบกลับสถานะอาจเป็น 201 Created
หรือ 200 OK
ซึ่งอาจเกิดขึ้นได้หากการเชื่อมต่อขาดหายหลังจากอัปโหลดไบต์ทั้งหมดแล้ว แต่ก่อนที่ไคลเอ็นต์จะได้รับการตอบกลับจากเซิร์ฟเวอร์
3) อัปโหลดต่อจากจุดที่ค้างไว้
คำขอต่อไปนี้จะดำเนินการอัปโหลดต่อโดยส่งไบต์ที่เหลือของไฟล์ โดยเริ่มที่ไบต์ 43
PUT {session_uri} HTTP/1.1 Content-Length: 1999957 Content-Range: bytes 43-1999999/2000000 bytes 43-1999999
แนวทางปฏิบัติแนะนำ
เมื่ออัปโหลดสื่อ การทราบแนวทางปฏิบัติแนะนำบางอย่างที่เกี่ยวข้องกับการจัดการข้อผิดพลาดจะเป็นประโยชน์
- ดำเนินการต่อหรือลองอัปโหลดอีกครั้งหากการอัปโหลดล้มเหลวเนื่องจากการเชื่อมต่อถูกขัดจังหวะหรือเกิด
5xx
ข้อผิดพลาดใดๆ ซึ่งรวมถึง500 Internal Server Error
502 Bad Gateway
503 Service Unavailable
504 Gateway Timeout
- ใช้กลยุทธ์ Exponential Backoff หากได้รับ
5xx
ข้อผิดพลาดเกี่ยวกับเซิร์ฟเวอร์เมื่อกลับมาดำเนินการต่อหรือลองส่งคำขออัปโหลดอีกครั้ง ข้อผิดพลาดเหล่านี้อาจเกิดขึ้นหากเซิร์ฟเวอร์ทำงานหนักเกินไป การหยุดชั่วคราวแบบทวีคูณจะช่วยบรรเทาปัญหาประเภทนี้ได้ในช่วงที่มีคำขอจำนวนมากหรือการรับส่งข้อมูลในเครือข่ายสูง - คำขอประเภทอื่นๆ ไม่ควรได้รับการจัดการโดย Exponential Backoff แต่คุณยังคงลองส่งคำขอเหล่านั้นอีกครั้งได้ เมื่อลองส่งคำขอเหล่านี้อีกครั้ง ให้จำกัดจำนวนครั้งที่ลองใหม่ เช่น โค้ดอาจจำกัดการลองใหม่ไว้ที่ 10 ครั้งหรือน้อยกว่านั้นก่อนที่จะรายงานข้อผิดพลาด
- จัดการข้อผิดพลาด
404 Not Found
และ410 Gone
เมื่อทำการอัปโหลดต่อได้โดยเริ่มการอัปโหลดทั้งหมดใหม่ตั้งแต่ต้น
Exponential Backoff
Exponential Backoff เป็นกลยุทธ์การจัดการข้อผิดพลาดมาตรฐานสำหรับแอปพลิเคชันเครือข่าย ซึ่งไคลเอ็นต์จะลองส่งคำขอที่ล้มเหลวอีกครั้งเป็นระยะๆ โดยใช้เวลานานขึ้นเรื่อยๆ หากคำขอจำนวนมากหรือการรับส่งข้อมูลในเครือข่ายที่หนาแน่นทำให้เซิร์ฟเวอร์แสดงข้อผิดพลาด การหยุดชั่วคราวแบบทวีคูณอาจเป็นกลยุทธ์ที่ดีในการจัดการข้อผิดพลาดเหล่านั้น ในทางกลับกัน กลยุทธ์นี้ไม่เกี่ยวข้องกับการจัดการข้อผิดพลาดที่ไม่เกี่ยวข้องกับปริมาณเครือข่ายหรือเวลาในการตอบสนอง เช่น ข้อมูลเข้าสู่ระบบการให้สิทธิ์ที่ไม่ถูกต้องหรือข้อผิดพลาดไม่พบไฟล์
เมื่อใช้อย่างถูกต้อง Exponential Backoff จะเพิ่มประสิทธิภาพการใช้แบนด์วิดท์ ลดจำนวนคำขอที่จำเป็นเพื่อให้ได้คำตอบที่สำเร็จ และเพิ่มปริมาณงานของคำขอในสภาพแวดล้อมที่ทำงานพร้อมกันให้ได้สูงสุด
ขั้นตอนการใช้ Exponential Backoff แบบง่ายมีดังนี้
- ส่งคำขอไปยัง API
- ได้รับ
HTTP 503
การตอบกลับ ซึ่งบ่งบอกว่าคุณควรลองส่งคำขออีกครั้ง - รอ 1 วินาที + random_number_milliseconds แล้วลองส่งคำขออีกครั้ง
- ได้รับ
HTTP 503
การตอบกลับ ซึ่งบ่งบอกว่าคุณควรลองส่งคำขออีกครั้ง - รอ 2 วินาที + random_number_milliseconds แล้วลองส่งคำขออีกครั้ง
- ได้รับ
HTTP 503
การตอบกลับ ซึ่งบ่งบอกว่าคุณควรลองส่งคำขออีกครั้ง - รอ 4 วินาที + random_number_milliseconds แล้วลองส่งคำขออีกครั้ง
- ได้รับ
HTTP 503
การตอบกลับ ซึ่งบ่งบอกว่าคุณควรลองส่งคำขออีกครั้ง - รอ 8 วินาที + random_number_milliseconds แล้วลองส่งคำขออีกครั้ง
- ได้รับ
HTTP 503
การตอบกลับ ซึ่งบ่งบอกว่าคุณควรลองส่งคำขออีกครั้ง - รอ 16 วินาที + random_number_milliseconds แล้วลองส่งคำขออีกครั้ง
- หยุด รายงานหรือบันทึกข้อผิดพลาด
ในโฟลว์ข้างต้น random_number_milliseconds คือจำนวนมิลลิวินาทีแบบสุ่มที่น้อยกว่าหรือเท่ากับ 1, 000 ซึ่งจำเป็นเนื่องจากการเพิ่มความล่าช้าแบบสุ่มเล็กน้อยจะช่วยกระจายภาระงานให้สม่ำเสมอมากขึ้นและหลีกเลี่ยงความเป็นไปได้ที่จะทำให้เซิร์ฟเวอร์ล่ม ต้องกำหนดค่าของ random_number_milliseconds ใหม่หลังจากการรอแต่ละครั้ง
หมายเหตุ: ระยะเวลารอจะเป็น (2 ^ n) + random_number_milliseconds เสมอ โดย n เป็นจำนวนเต็มที่เพิ่มขึ้นอย่างต่อเนื่องซึ่งกำหนดเป็น 0 ในตอนแรก ระบบจะเพิ่มจำนวนเต็ม n ขึ้น 1 สำหรับแต่ละการวนซ้ำ (แต่ละคำขอ)
ระบบตั้งค่าให้อัลกอริทึมสิ้นสุดเมื่อ n เป็น 5 ขีดจำกัดนี้จะป้องกันไม่ให้ไคลเอ็นต์ลองใหม่ไปเรื่อยๆ และทำให้เกิดความล่าช้ารวมประมาณ 32 วินาทีก่อนที่จะถือว่าคำขอเป็น "ข้อผิดพลาดที่กู้คืนไม่ได้" คุณสามารถกำหนดจำนวนการลองใหม่สูงสุดให้มากขึ้นได้ โดยเฉพาะหากกำลังอัปโหลดไฟล์ขนาดใหญ่ เพียงแต่ต้องกำหนดเวลาหน่วงของการลองใหม่ให้อยู่ในระดับที่เหมาะสม เช่น น้อยกว่า 1 นาที