Tips 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 Photos 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 hanya meminta 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.

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.

Contoh

Contoh berikut menunjukkan penggunaan parameter fields dengan API "Demo" generik (fiksi).

Permintaan sederhana: Permintaan GET HTTP ini menghilangkan parameter fields dan menampilkan resource lengkap.

https://www.googleapis.com/demo/v1

Respons resource lengkap: Data resource lengkap mencakup kolom berikut, beserta banyak kolom lainnya yang telah dihilangkan agar lebih singkat.

{
  "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",
    ...
  },
  ...
  ]
}

Permintaan respons parsial: Permintaan berikut untuk resource yang sama ini menggunakan parameter fields untuk mengurangi jumlah data yang ditampilkan secara signifikan.

https://www.googleapis.com/demo/v1?fields=kind,items(title,characteristics/length)

Respons sebagian: Sebagai respons atas permintaan di atas, server mengirim kembali respons yang hanya berisi informasi jenis, beserta array item standar yang hanya menyertakan informasi karakteristik judul dan panjang HTML di setiap item.

200 OK
{
  "kind": "demo",
  "items": [{
    "title": "First title",
    "characteristics": {
      "length": "short"
    }
  }, {
    "title": "Second title",
    "characteristics": {
      "length": "long"
    }
  },
  ...
  ]
}

Perhatikan bahwa responsnya adalah objek JSON yang hanya menyertakan kolom yang dipilih dan objek induk yang mencakupnya.

Detail tentang cara memformat parameter fields akan dibahas berikutnya, diikuti dengan detail selengkapnya tentang apa yang sebenarnya ditampilkan dalam respons.

Ringkasan sintaksis parameter kolom

Format nilai parameter permintaan fields hanya didasarkan pada sintaksis XPath. Sintaksis yang didukung dirangkum di bawah ini, dan contoh tambahan diberikan di bagian berikut.

  • Gunakan daftar yang dipisahkan koma untuk memilih beberapa kolom.
  • Gunakan a/b untuk memilih kolom b yang bertingkat dalam kolom a; gunakan a/b/c untuk memilih kolom c yang disusun bertingkat di dalam b.

    Pengecualian: Untuk respons API yang menggunakan wrapper "data", tempat respons disusun bertingkat dalam objek data yang terlihat seperti data: { ... }, jangan sertakan "data" di Spesifikasi fields. Menyertakan objek data dengan spesifikasi kolom seperti data/a/b akan menyebabkan error. Sebagai gantinya, cukup gunakan spesifikasi fields seperti a/b.

  • Gunakan sub-selektor untuk meminta kumpulan sub-kolom spesifik dari array atau objek dengan menempatkan ekspresi dalam tanda kurung "( )".

    Misalnya: fields=items(id,author/email) hanya menampilkan ID item dan email penulis untuk setiap elemen dalam array item. Anda juga dapat menentukan satu sub-kolom, dengan fields=items(id) setara dengan fields=items/id.

  • Gunakan karakter pengganti dalam pemilihan kolom, jika diperlukan.

    Misalnya: fields=items/pagemap/* memilih semua objek di peta halaman.

Contoh penggunaan parameter kolom lainnya

Contoh di bawah menyertakan deskripsi tentang pengaruh nilai parameter fields terhadap respons.

Catatan: Seperti semua nilai parameter kueri, nilai parameter fields harus dienkode ke URL. Agar lebih mudah dibaca, contoh dalam dokumen ini menghilangkan encoding.

Identifikasi kolom yang ingin Anda tampilkan, atau buat pilihan kolom.
Nilai parameter permintaan fields adalah daftar kolom yang dipisahkan koma, dan setiap kolom ditentukan secara relatif terhadap root respons. Jadi, jika Anda menjalankan operasi list, responsnya adalah kumpulan, dan biasanya mencakup array resource. Jika Anda melakukan operasi yang menampilkan satu resource, kolom akan ditetapkan relatif terhadap resource tersebut. Jika kolom yang Anda pilih adalah (atau merupakan bagian dari) array, server akan menampilkan bagian yang dipilih dari semua elemen dalam array.

Berikut beberapa contoh tingkat koleksi:
Contoh Efek
items Menampilkan semua elemen dalam array item, termasuk semua kolom di setiap elemen, tetapi tidak ada kolom lainnya.
etag,items Menampilkan kolom etag dan semua elemen dalam array item.
items/title Hanya menampilkan kolom title untuk semua elemen dalam array item.

Setiap kali kolom bertingkat ditampilkan, respons akan menyertakan objek induk yang mencakupnya. Kolom induk tidak menyertakan kolom turunan lainnya, kecuali jika kolom tersebut juga dipilih secara eksplisit.
context/facets/label Hanya menampilkan kolom label untuk semua anggota array facets, yang bertingkat dalam objek context.
items/pagemap/*/title Untuk setiap elemen dalam array item, hanya menampilkan kolom title (jika ada) dari semua objek yang merupakan turunan dari pagemap.

Berikut beberapa contoh tingkat resource:
Contoh Efek
title Menampilkan kolom title untuk resource yang diminta.
author/uri Menampilkan sub-kolom uri dari objek author dalam resource yang diminta.
links/*/href
Menampilkan kolom href dari semua objek yang merupakan turunan dari links.
Hanya minta bagian kolom tertentu menggunakan sub-pilihan.
Secara default, jika permintaan Anda menentukan kolom tertentu, server akan menampilkan objek atau elemen array secara keseluruhan. Anda dapat menentukan respons yang hanya menyertakan sub-kolom tertentu. Anda melakukannya menggunakan sintaksis sub-pilihan "( )", seperti dalam contoh di bawah.
Contoh Efek
items(title,author/uri) Hanya menampilkan nilai title dan uri penulis untuk setiap elemen dalam array item.

Menangani respons sebagian

Setelah server memproses permintaan valid yang menyertakan parameter kueri fields, server akan mengirimkan kembali kode status HTTP 200 OK, bersama dengan data yang diminta. Jikafields parameter kueri mengalami error atau tidak valid, server akan menampilkan400 Bad Request bersama dengan pesan error yang memberi tahu pengguna apa yang salah dengan pemilihan kolom (misalnya,"Invalid field selection a/b").

Berikut adalah contoh respons sebagian yang ditampilkan di bagian pendahuluan di atas. Permintaan menggunakan parameter fields untuk menentukan kolom yang akan ditampilkan.

https://www.googleapis.com/demo/v1?fields=kind,items(title,characteristics/length)

Respons sebagian akan terlihat seperti ini:

200 OK
{
  "kind": "demo",
  "items": [{
    "title": "First title",
    "characteristics": {
      "length": "short"
    }
  }, {
    "title": "Second title",
    "characteristics": {
      "length": "long"
    }
  },
  ...
  ]
}

Catatan: Untuk API yang mendukung parameter kueri untuk penomoran halaman data (misalnya, maxResults dan nextPageToken), gunakan parameter tersebut untuk mengurangi hasil setiap kueri ke ukuran yang dapat dikelola. Jika tidak, peningkatan kinerja yang mungkin terjadi dengan respons sebagian mungkin tidak akan terlihat.