Menggunakan layanan web RESTful
Mengintegrasikan layanan web ke dalam aplikasi adalah skenario umum. Artikel ini menunjukkan cara menggunakan layanan web RESTful dari aplikasi Xamarin.Forms .
Representational State Transfer (REST) adalah gaya arsitektur untuk membangun layanan web. Permintaan REST dibuat melalui HTTP 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. Kata kerja ini tidak digunakan dalam aplikasi sampel.
- DELETE – operasi ini digunakan untuk menghapus item data di layanan web.
API layanan web yang mematuhi REST disebut API RESTful, dan didefinisikan menggunakan:
- URI dasar.
- Metode HTTP, seperti GET, POST, PUT, PATCH, atau DELETE.
- Jenis media untuk data, seperti JavaScript Object Notation (JSON).
Layanan web RESTful 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. Aplikasi sampel menggunakan pustaka sumber terbuka NewtonSoft JSON.NET untuk menserialisasikan dan mendeserialisasi pesan.
Kesederhanaan REST telah membantu menjadikannya metode utama untuk mengakses layanan web dalam aplikasi seluler.
Saat aplikasi sampel dijalankan, aplikasi akan terhubung ke layanan REST yang dihosting secara lokal, seperti yang ditunjukkan pada cuplikan layar berikut:
Catatan
Di iOS 9 dan yang lebih besar, App Transport Security (ATS) memberlakukan koneksi aman antara sumber daya internet (seperti server ujung belakang aplikasi) dan aplikasi, sehingga mencegah pengungkapan informasi sensitif yang tidak disengaja. Karena ATS diaktifkan secara default di aplikasi yang dibangun untuk iOS 9, semua koneksi akan tunduk pada persyaratan keamanan ATS. Jika koneksi tidak memenuhi persyaratan ini, koneksi akan gagal dengan pengecualian.
ATS dapat ditolak jika tidak dimungkinkan untuk menggunakan protokol HTTPS dan komunikasi yang aman untuk sumber daya internet. Ini dapat dicapai dengan memperbarui file Info.plist aplikasi. Untuk informasi selengkapnya, lihat Keamanan Transportasi Aplikasi.
Menggunakan layanan web
Layanan REST ditulis menggunakan ASP.NET Core dan menyediakan operasi berikut:
Operasi | Metode HTTP | URI Relatif | Parameter |
---|---|---|---|
Mendapatkan daftar item yang harus dilakukan | GET | /api/todoitems/ | |
Membuat item tugas baru | POST | /api/todoitems/ | TodoItem berformat JSON |
Memperbarui item yang harus dilakukan | TARUH | /api/todoitems/ | TodoItem berformat JSON |
Menghapus item yang harus dilakukan | DELETE | /api/todoitems/{id} |
Sebagian besar URI menyertakan TodoItem
ID di jalur. Misalnya, untuk menghapus TodoItem
ID siapa , 6bb8a868-dba1-4f1a-93b7-24ebce87e243
klien mengirim permintaan DELETE ke http://hostname/api/todoitems/6bb8a868-dba1-4f1a-93b7-24ebce87e243
. Untuk informasi selengkapnya tentang model data yang digunakan dalam aplikasi sampel, lihat Memodelkan data.
Ketika kerangka kerja API Web menerima permintaan, kerangka kerja tersebut merutekan permintaan ke tindakan. Tindakan ini hanyalah metode publik di TodoItemsController
kelas . Kerangka kerja menggunakan middleware perutean untuk mencocokkan URL permintaan masuk dan memetakannya ke tindakan. REST API harus menggunakan perutean atribut model 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.
Kelas HttpClient
ini digunakan untuk mengirim dan menerima permintaan melalui HTTP. Ini menyediakan fungsionalitas untuk mengirim permintaan HTTP dan menerima respons HTTP dari sumber daya yang diidentifikasi URI. Setiap permintaan dikirim sebagai operasi asinkron. Untuk informasi selengkapnya tentang operasi asinkron, lihat Gambaran Umum Dukungan Asinkron.
Kelas mewakili HttpResponseMessage
pesan respons HTTP yang diterima dari layanan web setelah permintaan HTTP dibuat. Ini berisi informasi tentang respons, termasuk kode status, header, dan isi apa pun. Kelas HttpContent
mewakili isi HTTP dan header konten, seperti Content-Type
dan Content-Encoding
. Konten dapat dibaca menggunakan salah ReadAs
satu metode, seperti ReadAsStringAsync
dan ReadAsByteArrayAsync
, tergantung pada format data.
Membuat objek HTTPClient
HttpClient
Instans dideklarasikan pada tingkat kelas sehingga objek hidup selama aplikasi perlu membuat permintaan HTTP, seperti yang ditunjukkan dalam contoh kode berikut:
public class RestService : IRestService
{
HttpClient client;
...
public RestService ()
{
client = new HttpClient ();
...
}
...
}
Mengambil data
Metode HttpClient.GetAsync
ini digunakan untuk mengirim permintaan GET ke layanan web yang ditentukan oleh URI, lalu menerima respons dari layanan web, seperti yang ditunjukkan dalam contoh kode berikut:
public async Task<List<TodoItem>> RefreshDataAsync ()
{
...
Uri uri = new Uri (string.Format (Constants.TodoItemsUrl, string.Empty));
...
HttpResponseMessage response = await client.GetAsync (uri);
if (response.IsSuccessStatusCode)
{
string content = await response.Content.ReadAsStringAsync ();
Items = JsonSerializer.Deserialize<List<TodoItem>>(content, serializerOptions);
}
...
}
Layanan REST mengirimkan kode status HTTP di 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, untuk ditampilkan. Properti HttpResponseMessage.Content
mewakili konten respons HTTP, dan HttpContent.ReadAsStringAsync
metode secara asinkron menulis konten HTTP ke string. Konten ini kemudian dideserialisasi dari JSON ke List
instans 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, seperti yang ditunjukkan dalam contoh kode berikut:
public async Task SaveTodoItemAsync (TodoItem item, bool isNewItem = false)
{
Uri uri = new Uri (string.Format (Constants.TodoItemsUrl, string.Empty));
...
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);
}
...
if (response.IsSuccessStatusCode)
{
Debug.WriteLine (@"\tTodoItem successfully saved.");
}
...
}
TodoItem
Instans diserialisasikan 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 di 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, seperti yang ditunjukkan dalam contoh kode berikut:
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 di 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, seperti yang ditunjukkan dalam contoh kode berikut:
public async Task DeleteTodoItemAsync (string id)
{
Uri uri = new Uri (string.Format (Constants.TodoItemsUrl, id));
...
HttpResponseMessage response = await client.DeleteAsync (uri);
if (response.IsSuccessStatusCode)
{
Debug.WriteLine (@"\tTodoItem successfully deleted.");
}
...
}
Layanan REST mengirimkan kode status HTTP di 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 seluler Anda secara bersamaan. Dalam skenario ini Anda harus mengaktifkan lalu lintas HTTP teks-jelas untuk simulator iOS dan emulator Android. Untuk informasi tentang konfigurasi proyek Anda untuk mengizinkan komunikasi, lihat Koneksi ke layanan web lokal.