Bab ini menjelaskan konsep metode standar, yaitu List
, Get
,
Create
, Update
, dan Delete
. Metode standar mengurangi kompleksitas dan
meningkatkan konsistensi. Lebih dari 70% metode API di repositori Google API adalah metode standar, yang membuatnya jauh lebih mudah untuk dipelajari dan digunakan.
Tabel berikut menjelaskan cara memetakan metode standar ke metode HTTP:
Metode Standar | Pemetaan HTTP | Isi Permintaan HTTP | Isi Respons HTTP |
---|---|---|---|
List |
GET <collection URL> |
T/A | Daftar aset* |
Get |
GET <resource URL> |
T/A | Referensi* |
Create |
POST <collection URL> |
Resource | Referensi* |
Update |
PUT or PATCH <resource URL> |
Resource | Referensi* |
Delete |
DELETE <resource URL> |
T/A | google.protobuf.Empty ** |
*Resource yang ditampilkan dari metode List
, Get
, Create
, dan Update
dapat berisi sebagian data jika metode tersebut mendukung mask kolom respons, yang menentukan subset kolom yang akan ditampilkan.
Dalam beberapa kasus, platform API secara native mendukung mask kolom untuk semua metode.
**Respons yang ditampilkan dari metode Delete
yang tidak segera
menghapus resource (seperti memperbarui flag atau membuat operasi penghapusan
yang berjalan lama) harus berisi operasi yang berjalan lama
atau resource yang diubah.
Metode standar dapat juga menampilkan operasi yang berjalan lama untuk permintaan yang tidak selesai dalam rentang waktu panggilan API tunggal.
Bagian berikut menjelaskan setiap metode standar secara mendetail. Contoh ini menunjukkan metode yang ditentukan dalam file .proto dengan anotasi khusus untuk pemetaan HTTP. Anda dapat menemukan banyak contoh yang menggunakan metode standar di repositori Google API.
Daftar
Metode List
menggunakan nama koleksi dan nol atau beberapa parameter sebagai
input, serta menampilkan daftar resource yang cocok dengan input tersebut.
List
biasanya digunakan untuk menelusuri resource. List
cocok untuk data dari
satu koleksi yang dibatasi ukuran dan tidak di-cache. Untuk kasus yang lebih luas,
metode kustom Search
harus digunakan.
Batch get (seperti metode yang menggunakan beberapa ID resource
dan menampilkan objek untuk setiap ID tersebut) harus diimplementasikan sebagai
metode BatchGet
kustom, bukan List
. Namun, jika memiliki
metode List
yang sudah ada dan menyediakan fungsi yang sama,
Anda dapat menggunakan kembali metode List
untuk tujuan ini. Jika Anda menggunakan metode BatchGet
kustom, metode tersebut harus dipetakan ke HTTP GET
.
Pola umum yang berlaku: penomoran halaman, pengurutan hasil.
Konvensi penamaan yang berlaku: kolom filter, kolom hasil
Pemetaan HTTP:
- Metode
List
harus menggunakan kata kerjaGET
HTTP. - Kolom pesan permintaan yang menerima nama koleksi yang resource-nya tercantum harus dipetakan ke jalur URL. Jika nama koleksi dipetakan ke jalur URL, segmen terakhir template URL (ID koleksi) harus berupa literal.
- Semua kolom pesan permintaan yang tersisa akan dipetakan ke parameter kueri URL.
- Tidak ada isi permintaan; konfigurasi API tidak boleh mendeklarasikan
klausa
body
. - Isi respons harus berisi daftar resource beserta metadata opsional.
Contoh:
// Lists books in a shelf.
rpc ListBooks(ListBooksRequest) returns (ListBooksResponse) {
// List method maps to HTTP GET.
option (google.api.http) = {
// The `parent` captures the parent resource name, such as "shelves/shelf1".
get: "/v1/{parent=shelves/*}/books"
};
}
message ListBooksRequest {
// The parent resource name, for example, "shelves/shelf1".
string parent = 1;
// The maximum number of items to return.
int32 page_size = 2;
// The next_page_token value returned from a previous List request, if any.
string page_token = 3;
}
message ListBooksResponse {
// The field name should match the noun "books" in the method name. There
// will be a maximum number of items returned based on the page_size field
// in the request.
repeated Book books = 1;
// Token to retrieve the next page of results, or empty if there are no
// more results in the list.
string next_page_token = 2;
}
Dapatkan
Metode Get
mengambil nama resource, nol atau beberapa parameter, dan
menampilkan resource yang ditentukan.
Pemetaan HTTP:
- Metode
Get
harus menggunakan kata kerjaGET
HTTP. - Kolom pesan permintaan yang menerima nama resource harus dipetakan ke jalur URL.
- Semua kolom pesan permintaan yang tersisa akan dipetakan ke parameter kueri URL.
- Tidak ada isi permintaan; konfigurasi API tidak boleh mendeklarasikan
klausa
body
. - Resource yang ditampilkan akan dipetakan ke seluruh isi respons.
Contoh:
// Gets a book.
rpc GetBook(GetBookRequest) returns (Book) {
// Get maps to HTTP GET. Resource name is mapped to the URL. No body.
option (google.api.http) = {
// Note the URL template variable which captures the multi-segment resource
// name of the requested book, such as "shelves/shelf1/books/book2"
get: "/v1/{name=shelves/*/books/*}"
};
}
message GetBookRequest {
// The field will contain name of the resource requested, for example:
// "shelves/shelf1/books/book2"
string name = 1;
}
Buat
Metode Create
menggunakan nama resource induk, resource, dan nol atau beberapa
parameter. Opsi ini membuat resource baru di bawah induk yang ditentukan, dan menampilkan
resource yang baru dibuat.
Jika mendukung pembuatan resource, API harus memiliki metode Create
untuk setiap jenis resource yang dapat dibuat.
Pemetaan HTTP:
- Metode
Create
harus menggunakan kata kerjaPOST
HTTP. - Pesan permintaan harus memiliki kolom
parent
yang menentukan nama resource induk tempat resource akan dibuat. - Kolom pesan permintaan yang berisi resource harus dipetakan ke isi permintaan HTTP. Jika anotasi
google.api.http
digunakan untuk metodeCreate
, bentukbody: "<resource_field>"
harus digunakan. - Permintaan tersebut mungkin berisi kolom bernama
<resource>_id
untuk memungkinkan pemanggil memilih ID yang ditetapkan klien. Kolom ini mungkin ada di dalam resource. - Semua kolom pesan permintaan yang tersisa akan dipetakan ke parameter kueri URL.
- Resource yang ditampilkan akan dipetakan ke seluruh isi respons HTTP.
Jika metode Create
mendukung nama resource yang ditetapkan klien dan
resource sudah ada, permintaan akan gagal dengan kode error
ALREADY_EXISTS
atau
menggunakan nama resource lain yang ditetapkan server dan dokumentasi harus
jelas bahwa nama resource yang dibuat mungkin berbeda dari yang diteruskan.
Metode Create
harus mengambil resource input, sehingga saat skema resource
berubah, skema permintaan dan skema resource tidak perlu diperbarui. Untuk kolom resource yang tidak dapat ditetapkan oleh klien, kolom tersebut harus
didokumentasikan sebagai kolom "Hanya output".
Contoh:
// Creates a book in a shelf.
rpc CreateBook(CreateBookRequest) returns (Book) {
// Create maps to HTTP POST. URL path as the collection name.
// HTTP request body contains the resource.
option (google.api.http) = {
// The `parent` captures the parent resource name, such as "shelves/1".
post: "/v1/{parent=shelves/*}/books"
body: "book"
};
}
message CreateBookRequest {
// The parent resource name where the book is to be created.
string parent = 1;
// The book id to use for this book.
string book_id = 3;
// The book resource to create.
// The field name should match the Noun in the method name.
Book book = 2;
}
rpc CreateShelf(CreateShelfRequest) returns (Shelf) {
option (google.api.http) = {
post: "/v1/shelves"
body: "shelf"
};
}
message CreateShelfRequest {
Shelf shelf = 1;
}
Pembaruan
Metode Update
mengambil pesan permintaan yang berisi resource serta nol
atau beberapa parameter. Library ini memperbarui resource yang ditentukan dan propertinya,
serta menampilkan resource yang diperbarui.
Properti resource yang dapat diubah harus dapat diubah oleh
metode Update
, kecuali properti yang berisi
nama atau induk resource. Fungsionalitas apa pun
untuk mengganti nama atau memindahkan resource tidak boleh terjadi dalam metode Update
dan akan ditangani oleh metode kustom.
Pemetaan HTTP:
- Metode
Update
standar harus mendukung update resource parsial, dan menggunakan kata kerja HTTPPATCH
dengan kolomFieldMask
bernamaupdate_mask
. Kolom output yang disediakan oleh klien sebagai input harus diabaikan. - Metode
Update
yang memerlukan semantik patching yang lebih canggih, seperti menambahkan ke kolom berulang, harus disediakan dengan metode kustom. - Jika metode
Update
hanya mendukung update resource lengkap, metode tersebut harus menggunakan HTTP verbPUT
. Namun, update lengkap sangat tidak dianjurkan karena memiliki masalah kompatibilitas mundur saat menambahkan kolom resource baru. - Kolom pesan yang menerima nama resource harus dipetakan ke jalur URL. Kolom mungkin ada dalam pesan resource itu sendiri.
- Kolom pesan permintaan yang berisi resource harus dipetakan ke isi permintaan.
- Semua kolom pesan permintaan yang tersisa harus dipetakan ke parameter kueri URL.
- Pesan respons harus berupa resource yang diperbarui itu sendiri.
Jika API menerima nama resource yang ditetapkan klien, server dapat mengizinkan klien untuk menetapkan nama resource yang tidak ada dan membuat resource baru.
Jika tidak, metode Update
akan gagal dengan nama resource yang tidak ada.
Kode error NOT_FOUND
harus digunakan jika merupakan satu-satunya kondisi error.
API dengan metode Update
yang mendukung pembuatan resource
juga harus menyediakan metode Create
. Alasannya adalah tidak
jelas cara membuat resource jika metode Update
adalah satu-satunya cara
untuk melakukannya.
Contoh:
// Updates a book.
rpc UpdateBook(UpdateBookRequest) returns (Book) {
// Update maps to HTTP PATCH. Resource name is mapped to a URL path.
// Resource is contained in the HTTP request body.
option (google.api.http) = {
// Note the URL template variable which captures the resource name of the
// book to update.
patch: "/v1/{book.name=shelves/*/books/*}"
body: "book"
};
}
message UpdateBookRequest {
// The book resource which replaces the resource on the server.
Book book = 1;
// The update mask applies to the resource. For the `FieldMask` definition,
// see https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#fieldmask
FieldMask update_mask = 2;
}
Hapus
Metode Delete
mengambil nama resource serta nol atau beberapa parameter,
serta menghapus atau menjadwalkan penghapusan resource yang ditentukan.
Metode Delete
harus menampilkan google.protobuf.Empty
.
API tidak boleh mengandalkan informasi yang ditampilkan oleh metode Delete
, karena tidak dapat dipanggil berulang kali.
Pemetaan HTTP:
- Metode
Delete
harus menggunakan kata kerjaDELETE
HTTP. - Kolom pesan permintaan yang menerima nama resource harus dipetakan ke jalur URL.
- Semua kolom pesan permintaan yang tersisa akan dipetakan ke parameter kueri URL.
- Tidak ada isi permintaan; konfigurasi API tidak boleh mendeklarasikan
klausa
body
. - Jika metode
Delete
langsung menghapus resource, metode tersebut seharusnya menampilkan respons kosong. - Jika metode
Delete
memulai operasi yang berjalan lama, metode tersebut harus menampilkan operasi yang berjalan lama. - Jika metode
Delete
hanya menandai resource sebagai dihapus, metode tersebut seharusnya menampilkan resource yang diupdate.
Panggilan ke metode Delete
harus
idempoten, tetapi tidak perlu menghasilkan respons yang sama. Sejumlah permintaan Delete
akan mengakibatkan resource (akhirnya) dihapus, tetapi hanya permintaan pertama yang akan menghasilkan kode yang berhasil. Permintaan
berikutnya akan menghasilkan google.rpc.Code.NOT_FOUND
.
Contoh:
// Deletes a book.
rpc DeleteBook(DeleteBookRequest) returns (google.protobuf.Empty) {
// Delete maps to HTTP DELETE. Resource name maps to the URL path.
// There is no request body.
option (google.api.http) = {
// Note the URL template variable capturing the multi-segment name of the
// book resource to be deleted, such as "shelves/shelf1/books/book2"
delete: "/v1/{name=shelves/*/books/*}"
};
}
message DeleteBookRequest {
// The resource name of the book to be deleted, for example:
// "shelves/shelf1/books/book2"
string name = 1;
}