Mengonsumsi layanan REST dengan HttpClient

Selesai

Banyak layanan web modern menerapkan arsitektur REST. Struktur ini memungkinkan layanan web untuk mengekspos operasi dan data melalui serangkaian titik akhir yang ditentukan dengan baik. Permintaan yang dikirim aplikasi klien ke layanan web REST untuk mengambil, mengubah, atau membuat, atau menghapus data menggunakan kumpulan kata kerja yang sudah ditentukan sebelumnya. Layanan web REST merespons permintaan ini dengan cara standar. Pendekatan ini memudahkan anda membangun aplikasi klien.

Model REST dibangun di atas protokol HTTP. Aplikasi .NET MAUI dapat mengirim permintaan ke layanan web REST dengan menggunakan kelas HttpClient. Di unit ini, Anda akan mempelajari dan HttpClient cara menggunakannya untuk berinteraksi dengan layanan web REST.

Apa itu kelas HttpClient?

HttpClient adalah kelas .NET yang dapat digunakan aplikasi untuk mengirim permintaan HTTP dan menerima tanggapan HTTP dari layanan web REST. Sekumpulan URI mengidentifikasi sumber daya yang diekspos layanan web. URI menggabungkan alamat layanan web dengan nama sumber daya yang tersedia di alamat tersebut.

Kelas ini HttpClient menggunakan API berbasis tugas untuk performa, dan memberi Anda akses ke informasi dalam pesan permintaan seperti header HTTP dan kode status, serta badan pesan yang berisi data aktual yang dikirim dan diterima.

Diagram showing how a client app uses an HttpClient object to send and receive HTTP messages and responses

Kelas HttpClient tersedia di namespace layanan System.Net.Http. Aplikasi dapat membuat objek HttpClient menggunakan konstruktor default:

using System.Net.Http;
...

var client = new HttpClient();

Melakukan operasi CRUD dengan objek HttpClient

Layanan web REST memungkinkan klien untuk melakukan operasi terhadap data melalui sekumpulan kata kerja HTTP. Tugas kata kerja HTTP adalah menunjukkan tindakan yang diinginkan untuk dilakukan pada sumber daya. Ada banyak kata kerja HTTP, tetapi empat yang paling umum adalah POST, GET, PUT, dan DELETE. Layanan dapat menerapkan kata kerja ini untuk memungkinkan aplikasi klien mengelola siklus hidup objek dengan melakukan operasi Buat, Baca, Perbarui, dan Hapus (CRUD), sebagai berikut:

  • Kata kerja POST menunjukkan bahwa Anda ingin membuat sumber daya baru.

  • Kata kerja GET menunjukkan bahwa Anda ingin mengambil sumber daya.

  • Kata kerja PUT menunjukkan bahwa Anda ingin memperbarui sumber daya.

  • Kata kerja DELETE menunjukkan bahwa Anda ingin menghapus sumber daya.

Diagram showing the basic CRUD operations that a REST service can implement, including get, post, put and delete.

Membuat sumber daya baru dengan HttpClient

Untuk membuat sumber daya baru dengan menggunakan HttpClient, Anda dapat menggunakan SendAsync metode yang meneruskannya objek HttpRequestMessage .

HttpRequestMessage dimaksudkan untuk memodelkan permintaan yang dikirim ke layanan web. Anda menentukan kata kerja HTTP, URL layanan web, dan mengisi muatan apa pun untuk dikirim melalui properti HttpRequestMessage.Content.

HttpClient client = new HttpClient();

HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Post, url);
message.Content = JsonContent.Create<Part>(part);

HttpResponseMessage response = await client.SendAsync(message);

Fragmen kode ini melakukan tugas-tugas berikut:

  • Ini membuat instans HttpClient yang disebut klien yang digunakannya untuk mengirim pesan.
  • Ini membuat instans HttpRequestMessage yang disebut pesan yang digunakannya untuk memodelkan pesan. Pesan memiliki kata kerja HTTP dan URL.
  • Ini menetapkan properti Content dari HttpRequestMessage, menggunakan fungsi JsonContent.Create. Fungsi tersebut secara otomatis menserialisasikan variabel bagian ke JSON yang cocok untuk dikirim ke layanan web.
  • Ini mengirim pesan menggunakan objek HttpClient. Sebuah HttpResponseMessage dikembalikan yang berisi informasi seperti kode status dan informasi yang dikembalikan oleh layanan web.

Baca sumber daya dengan HttpClient

Anda dapat membaca sumber daya dari layanan web menggunakan teknik yang sama seperti yang dijelaskan sebelumnya, kecuali menginisialisasi HttpRequestMessage dengan HttpMethod.Get. Namun, HttpClient memiliki beberapa metode kenyamanan yang menyediakan pintasan.

Untuk membaca sumber daya dengan menggunakan HTTPClient, gunakan metode GetStringAsync seperti yang ditunjukkan pada contoh berikut:

HttpClient client = new HttpClient();

string text = await client.GetStringAsync("https://...");

Metode ini GetStringAsync mengambil URI yang mereferensikan sumber daya dan mengembalikan respons sebagai string. Respons string adalah sumber daya yang diminta aplikasi. Format data respons adalah default untuk layanan yang diminta, seperti JSON atau XML. Sebuah aplikasi dapat memberi tahu layanan web bahwa itu membutuhkan data untuk dikembalikan dalam format tertentu dengan menambahkan header MediaTypeWithQualityHeaderValue. Misalnya, jika aplikasi meminta agar data dikirim kembali dalam format JSON, aplikasi dapat menggunakan kode berikut:

HttpClient client = new HttpClient();

client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

Dalam contoh ini, hasil dikembalikan sebagai string dan hanya berisi isi pesan respons. Untuk mendapatkan seluruh tanggapan termasuk header, isi, dan kode status, panggil metode GetAsync. Data dikembalikan sebagai objek HttpResponseMessage.

Perbarui sumber daya dengan HttpClient

Untuk memperbarui sumber daya dengan menggunakan HttpClient, gunakan HttpRequestMessage yang diinisialisasi dengan kata kerja PUT. Kode berikut mirip dengan yang diperlukan untuk membuat sumber daya baru:

HttpClient client = new HttpClient();
HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Put, url);

message.Content = JsonContent.Create<Part>(part);

HttpResponseMessage response = await client.SendAsync(message);

Catatan

Perbedaan mendasar antara POST dan PUT adalah idempotensi. Jika Anda mengulangi permintaan PUT yang sama beberapa kali, sumber daya yang sama akan diperbarui dengan data yang sama, dan efeknya sama seperti jika permintaan hanya dikirim sekali. Jika Anda mengeluarkan permintaan yang sama POST beberapa kali, hasilnya adalah layanan REST yang membuat beberapa salinan sumber daya.

Hapus sumber daya dengan HttpClient

Untuk menghapus sumber daya dengan menggunakan HttpClient, panggil SendAsync dengan diinisialisasi HttpRequestMessage dengan kata kerja DELETE :

HttpClient client = new HttpClient();
HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Delete, url);

HttpResponseMessage response = await client.SendAsync(message);

Respons berisi header, kode status, dan objek yang dihapus.

Menangani tanggapan dari permintaan

Semua permintaan HTTP mengembalikan pesan tanggapan. Data dalam respons tergantung pada kata kerja mana yang dikirim aplikasi. Misalnya, badan respons permintaan HTTP GET berisi data untuk sumber daya yang diminta.

Isi respons POST permintaan mengembalikan salinan sumber daya yang dibuat, tetapi isi PUT respons permintaan harus kosong.

Anda harus selalu memeriksa dan menangani kode status dalam pesan tanggapan. Jika kode status ini berada dalam rentang 200 (200, 201, 202, dan sebagainya), maka operasi dianggap telah berhasil, meskipun informasi lebih lanjut mungkin diperlukan nanti.

Kode status dalam rentang 300 menunjukkan bahwa permintaan mungkin telah dialihkan oleh layanan web ke alamat yang berbeda, mungkin sebagai hasil dari sumber daya yang berpindah ke lokasi yang berbeda.

Kode status dalam kisaran 400 menunjukkan kesalahan klien atau aplikasi. Misalnya, kode status 403 berarti bahwa layanan web mengharuskan pengguna untuk diautentikasi, tetapi aplikasi belum melakukannya. Kode status 404 terjadi saat aplikasi mencoba mengakses sumber daya yang tidak ada.

Kode status dalam kisaran 500 menunjukkan kesalahan sisi server, seperti layanan tidak tersedia atau terlalu sibuk untuk menangani permintaan.

Objek HttpResponseMessage yang dikembalikan oleh permintaan yang dikirimkan melalui objek HttpClient dapat mengabstraksi banyak kerumitan penanganan kode status yang berbeda. Fragmen kode ini menunjukkan cara memverifikasi bahwa kode status dalam pesan respons menunjukkan keberhasilan, dan menangani kode status yang menunjukkan semacam kegagalan.

static readonly HttpClient client = new HttpClient();

...
// Call asynchronous network methods in a try/catch block to handle exceptions.
try
{
    //... Initiate the HttpRequest

    HttpResponseMessage response = await client.SendAsync(msg);
    response.EnsureSuccessStatusCode(); // Check that the status code is in the 200 range. Throw an HttpRequestException if not
    
    string responseBody = await response.Content.ReadAsStringAsync();
    
    ... // Handle the response
}
catch(HttpRequestException e)
{
    ... // Handle any status codes that indicate an error. 
        // The status code is available in the field e.StatusCode
}

Uji pengetahuan

1.

Kata kerja HTTP mana yang Anda gunakan untuk membuat sumber daya baru di layanan web REST?

2.

Metode kelas HttpResponseMessage mana yang harus Anda panggil untuk memverifikasi bahwa permintaan HTTP berhasil?"