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:

Örnek Uygulama

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-24ebce87e243olan öğesini silmek TodoItem için istemci öğesine http://hostname/api/todoitems/6bb8a868-dba1-4f1a-93b7-24ebce87e243bir 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-TypeContent-EncodingHTTP gövdesini ve içerik üst bilgilerini temsil eder. İçerik, verilerin biçimine bağlı olarak ve ReadAsByteArrayAsyncgibi 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.