RESTful web hizmeti kullanma
Web hizmetini bir uygulamayla tümleştirmek yaygın bir senaryodur. Bu makalede, bir uygulamadan RESTful web hizmetinin nasıl tükettiği gösterilmektedir Xamarin.Forms .
Temsili Durum Aktarımı (REST), web hizmetleri oluşturmaya yönelik bir mimari stildir. REST istekleri, web tarayıcılarının web sayfalarını almak ve sunuculara veri göndermek için kullandığı HTTP fiilleri kullanılarak HTTP üzerinden yapılır. Fiiller şunlardır:
- GET – Bu işlem web hizmetinden veri almak için kullanılır.
- POST – Bu işlem web hizmetinde yeni bir veri öğesi oluşturmak için kullanılır.
- PUT – Bu işlem web hizmetindeki bir veri öğesini güncelleştirmek için kullanılır.
- PATCH – Bu işlem, öğenin nasıl değiştirilmesi gerektiğiyle ilgili bir dizi yönerge açıklanarak web hizmetindeki bir veri öğesini güncelleştirmek için kullanılır. Bu fiil örnek uygulamada kullanılmaz.
- DELETE – Bu işlem web hizmetindeki bir veri öğesini silmek için kullanılır.
REST'e bağlı web hizmeti API'leri RESTful API'leri olarak adlandırılır ve aşağıdakiler kullanılarak tanımlanır:
- Temel URI.
- GET, POST, PUT, PATCH veya DELETE gibi HTTP yöntemleri.
- Veriler için JavaScript Nesne Gösterimi (JSON) gibi bir medya türü.
RESTful web hizmetleri genellikle istemciye veri döndürmek için JSON iletilerini kullanır. JSON, veri gönderirken bant genişliği gereksinimlerinin azalmasına neden olan, kompakt yükler üreten metin tabanlı bir veri değişim biçimidir. Örnek uygulama, iletileri seri hale getirmek ve seri durumdan çıkarmak için açık kaynak NewtonSoft JSON.NET kitaplığını kullanır.
REST'in basitliği, mobil uygulamalarda web hizmetlerine erişmek için birincil yöntem haline getirmesine yardımcı olmuştur.
Örnek uygulama çalıştırıldığında, aşağıdaki ekran görüntüsünde gösterildiği gibi yerel olarak barındırılan bir REST hizmetine bağlanır:
Not
iOS 9 ve üzeri cihazlarda, App Transport Security (ATS), İnternet kaynakları (uygulamanın arka uç sunucusu gibi) ile uygulama arasında güvenli bağlantılar zorlayarak hassas bilgilerin yanlışlıkla açıklanmasını önler. iOS 9 için oluşturulan uygulamalarda ATS varsayılan olarak etkinleştirildiğinden, tüm bağlantılar ATS güvenlik gereksinimlerine tabi olacaktır. Bağlantılar bu gereksinimleri karşılamıyorsa, bir özel durumla başarısız olur.
İNTERNET kaynakları için HTTPS protokolünün ve güvenli iletişimin kullanılması mümkün değilse ATS devre dışı bırakılabilir. Bu, uygulamanın Info.plist dosyası güncelleştirilerek elde edilebilir. Daha fazla bilgi için bkz . Uygulama Aktarım Güvenliği.
Web hizmetini kullanma
REST hizmeti ASP.NET Core kullanılarak yazılır ve aşağıdaki işlemleri sağlar:
İşlem | HTTP yöntemi | Göreli URI | Parametreler |
---|---|---|---|
Yapılacaklar öğelerinin listesini alma | GET | /api/todoitems/ | |
Yeni yapılacaklar öğesi oluşturma | POST | /api/todoitems/ | JSON biçimli TodoItem |
Yapılacaklar öğesini güncelleştirme | PUT | /api/todoitems/ | JSON biçimli TodoItem |
Yapılacaklar öğesini silme | SİL | /api/todoitems/{id} |
URI'lerin çoğu yolda kimliği içerir TodoItem
. Örneğin, kimliği 6bb8a868-dba1-4f1a-93b7-24ebce87e243
olan öğesini silmek TodoItem
için istemci öğesine http://hostname/api/todoitems/6bb8a868-dba1-4f1a-93b7-24ebce87e243
bir DELETE isteği gönderir. Örnek uygulamada kullanılan veri modeli hakkında daha fazla bilgi için bkz . Verileri modelleme.
Web API çerçevesi bir istek aldığında, isteği bir eyleme yönlendirir. Bu eylemler yalnızca sınıfındaki TodoItemsController
genel yöntemlerdir. Çerçeve, gelen isteklerin URL'lerini eşleştirmek ve bunları eylemlerle eşlemek için yönlendirme ara yazılımını kullanır. REST API'leri, işlemleri HTTP fiilleri ile temsil edilen bir kaynak kümesi olarak modelin işlevselliğini yönlendirme özniteliğini kullanmalıdır. Öznitelik yönlendirme, eylemleri doğrudan yol şablonlarıyla eşlemek için bir dizi öznitelik kullanır. Öznitelik yönlendirme hakkında daha fazla bilgi için bkz . REST API'leri için öznitelik yönlendirme. ASP.NET Core kullanarak REST hizmeti oluşturma hakkında daha fazla bilgi için bkz . Yerel Mobil Uygulamalar için Arka Uç Hizmetleri Oluşturma.
HttpClient
sınıfı HTTP üzerinden istek göndermek ve almak için kullanılır. Http istekleri göndermek ve tanımlanan bir URI kaynağından HTTP yanıtları almak için işlevsellik sağlar. Her istek zaman uyumsuz bir işlem olarak gönderilir. Zaman uyumsuz işlemler hakkında daha fazla bilgi için bkz . Zaman Uyumsuz Desteğe Genel Bakış.
sınıfı, HttpResponseMessage
bir HTTP isteği yapıldıktan sonra web hizmetinden alınan http yanıt iletisini temsil eder. Durum kodu, üst bilgiler ve herhangi bir gövde dahil olmak üzere yanıt hakkındaki bilgileri içerir. sınıfı, HttpContent
VE gibi Content-Type
Content-Encoding
HTTP gövdesini ve içerik üst bilgilerini temsil eder. İçerik, verilerin biçimine bağlı olarak ve ReadAsByteArrayAsync
gibi ReadAsStringAsync
yöntemlerden ReadAs
herhangi biri kullanılarak okunabilir.
HTTPClient nesnesini oluşturma
Örnek HttpClient
, aşağıdaki kod örneğinde gösterildiği gibi, uygulamanın HTTP istekleri yapması gerektiği sürece nesnenin yaşaması için sınıf düzeyinde bildirilir:
public class RestService : IRestService
{
HttpClient client;
...
public RestService ()
{
client = new HttpClient ();
...
}
...
}
Veri alma
yöntemi HttpClient.GetAsync
, URI tarafından belirtilen web hizmetine GET isteği göndermek ve ardından aşağıdaki kod örneğinde gösterildiği gibi yanıtı web hizmetinden almak için kullanılır:
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);
}
...
}
REST hizmeti, HTTP isteğinin HttpResponseMessage.IsSuccessStatusCode
başarılı mı yoksa başarısız mı olduğunu göstermek için özelliğinde bir HTTP durum kodu gönderir. Bu işlem için REST hizmeti, isteğin başarılı olduğunu ve istenen bilgilerin yanıtta olduğunu belirten HTTP durum kodu 200 'i (Tamam) yanıta gönderir.
HTTP işlemi başarılı olursa, yanıt içeriği görüntülenmek üzere okunur. HttpResponseMessage.Content
özelliği HTTP yanıtının içeriğini temsil eder ve HttpContent.ReadAsStringAsync
yöntemi HTTP içeriğini zaman uyumsuz olarak bir dizeye yazar. Bu içerik daha sonra JSON'dan örneklerden birine List
seri durumdan TodoItem
çıkarılır.
Uyarı
ReadAsStringAsync
Büyük bir yanıt almak için yönteminin kullanılması performansı olumsuz etkileyebilir. Bu gibi durumlarda, tam arabelleğe almak zorunda kalmamak için yanıt doğrudan seri durumdan çıkarılmalıdır.
Veri oluşturma
HttpClient.PostAsync
yöntemi, aşağıdaki kod örneğinde gösterildiği gibi POST isteğini URI tarafından belirtilen web hizmetine göndermek ve ardından yanıtı web hizmetinden almak için kullanılır:
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.");
}
...
}
Örnek TodoItem
, web hizmetine göndermek için bir JSON yüküne seri hale getirilir. Bu yük daha sonra, istek yöntemiyle yapılmadan önce web hizmetine gönderilecek HTTP içeriğinin gövdesine PostAsync
eklenir.
REST hizmeti, HTTP isteğinin HttpResponseMessage.IsSuccessStatusCode
başarılı mı yoksa başarısız mı olduğunu göstermek için özelliğinde bir HTTP durum kodu gönderir. Bu işlemin yaygın yanıtları şunlardır:
- 201 (OLUŞTURULDU) – İstek, yanıt gönderilmeden önce yeni bir kaynak oluşturulmasıyla sonuçlandı.
- 400 (BAD REQUEST) – istek sunucu tarafından anlaşılmıyor.
- 409 (ÇAKıŞMA) – sunucudaki bir çakışma nedeniyle istek gerçekleştirilemedi.
Verileri güncelleştirme
HttpClient.PutAsync
yöntemi, aşağıdaki kod örneğinde gösterildiği gibi PUT isteğini URI tarafından belirtilen web hizmetine göndermek ve ardından yanıtı web hizmetinden almak için kullanılır:
public async Task SaveTodoItemAsync (TodoItem item, bool isNewItem = false)
{
...
response = await client.PutAsync (uri, content);
...
}
yönteminin PutAsync
işlemi, web hizmetinde veri oluşturmak için kullanılan yöntemle aynıdır PostAsync
. Ancak, web hizmetinden gönderilen olası yanıtlar farklılık gösterir.
REST hizmeti, HTTP isteğinin HttpResponseMessage.IsSuccessStatusCode
başarılı mı yoksa başarısız mı olduğunu göstermek için özelliğinde bir HTTP durum kodu gönderir. Bu işlemin yaygın yanıtları şunlardır:
- 204 (İçERİk YOK) – İstek başarıyla işlendi ve yanıt kasıtlı olarak boş.
- 400 (BAD REQUEST) – istek sunucu tarafından anlaşılmıyor.
- 404 (BULUNAMADı) – İstenen kaynak sunucuda yok.
Veri silme
HttpClient.DeleteAsync
yöntemi, aşağıdaki kod örneğinde gösterildiği gibi DELETE isteğini URI tarafından belirtilen web hizmetine göndermek ve ardından web hizmetinden yanıt almak için kullanılır:
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.");
}
...
}
REST hizmeti, HTTP isteğinin HttpResponseMessage.IsSuccessStatusCode
başarılı mı yoksa başarısız mı olduğunu göstermek için özelliğinde bir HTTP durum kodu gönderir. Bu işlemin yaygın yanıtları şunlardır:
- 204 (İçERİk YOK) – İstek başarıyla işlendi ve yanıt kasıtlı olarak boş.
- 400 (BAD REQUEST) – istek sunucu tarafından anlaşılmıyor.
- 404 (BULUNAMADı) – İstenen kaynak sunucuda yok.
Yerel geliştirme
REST web hizmetinizi ASP.NET Core Web API gibi bir çerçeveyle yerel olarak geliştiriyorsanız, web hizmetinizde ve mobil uygulamanızda aynı anda hata ayıklayabilirsiniz. Bu senaryoda, iOS simülatörü ve Android öykünücüsü için düz metin HTTP trafiğini etkinleştirmeniz gerekir. Projenizin iletişime izin verecek şekilde yapılandırılması hakkında bilgi için bkz. yerel web hizmetlerine Bağlan.