Meningkatkan performa

Dokumen ini membahas beberapa teknik yang dapat Anda gunakan untuk meningkatkan performa aplikasi. Dalam beberapa kasus, contoh dari API lain atau API generik digunakan untuk mengilustrasikan ide yang disajikan. Namun, konsep yang sama berlaku untuk Google Drive API.

Kompresi menggunakan gzip

Cara yang mudah dan nyaman untuk mengurangi bandwidth yang diperlukan untuk setiap permintaan adalah dengan mengaktifkan kompresi gzip. Meskipun penggunaan CPU tambahan memerlukan waktu untuk mengekstrak hasil, manfaatnya terhadap biaya jaringan biasanya sangat sepadan.

Untuk menerima respons yang dienkode ke gzip, Anda harus melakukan dua hal: Menetapkan header Accept-Encoding, dan mengubah agen pengguna agar berisi string gzip. Berikut adalah contoh header HTTP yang diformat dengan benar untuk mengaktifkan kompresi gzip:

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

Bekerja dengan resource parsial

Cara lain untuk meningkatkan performa panggilan API adalah dengan mengirim dan menerima hanya sebagian data yang Anda inginkan. Hal ini memungkinkan aplikasi Anda menghindari transfer, penguraian, dan penyimpanan kolom yang tidak dibutuhkan, sehingga dapat menggunakan resource termasuk jaringan, CPU, dan memori secara lebih efisien.

Ada dua jenis permintaan parsial:

  • Respons sebagian: Permintaan untuk menentukan kolom yang akan disertakan dalam respons (gunakan parameter permintaan fields).
  • Patch: Permintaan update yang hanya mengirimkan kolom yang ingin diubah (menggunakan kata kerja HTTP PATCH).

Detail selengkapnya tentang cara membuat permintaan sebagian akan disediakan di bagian berikut.

Respons sebagian

Secara default, server mengirimkan kembali representasi penuh resource setelah memproses permintaan. Untuk mendapatkan performa yang lebih baik, Anda dapat meminta server untuk hanya mengirim kolom yang benar-benar diperlukan dan mendapatkan respons sebagian.

Untuk meminta respons sebagian, gunakan parameter permintaan fields untuk menentukan kolom yang ingin ditampilkan. Anda dapat menggunakan parameter ini dengan permintaan apa pun yang menampilkan data respons.

Perhatikan bahwa parameter fields hanya memengaruhi data respons; hal itu tidak memengaruhi data yang perlu Anda kirim, jika ada. Untuk mengurangi jumlah data yang dikirim saat mengubah resource, gunakan permintaan patch.

Contoh

Patch (update sebagian)

Anda juga dapat menghindari pengiriman data yang tidak perlu saat memodifikasi resource. Untuk mengirim data yang diperbarui hanya untuk kolom tertentu yang Anda ubah, gunakan kata kerja HTTP PATCH. Semantik patch yang dijelaskan dalam dokumen ini berbeda (dan lebih sederhana) dibandingkan dengan implementasi GData lama untuk update parsial.

Contoh singkat di bawah ini menunjukkan cara penggunaan patch akan meminimalkan data yang perlu Anda kirim untuk melakukan update kecil.

Contoh

Menangani respons terhadap patch

Setelah memproses permintaan patch yang valid, API akan menampilkan kode respons HTTP 200 OK beserta representasi lengkap resource yang dimodifikasi. Jika ETag digunakan oleh API, server akan memperbarui nilai ETag jika berhasil memproses permintaan patch, seperti yang dilakukan pada PUT.

Permintaan patch menampilkan seluruh representasi resource, kecuali jika Anda menggunakan parameter fields untuk mengurangi jumlah data yang ditampilkan.

Jika permintaan patch menghasilkan status resource baru yang secara sintaksis atau semantik tidak valid, server akan menampilkan kode status HTTP 400 Bad Request atau 422 Unprocessable Entity, dan status resource tetap tidak berubah. Misalnya, jika Anda mencoba menghapus nilai untuk kolom yang wajib diisi, server akan menampilkan error.

Notasi alternatif saat kata kerja HTTP PATCH tidak didukung

Jika firewall Anda tidak mengizinkan permintaan PATCH HTTP, lakukan permintaan POST HTTP dan setel header penggantian ke PATCH, seperti yang ditunjukkan di bawah:

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

Perbedaan antara patch dan update

Dalam praktiknya, saat mengirim data untuk permintaan update yang menggunakan kata kerja PUT HTTP, Anda hanya perlu mengirim kolom yang wajib diisi atau opsional; jika Anda mengirim nilai untuk kolom yang ditetapkan oleh server, nilai tersebut akan diabaikan. Meskipun ini mungkin tampak seperti cara lain untuk melakukan pembaruan sebagian, pendekatan ini memiliki beberapa batasan. Dengan update yang menggunakan kata kerja PUT HTTP, permintaan akan gagal jika Anda tidak memberikan parameter yang diperlukan, dan permintaan ini akan menghapus data yang ditetapkan sebelumnya jika Anda tidak memberikan parameter opsional.

Jauh lebih aman untuk menggunakan patch karena alasan ini. Anda hanya menyediakan data untuk {i>field<i} yang ingin diubah; kolom yang Anda abaikan tidak dihapus. Satu-satunya pengecualian untuk aturan ini terjadi dengan elemen atau array berulang: Jika Anda menghilangkan semuanya, elemen atau array tersebut tetap seperti adanya; jika Anda menyediakannya, seluruh set data itu akan diganti dengan set data yang Anda berikan.

Permintaan batch

Dokumen ini menunjukkan cara mengelompokkan panggilan API sekaligus untuk mengurangi jumlah koneksi HTTP yang harus dibuat oleh klien Anda.

Dokumen ini secara khusus membahas pembuatan permintaan batch dengan mengirim permintaan HTTP. Jika Anda menggunakan library klien Google untuk membuat permintaan batch, lihat dokumentasi library klien.

Ringkasan

Setiap koneksi HTTP yang dibuat klien Anda menghasilkan sejumlah overhead tertentu. Google Drive API mendukung pengelompokan, sehingga klien Anda dapat menempatkan beberapa panggilan API ke dalam satu permintaan HTTP.

Contoh situasi saat Anda mungkin ingin menggunakan pengelompokan:

  • Mengambil metadata untuk sejumlah besar file.
  • Memperbarui metadata atau properti secara massal.
  • Mengubah izin untuk sejumlah besar file, seperti menambahkan pengguna atau grup baru.
  • Menyinkronkan data klien lokal untuk pertama kalinya atau setelah offline dalam waktu lama.

Dalam setiap kasus, daripada mengirim setiap panggilan secara terpisah, Anda dapat mengelompokkannya ke dalam satu permintaan HTTP. Semua permintaan internal harus mengarah ke Google API yang sama.

Anda dibatasi hingga 100 panggilan dalam satu permintaan batch. Jika Anda harus melakukan lebih banyak panggilan dari itu, gunakan beberapa permintaan batch.

Catatan: Sistem batch untuk Google Drive API menggunakan sintaksis yang sama dengan sistem batch processing OData, tetapi semantiknya berbeda.

Batasan tambahan meliputi:

  • Permintaan batch dengan lebih dari 100 panggilan dapat menyebabkan error.
  • Panjang URL untuk setiap permintaan dalam dibatasi hingga 8.000 karakter.
  • Google Drive tidak mendukung operasi batch untuk media, baik untuk upload atau download, maupun untuk mengekspor file.

Detail batch

Permintaan batch terdiri dari beberapa panggilan API yang digabungkan menjadi satu permintaan HTTP, yang dapat dikirim ke batchPath yang ditentukan dalam dokumen discovery API. Jalur default-nya adalah /batch/api_name/api_version. Bagian ini menjelaskan sintaksis batch secara mendetail; kemudian, akan muncul contoh.

Catatan: Kumpulan permintaan n yang dikelompokkan bersama-sama dihitung dalam batas penggunaan Anda sebagai permintaan n, bukan sebagai satu permintaan. Permintaan batch dibagi menjadi serangkaian permintaan sebelum diproses.

Format permintaan batch

Permintaan batch adalah satu permintaan HTTP standar yang berisi beberapa panggilan Google Drive API, menggunakan jenis konten multipart/mixed. Dalam permintaan HTTP utama tersebut, masing-masing bagian berisi permintaan HTTP bertingkat.

Setiap bagian dimulai dengan header HTTP Content-Type: application/http-nya sendiri. Class ini juga dapat memiliki header Content-ID opsional. Namun, header bagian hanya ada untuk menandai awal bagian; terpisah dari permintaan bertingkat. Setelah server membuka permintaan batch menjadi permintaan terpisah, header bagian akan diabaikan.

Isi setiap bagian merupakan permintaan HTTP lengkap, dengan kata kerja, URL, header, dan isinya sendiri. Permintaan HTTP hanya boleh berisi bagian jalur URL; URL lengkap tidak diizinkan dalam permintaan batch.

Header HTTP untuk permintaan batch luar, kecuali untuk header Content- seperti Content-Type, berlaku ke setiap permintaan dalam batch. Jika Anda menentukan header HTTP tertentu dalam permintaan outer dan panggilan individual, nilai header panggilan individual akan menggantikan nilai header permintaan batch luar. Header untuk setiap satu panggilan hanya berlaku untuk panggilan tersebut.

Misalnya, jika Anda memberikan header Otorisasi untuk suatu panggilan, header tersebut hanya akan berlaku untuk panggilan tersebut. Jika Anda memberikan header Otorisasi untuk permintaan luar, header tersebut akan berlaku untuk semua panggilan individual kecuali jika header tersebut menggantinya dengan header Otorisasi sendiri.

Saat menerima permintaan batch, server menerapkan parameter kueri dan header permintaan outer (yang sesuai) ke setiap bagian, lalu memperlakukan setiap bagian seolah-olah merupakan permintaan HTTP terpisah.

Respons terhadap permintaan batch

Respons server adalah satu respons HTTP standar dengan jenis konten multipart/mixed; setiap bagian adalah respons terhadap salah satu permintaan dalam batch permintaan, dalam urutan yang sama dengan permintaan tersebut.

Seperti 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 oleh header Content-Type yang menandai awal bagian.

Jika bagian tertentu dari permintaan memiliki header Content-ID, maka bagian respons yang sesuai memiliki header Content-ID yang cocok, dengan nilai asli yang diawali dengan string response-, seperti yang ditunjukkan dalam contoh berikut singkat ini.

Catatan: Server dapat melaksanakan panggilan Anda dengan urutan apa pun. Jangan menganggap eksekusinya dilakukan sesuai urutan yang Anda tentukan. Jika Anda ingin memastikan bahwa dua panggilan terjadi dalam urutan tertentu, Anda tidak dapat mengirimkannya dalam satu permintaan; sebagai gantinya, kirim pesan pertama saja, lalu tunggu respons terhadap pesan pertama sebelum mengirim yang kedua.

Contoh

Contoh berikut menunjukkan penggunaan batch dengan Google Drive API.

Contoh permintaan batch

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--

Contoh respons batch

Ini adalah respons terhadap contoh permintaan di bagian sebelumnya.

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--

Menampilkan kolom tertentu dari permintaan

Jika Anda tidak menentukan parameter fields, server akan menampilkan kumpulan kolom default yang khusus untuk metode tersebut. Misalnya, metode files.list hanya menampilkan kolom kind, id, name, dan mimeType.

Kolom default yang ditampilkan mungkin bukan yang Anda butuhkan. Jika Anda ingin menentukan kolom yang akan ditampilkan dalam respons, gunakan parameter sistem fields. Untuk mengetahui informasi selengkapnya, lihat Menampilkan kolom tertentu.

Untuk semua metode resource about, comments (tidak termasuk delete), dan replies (tidak termasuk delete), Anda harus menetapkan parameter fields. Metode ini tidak menampilkan kumpulan kolom default.