Dokumen ini menunjukkan cara mengelompokkan panggilan JSON API sekaligus untuk mengurangi jumlah koneksi HTTP yang harus dibuat klien Anda saat mengakses Cloud Storage.
Ringkasan
Setiap koneksi HTTP yang dibuat klien Anda menghasilkan sejumlah overhead tertentu. Cloud Storage JSON API mendukung pengelompokan, sehingga klien Anda dapat menempatkan beberapa panggilan API ke dalam satu permintaan HTTP.
Contoh situasi saat Anda mungkin ingin menggunakan pengelompokan:
- Mengupdate metadata, seperti izin, di banyak objek.
- Menghapus banyak objek.
Dalam setiap kasus, daripada mengirim setiap panggilan secara terpisah, Anda dapat mengelompokkannya menjadi satu permintaan HTTP. Semua permintaan internal harus diarahkan ke Cloud Storage JSON API.
Anda tidak boleh menyertakan lebih dari 100 panggilan dalam satu permintaan batch. Jika Anda perlu melakukan lebih banyak panggilan dari itu, gunakan beberapa permintaan batch. Total payload permintaan batch harus kurang dari 10 MB.
Detail batch
Permintaan batch terdiri dari beberapa panggilan API yang digabungkan menjadi satu permintaan HTTP, yang dapat dikirim ke endpoint batch Cloud Storage, yaitu https://storage.googleapis.com/batch/storage/v1
. Bagian ini menjelaskan sintaksis batch secara mendetail; kemudian, akan muncul contoh.
Format permintaan batch
Permintaan batch adalah satu permintaan HTTP standar yang berisi beberapa panggilan Cloud Storage JSON API. Permintaan utama ini menggunakan
jenis konten multipart/mixed
. Dalam permintaan HTTP utama, ada beberapa bagian
yang masing-masing berisi permintaan HTTP bertingkat.
Setiap bagian dimulai dengan header HTTP Content-Type: application/http
-nya sendiri.
Bagian tersebut juga dapat memiliki header Content-ID
opsional. Header ini
menandai awal bagian, tetapi terpisah dari permintaan HTTP
bertingkat. Ini berarti bahwa setelah server membuka permintaan batch ke dalam
permintaan terpisah, header bagian akan diabaikan.
Isi setiap bagian itu sendiri merupakan permintaan HTTP lengkap, dengan kata kerja, URL, header, dan isinya sendiri. Permintaan HTTP ini hanya boleh berisi bagian jalur URL; URL lengkap dapat memiliki perilaku yang tidak ditentukan.
Header HTTP untuk permintaan batch luar, kecuali untuk header Content-
seperti Content-Type
, juga berlaku untuk setiap permintaan bertingkat. Namun, jika
Anda menentukan header HTTP tertentu dalam permintaan outer dan permintaan bertingkat,
nilai header permintaan bertingkat akan menggantikan nilai header permintaan
batch luar untuk permintaan khusus tersebut.
Misalnya, jika Anda memberikan header Authorization
untuk permintaan bertingkat tertentu, header tersebut hanya akan berlaku untuk permintaan yang menentukannya. Jika Anda menyediakan header Authorization
untuk permintaan luar, header tersebut akan berlaku untuk semua permintaan bertingkat kecuali jika Anda menggantinya dengan header Authorization
-nya sendiri.
Saat menerima permintaan batch, Cloud Storage akan menerapkan header dan parameter kueri permintaan luar (yang sesuai) ke setiap bagian, lalu memperlakukan setiap bagian seolah-olah merupakan permintaan HTTP terpisah.
Respons terhadap permintaan batch
Respons Cloud Storage adalah satu respons HTTP standar dengan
jenis konten multipart/mixed
; setiap bagian dari respons utama ini adalah respons
terhadap salah satu permintaan dalam permintaan batch. Urutan respons sama
dengan permintaan.
Seperti semua bagian dalam permintaan, setiap bagian respons berisi respons HTTP lengkap, termasuk kode status, header, dan isi. Dan seperti bagian dalam
permintaan, setiap bagian respons didahului dengan header Content-Type
yang
menandai awal bagian tersebut. Untuk mengetahui informasi lebih lanjut tentang kode status, baca artikel Status HTTP dan kode error untuk Cloud Storage JSON API.
Jika bagian permintaan tertentu memiliki header Content-ID
, bagian
respons yang sesuai memiliki header Content-ID
yang cocok. Header Content-ID
respons dimulai dengan response-
, diikuti dengan nilai Content-ID
yang digunakan dalam permintaan, seperti yang ditunjukkan dalam contoh.
Contoh
Contoh batch berikut mengupdate metadata kustom untuk tiga objek di example-bucket
.
Contoh permintaan HTTP batch
HTTP
POST /batch/storage/v1 HTTP/1.1 Host: storage.googleapis.com Content-Length: 960 Content-Type: multipart/mixed; boundary="===============7330845974216740156==" Authorization: Bearer ya29.AHES6ZRVmB7fkLtd1XTmq6mo0S1wqZZi3-Lh_s-6Uw7p8vtgSwg --===============7330845974216740156== Content-Type: application/http Content-Transfer-Encoding: binary Content-ID: <b29c5de2-0db4-490b-b421-6a51b598bd22+1> PATCH /storage/v1/b/example-bucket/o/obj1 HTTP/1.1 Content-Type: application/json accept: application/json content-length: 31 {"metadata": {"type": "tabby"}} --===============7330845974216740156== Content-Type: application/http Content-Transfer-Encoding: binary Content-ID: <b29c5de2-0db4-490b-b421-6a51b598bd22+2> PATCH /storage/v1/b/example-bucket/o/obj2 HTTP/1.1 Content-Type: application/json accept: application/json content-length: 32 {"metadata": {"type": "tuxedo"}} --===============7330845974216740156== Content-Type: application/http Content-Transfer-Encoding: binary Content-ID: <b29c5de2-0db4-490b-b421-6a51b598bd22+3> PATCH /storage/v1/b/example-bucket/o/obj3 HTTP/1.1 Content-Type: application/json accept: application/json content-length: 32 {"metadata": {"type": "calico"}} --===============7330845974216740156==--
Library klien
C++
Library klien C++ tidak mendukung permintaan batch.
C#
Library klien C# tidak mendukung permintaan batch.
Go
Library klien Go tidak mendukung permintaan batch.
Java
Untuk informasi selengkapnya, lihat dokumentasi referensi Cloud Storage Java API.
Node.js
Library klien Node.js tidak mendukung permintaan batch.
PHP
Library klien PHP tidak mendukung permintaan batch.
Python
Untuk informasi selengkapnya, lihat dokumentasi referensi Cloud Storage Python API.
Ruby
Untuk mempelajari cara membuat permintaan batch menggunakan Ruby, lihat dokumentasi referensi Cloud Storage Ruby API.
Contoh respons HTTP batch
Ini adalah respons terhadap permintaan contoh HTTP di bagian sebelumnya.
HTTP/1.1 200 OK Content-Type: multipart/mixed; boundary=batch_pK7JBAk73-E=_AA5eFwv4m2Q= Date: Mon, 22 Jan 2018 18:56:00 GMT Expires: Mon, 22 Jan 2018 18:56:00 GMT Cache-Control: private, max-age=0 Content-Length: 3767 --batch_pK7JBAk73-E=_AA5eFwv4m2Q= Content-Type: application/http Content-ID: <response-b29c5de2-0db4-490b-b421-6a51b598bd22+1> HTTP/1.1 200 OK ETag: "lGaP-E0memYDumK16YuUDM_6Gf0/V43j6azD55CPRGb9b6uytDYl61Y" Content-Type: application/json; charset=UTF-8 Date: Mon, 22 Jan 2018 18:56:00 GMT Expires: Mon, 22 Jan 2018 18:56:00 GMT Cache-Control: private, max-age=0 Content-Length: 846 { "kind": "storage#object", "id": "example-bucket/obj1/1495822576643790", . . . "metadata": { "type": "tabby" }, . . . } --batch_pK7JBAk73-E=_AA5eFwv4m2Q= Content-Type: application/http Content-ID: <response-b29c5de2-0db4-490b-b421-6a51b598bd22+2> HTTP/1.1 200 OK ETag: "lGaP-E0memYDumK16YuUDM_6Gf0/91POdd-sxSAkJnS8Dm7wMxBSDKk" Content-Type: application/json; charset=UTF-8 Date: Mon, 22 Jan 2018 18:56:00 GMT Expires: Mon, 22 Jan 2018 18:56:00 GMT Cache-Control: private, max-age=0 Content-Length: 846 { "kind": "storage#object", "id": "example-bucket/obj2/1495822576643790", . . . "metadata": { "type": "tuxedo" }, . . . } --batch_pK7JBAk73-E=_AA5eFwv4m2Q= Content-Type: application/http Content-ID: <response-b29c5de2-0db4-490b-b421-6a51b598bd22+3> HTTP/1.1 200 OK ETag: "lGaP-E0memYDumK16YuUDM_6Gf0/d2Z1F1_ZVbB1dC0YKM9rX5VAgIQ" Content-Type: application/json; charset=UTF-8 Date: Mon, 22 Jan 2018 18:56:00 GMT Expires: Mon, 22 Jan 2018 18:56:00 GMT Cache-Control: private, max-age=0 Content-Length: 846 { "kind": "storage#object", "id": "example-bucket/obj3/1495822576643790", . . . "metadata": { "type": "calico" }, . . . } --batch_pK7JBAk73-E=_AA5eFwv4m2Q=--
Jika keseluruhan permintaan tidak diformat dengan benar dan Cloud Storage tidak dapat mengurainya menjadi sub-permintaan, Anda akan menerima error 400
. Jika tidak, Cloud Storage akan menampilkan kode status 200
, meskipun beberapa atau semua sub-permintaan gagal.
Saat keseluruhan permintaan ditampilkan dengan kode status 200
, respons akan berisi
hasil untuk setiap sub-permintaan, termasuk kode status untuk setiap sub-permintaan, yang menunjukkan
apakah sub-permintaan berhasil atau gagal. Misalnya,
saat menghapus objek secara massal, setiap sub-permintaan yang berhasil akan berisi
kode status 204 No Content
.