Menggunakan layanan web berbasis REST
Representational State Transfer (REST) adalah gaya arsitektur untuk membangun layanan web. Permintaan REST biasanya dibuat melalui HTTPS menggunakan kata kerja HTTP yang sama dengan yang digunakan browser web untuk mengambil halaman web dan mengirim data ke server. Kata kerjanya adalah:
- GET – operasi ini digunakan untuk mengambil data dari layanan web.
- POST – operasi ini digunakan untuk membuat item data baru di layanan web.
- PUT – operasi ini digunakan untuk memperbarui item data di layanan web.
- PATCH – operasi ini digunakan untuk memperbarui item data pada layanan web dengan menjelaskan serangkaian instruksi tentang bagaimana item harus dimodifikasi.
- DELETE – operasi ini digunakan untuk menghapus item data di layanan web.
API layanan web yang mematuhi REST didefinisikan menggunakan:
- URI dasar.
- Metode HTTP, seperti GET, POST, PUT, PATCH, atau DELETE.
- Jenis media untuk data, seperti JavaScript Object Notation (JSON).
Layanan web berbasis REST biasanya menggunakan pesan JSON untuk mengembalikan data ke klien. JSON adalah format pertukaran data berbasis teks yang menghasilkan payload ringkas, yang menghasilkan pengurangan persyaratan bandwidth saat mengirim data. Kesederhanaan REST telah membantu menjadikannya metode utama untuk mengakses layanan web di aplikasi seluler.
Catatan
Mengakses layanan web sering memerlukan pemrograman asinkron. Untuk informasi selengkapnya tentang pemrograman asinkron, lihat Pemrograman asinkron dengan asinkron dan menunggu.
Operasi layanan web
Contoh layanan REST ditulis menggunakan ASP.NET Core dan menyediakan operasi berikut:
Operasi | Metode HTTP | URI Relatif | Parameter |
---|---|---|---|
Mendapatkan daftar item todo | GET | /api/todoitems/ | |
Membuat item todo baru | POST | /api/todoitems/ | TodoItem berformat JSON |
Memperbarui item todo | TARUH | /api/todoitems/ | TodoItem berformat JSON |
Menghapus item todo | DELETE | /api/todoitems/{id} |
Aplikasi .NET MAUI dan layanan web menggunakan kelas untuk memodelkan TodoItem
data yang ditampilkan dan dikirim ke layanan web untuk penyimpanan:
public class TodoItem
{
public string ID { get; set; }
public string Name { get; set; }
public string Notes { get; set; }
public bool Done { get; set; }
}
Properti ID
ini digunakan untuk mengidentifikasi setiap TodoItem
objek secara unik, dan digunakan oleh layanan web untuk mengidentifikasi data yang akan diperbarui atau dihapus. Misalnya, untuk menghapus TodoItem
ID-nya , 6bb8a868-dba1-4f1a-93b7-24ebce87e243
aplikasi .NET MAUI mengirimkan permintaan DELETE ke https://hostname/api/todoitems/6bb8a868-dba1-4f1a-93b7-24ebce87e243
.
Saat kerangka kerja API Web menerima permintaan, kerangka kerja tersebut merutekan permintaan ke tindakan. Tindakan ini adalah metode publik di TodoItemsController
kelas . Kerangka kerja API Web menggunakan middleware perutean untuk mencocokkan URL permintaan masuk dan memetakannya ke tindakan. REST API harus menggunakan perutean atribut untuk memodelkan fungsionalitas aplikasi sebagai sekumpulan sumber daya yang operasinya diwakili oleh kata kerja HTTP. Perutean atribut menggunakan sekumpulan atribut untuk memetakan tindakan langsung ke templat rute. Untuk informasi selengkapnya tentang perutean atribut, lihat Perutean atribut untuk REST API. Untuk informasi selengkapnya tentang membangun layanan REST menggunakan ASP.NET Core, lihat Membuat layanan backend untuk aplikasi seluler asli.
Membuat objek HTTPClient
Aplikasi .NET Multi-platform App UI (.NET MAUI) dapat menggunakan layanan web berbasis REST dengan mengirim permintaan ke layanan web dengan HttpClient
kelas . Kelas ini menyediakan fungsionalitas untuk mengirim permintaan HTTP dan menerima respons HTTP dari sumber daya yang diidentifikasi URI. Setiap permintaan dikirim sebagai operasi asinkron.
Objek HttpClient
harus dideklarasikan di tingkat kelas sehingga hidup selama aplikasi perlu membuat permintaan HTTP:
public class RestService
{
HttpClient _client;
JsonSerializerOptions _serializerOptions;
public List<TodoItem> Items { get; private set; }
public RestService()
{
_client = new HttpClient();
_serializerOptions = new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
WriteIndented = true
};
}
...
}
Objek JsonSerializerOptions
digunakan untuk mengonfigurasi pemformatan payload JSON yang diterima dari dan dikirim ke layanan web. Untuk informasi selengkapnya, lihat Cara membuat instans JsonSerializerOptions dengan System.Text.Json.
Mengambil data
Metode HttpClient.GetAsync
ini digunakan untuk mengirim permintaan GET ke layanan web yang ditentukan oleh URI, lalu menerima respons dari layanan web:
public async Task<List<TodoItem>> RefreshDataAsync()
{
Items = new List<TodoItem>();
Uri uri = new Uri(string.Format(Constants.RestUrl, string.Empty));
try
{
HttpResponseMessage response = await _client.GetAsync(uri);
if (response.IsSuccessStatusCode)
{
string content = await response.Content.ReadAsStringAsync();
Items = JsonSerializer.Deserialize<List<TodoItem>>(content, _serializerOptions);
}
}
catch (Exception ex)
{
Debug.WriteLine(@"\tERROR {0}", ex.Message);
}
return Items;
}
Data diterima dari layanan web sebagai HttpResponseMessage
objek. Ini berisi informasi tentang respons, termasuk kode status, header, dan isi apa pun. Layanan REST mengirimkan kode status HTTP dalam responsnya, yang dapat diperoleh dari HttpResponseMessage.IsSuccessStatusCode
properti , untuk menunjukkan apakah permintaan HTTP berhasil atau gagal. Untuk operasi ini, layanan REST mengirimkan kode status HTTP 200 (OK) dalam respons, yang menunjukkan bahwa permintaan berhasil dan bahwa informasi yang diminta berada dalam respons.
Jika operasi HTTP berhasil, konten respons dibaca. Properti HttpResponseMessage.Content
mewakili konten respons, dan berjenis HttpContent
. Kelas HttpContent
mewakili isi HTTP dan header konten, seperti Content-Type
dan Content-Encoding
. Konten kemudian dibaca ke dalam string
menggunakan HttpContent.ReadAsStringAsync
metode . string
kemudian dideserialisasi dari JSON ke objek List
TodoItem
.
Peringatan
ReadAsStringAsync
Menggunakan metode untuk mengambil respons besar dapat berdampak negatif pada performa. Dalam keadaan seperti itu, respons harus langsung dideserialisasi untuk menghindari harus sepenuhnya buffer.
Buat data
Metode HttpClient.PostAsync
ini digunakan untuk mengirim permintaan POST ke layanan web yang ditentukan oleh URI, lalu untuk menerima respons dari layanan web:
public async Task SaveTodoItemAsync(TodoItem item, bool isNewItem = false)
{
Uri uri = new Uri(string.Format(Constants.RestUrl, string.Empty));
try
{
string json = JsonSerializer.Serialize<TodoItem>(item, _serializerOptions);
StringContent content = new StringContent(json, Encoding.UTF8, "application/json");
HttpResponseMessage response = null;
if (isNewItem)
response = await _client.PostAsync(uri, content);
else
response = await _client.PutAsync(uri, content);
if (response.IsSuccessStatusCode)
Debug.WriteLine(@"\tTodoItem successfully saved.");
}
catch (Exception ex)
{
Debug.WriteLine(@"\tERROR {0}", ex.Message);
}
}
Dalam contoh ini, instans diserialisasikan TodoItem
ke payload JSON untuk dikirim ke layanan web. Payload ini kemudian disematkan dalam isi konten HTTP yang akan dikirim ke layanan web sebelum permintaan dibuat dengan PostAsync
metode .
Layanan REST mengirimkan kode status HTTP dalam responsnya, yang dapat diperoleh dari HttpResponseMessage.IsSuccessStatusCode
properti , untuk menunjukkan apakah permintaan HTTP berhasil atau gagal. Respons umum untuk operasi ini adalah:
- 201 (DIBUAT) – permintaan mengakibatkan sumber daya baru dibuat sebelum respons dikirim.
- 400 (PERMINTAAN BURUK) – permintaan tidak dipahami oleh server.
- 409 (KONFLIK) – permintaan tidak dapat dilakukan karena konflik pada server.
Memperbarui data
Metode HttpClient.PutAsync
ini digunakan untuk mengirim permintaan PUT ke layanan web yang ditentukan oleh URI, lalu menerima respons dari layanan web:
public async Task SaveTodoItemAsync(TodoItem item, bool isNewItem = false)
{
...
response = await _client.PutAsync(uri, content);
...
}
Pengoperasian PutAsync
metode ini identik dengan PostAsync
metode yang digunakan untuk membuat data di layanan web. Namun, kemungkinan respons yang dikirim dari layanan web berbeda.
Layanan REST mengirimkan kode status HTTP dalam responsnya, yang dapat diperoleh dari HttpResponseMessage.IsSuccessStatusCode
properti , untuk menunjukkan apakah permintaan HTTP berhasil atau gagal. Respons umum untuk operasi ini adalah:
- 204 (TIDAK ADA KONTEN) – permintaan telah berhasil diproses dan respons sengaja kosong.
- 400 (PERMINTAAN BURUK) – permintaan tidak dipahami oleh server.
- 404 (NOT FOUND) – sumber daya yang diminta tidak ada di server.
Menghapus data
Metode HttpClient.DeleteAsync
ini digunakan untuk mengirim permintaan DELETE ke layanan web yang ditentukan oleh URI, lalu menerima respons dari layanan web:
public async Task DeleteTodoItemAsync(string id)
{
Uri uri = new Uri(string.Format(Constants.RestUrl, id));
try
{
HttpResponseMessage response = await _client.DeleteAsync(uri);
if (response.IsSuccessStatusCode)
Debug.WriteLine(@"\tTodoItem successfully deleted.");
}
catch (Exception ex)
{
Debug.WriteLine(@"\tERROR {0}", ex.Message);
}
}
Layanan REST mengirimkan kode status HTTP dalam responsnya, yang dapat diperoleh dari HttpResponseMessage.IsSuccessStatusCode
properti , untuk menunjukkan apakah permintaan HTTP berhasil atau gagal. Respons umum untuk operasi ini adalah:
- 204 (TIDAK ADA KONTEN) – permintaan telah berhasil diproses dan respons sengaja kosong.
- 400 (PERMINTAAN BURUK) – permintaan tidak dipahami oleh server.
- 404 (NOT FOUND) – sumber daya yang diminta tidak ada di server.
Pengembangan lokal
Jika Anda mengembangkan layanan web REST secara lokal dengan kerangka kerja seperti ASP.NET Core Web API, Anda dapat men-debug layanan web dan aplikasi MAUI .NET secara bersamaan. Dalam skenario ini, untuk menggunakan layanan web Anda melalui HTTP dari emulator Android dan simulator iOS, Anda harus mengaktifkan lalu lintas HTTP teks-jelas di aplikasi MAUI .NET Anda. Untuk informasi selengkapnya, lihat Koneksi ke layanan web lokal dari emulator Android dan simulator iOS.