201 etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
201 etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

27 Şubat 2022 Pazar

RestFull WebService - Kaynak Taşıma

 

   Kaynağı taşıyabilen bir denetleyiciye bir bağlantı şablonu eklenmesi gerekir. Taşıma isteği göndermek için POST kullanılır. İsteği işledikten sonra yanıt kodu 201 veya 303 sonuca bağlı olarak döndürülür.

Bir hareketin anlamı tamamen uygulamaya özgüdür. Kaynağın aynı veya farklı bir sunucuda farklı bir konuma gönderiliyor ve orjinal siliniyorsa,  yeniden kopyalamak anlamına gelebilir.  Alternatif olarak, bir kayanğın durumunu değiştirmeden değiştirmek anlamına da gelebilir. Bir hareketin ne anlama geldiği ve sunucunun bunu nasıl uyguladığı hakkında ve  her iki durumunda da sabit olmayan bağlantı sürdürmek için müşteri kendi başına işi yapmak için endişelenmemelidir.

Bir fotoğraf albümünü ele alırsak, Albümün bir arkadaşlar klasörünün parçasıdır. Müşteri yaratılan albümü aile albümü klasörüne taşımak isterse Sunucu URI lerini albüm kategorisinde, bu taşıma işlemi albümün URI  inde bir değişikliğe neden olur.

Bir kaynağı taşımak, kopyalamaktan çok farklı değildir. Bu durumda sunucu istemcinin bir hedef için kriter sağlamasına izin vermek için bir URI veya URI  şablonu sağlayan bir kaynak oluşturur.

# Request
GET /albums/friends/2020/08/1011 HTTP/1.1
Host: www.example.org

# Response
HTTP/1.1 200 OK
Content-Type: application/xml;charset=UTF-8

<album xmlns:atom="http://www.w3.org/2005/Atom">
   <id>urn:example:album:1011</id>
   <atom:link rel="self" href="http://www.example.org/albums/2020/08/1011"/>
   <link-template rel="http://www.example.org/rels/move"
       href="http://www.example.org/albums/friends/2020/08/1011/move;
                t=dc4128786d463dc7e40c18457d1826fa?group={category}"/>
   <category>friends</category> > Kaynağın kategorisini değiştirmek için URI şablonuna sahip bağlantı..
   ...
</album>

Bu gösterimde sunucu, istemcinin bir kategori belirtmesi ve kaynağın taşınması için bir URI şablonu kullanır.

# Request
POST /albums/friends/2020/08/1011/move;t=dc4128786d463dc7e40c18457d1826fa?
   group=family HTTP/1.1 > Kategoriyi değiştirme talebi

Host: www.example.org
Content-Length: 0

# Response
HTTP/1.1 201 Created
Content-Type: application/xml;charset=UTF-8
Location: http://www.example.org/family/2020/08/1021 > Yeni Kaynak.
Content-Location: http://www.example.org/family/2020/08/1021

<album>
   <id>urn:example:album:1021</id>
   <atom:link rel="self" href="http://www.example.org/family/albums/2020/08/1021"/>
   <category>family</category>
...

Bu isteğin sonucu URI http://www.example.org/albums/ adresinde yeni bir kaynaktır. aile /2020/08/1021

Sunucu, müşteri orjinal albüme erişmeye çalıştığı durumlarda bir 410 veya 4040  döndürebilir.

13 Şubat 2022 Pazar

RestFull WebService - Kaynakların Birleştirilmesi

 

   Kaynakları bileştirmek için uygulamaya özel bir denetleyici kaynak tasarlamak gereklidir. Müşteri alt birleştirilecek kaynakların URI leri veya tanımlayıcıları ile bu URI bir GET isteği uygular, bu işlem için denetleyici sorgu parametleri olarak kullanılır. Sunucu Last-Modified ve ETAG döndürür. Temsilcinin gövdesinde birleştirilecek kaynakların bir özeti ile başlığını içerir. Varlık etiketine bir sıra numarası veya bir zaman damgası rastgele verilir. Özeti doğruladıktan sonra, istemci If-Unmodified-Since ve If-Match bir POST isteğinde bulunur. Birleştirilmeye neden olmak için aynı URI, If-Match başlıkları ile desteklenir.

Birleştirmeden sonra If-Match başlık değeri bir işlem günlüğünden saklar ve URL'in URI içeren bir Konum başlığı ile 201 yanıt kodunu döndürür. Gelecekte bir müşteri aynı If-Match değeri 412 döndürür.

Bir birleştirme sunucuya sunulan iki veya daha fazla kaynağı içerir. Müşterinin iki belgeyi birleştirmenin ayrıntıları sunucuya bırakılmalıdır. Burada müşterinin iki albümü yeni bir albümle birleştirmek için URI alma isteği görünür.

# Request
GET /albums/merge?src=urn%3Aexample%3Aalbum%3A1011&
   dest=urn%3Aexample%3Aalbum%3A1012 HTTP/1.1 > Birleştirilmekte olan kaynakların mevcut durumu alma talebi

Host: www.example.org

# Response
HTTP/1.1 200 OK
Cache-Control: no-cache
Content-Type: application/xml;charset=UTF-8
Last-Modified: Sun, 08 Nov 2020 04:47:03 GMT > Gösterim için Last-Modified ve ETAG 
ETag: "d88a39e41c314f57917da04c920fd608"

<albums> > Birleştirilen kaynakların durumu
 <album>
    <id>urn:example:album:1011</id>
    <atom:link rel="self" href="http://www.example.org/albums/2020/08/1011"/>
    ...
</album>

<album>
   <id>urn:example:album:1012</id>
   <atom:link rel="self" href="http://www.example.org/albums/2020/08/1012"/>
   ...
</album>
</albums>

Bu örnekte, istemci birleştirmek için iki kaynağın tanımlayıcılarını sağlar ve sunucu birleştirilecek kaynakların bir özetini döndürür. Alternatif olarak kullanabileceğiniz birleştirme parametreleri olarak URI lerdir.

 istemci tarafında, önceki yanıttaki albümlerin durumunu müşterinin birleştirme isteği göndermeden önce yerel olarak sahip olduğu ile aynıdır.

# Request
POST /albums/merge?src=urn%3Aexample%3Aalbum%3A1011&
   dest=urn%3Aexample%3Aalbum%3A1012 HTTP/1.1 > kaynak birleştirme isteği

Host: www.example.org
If-Unmodified-Since: Sun, 08 Nov 2020 04:47:03 GMT
If-Match: "d88a39e41c314f57917da04c920fd608" > Önkoşulları

# Response
HTTP/1.1 201 Created
Location: http://www.example.org/albmus/2020/08/1091
Content-Location: http://www.example.org/albmus/2020/08/1091
Content-Type: application/xml;charset=UTF-8
Last-Modified: Sun, 08 Nov 2020 05:30:10 GMT
ETag: "48be3ab269550ee00a84eb5a1a44f330"

<album>
   <id>urn:example:album:1091</id>
   <atom:link rel="self" href="http://www.example.org/albums/2020/08/1091"/>
   ...
</album>

Sunucu, yeni bir birleştirilmiş kaynak oluşturur. Bu işlem sırasında ne olduğuna bağlı olarak sunucunun kullanım durumları talep ederse, sunucu orjinal kaynakları silebilir.

27 Aralık 2021 Pazartesi

POST isteklerini Koşullu Yapma

PUT veya DELETE den farklı olarak yapılan bir kaynağa gönderilen POST isteğinin sonucu, herhangi bir istek URI deki kaynağa yapılan değişiklikler sunucuda yeni bir kaynak oluşturabilir. Yanıt kodu 201 veya sonucu farklı bir URI ile tanımlanayabilirsiniz. Yanıt kodu 303. Bu durumda müşterinin bir temsili olmayacak ve şartlı yerel olarak depolanan üstbilgiler dahil. Bu tür POST isteklerini yapmak için bağlantıların nasıl kullanılacağını gösterir. POST  istekleri koşullu veya yanıtsız hale getirmek için bu tarifi uygulayabiliriz. 

Müşteri tarafından sunulması için POST u sunucunun yinelemeleri algılayabileceği ve önleyebileceği şekilde uygulamak istiyoruz.

İstemcilerin her POST isteği için bir bağlantı aracılığıyla sunucu tarafından sağlanan tek seferlik bir URI oluşturmak için  bir jeton içerir. POST isteğinin yalnızca bir kullanım için geçerli olan sunucu. Kullanılan tüm jetonları bir sunucu işlem günlüğünde saklanır. 

İstemci bir POST isteği gönderdiğinde jetonun işlemde mevcut olup olmadığını doğrulayın. Varsa yanıt kodu 403 döndürün. Neden bodyde olduğunu açıklayın. Eğer mevcut değilse dönme isteğine 201 oluşturun yada 303 ile bağlı olarak işlemi sonuçlandırın. Ayrıca belirteci işlem günlüğünde saklayın.

Sunucunun belirli bir miktar transfer etmesi gereken banka havalesi uygulaması olduğunu düşünelim.  Bir hesaptan diğer bir hesaba para aktarımı. Sunucu bir denetleyici kaynağı kullanarak bu transferi uygulayın.

# Request

POST /transfersİki banka hesabının kaynağına müşteri mevcut durum olduğunu düşündüğü şeye dayanarak bir POST isteği gönderir. 

Host: example.org

Content-Type: application/xml;charset=UTF-8

<transfer>

   <source>urn:example:org:account:1</source>

<target>urn:example:org:account:2</target>

<currency>USD</currency>
   <amount>100.00</amount>
   <note>Testing transfer</note>
</transfer>

# Response
HTTP/1.1 201 Created> Sunucu istemcinin isteğini şuanki duruma dayanıp dayanmadığını hesap kaynalarına göre doğurlayamıyor.

Content-Type: application/xml;charset=UTF-8
Location: http://www.example.org/transactions/1
Content-Location: http://www.example.org/transactions/1

<transfer xmlns:atom="http://www.w3.org/2005/Atom">
   <source>urn:example:org:account:1</source>
   <target>urn:example:org:account:2</target>
   <atom:link href="http://www.example.org/transactions/1" rel="self"/>
   <currency>USD</currency>
   <amount>100.00</amount>
   <note>Testing transfer</note>
</transfer>

Bu örnekte; http://www.example.org/trans tarafından tanımlanan kaynak ters bir denetçi kaynağıdır. Bu örnekteki POST isteğinin sonucu şu şekildedir. iki hesap kaynağının değiştirilmesi ve  yeni bir kaynağın oluşturulaması. Bunu yapmak için istek koşulu olarak; sunucu değerin bir işlev olarak belirteç kullanması gerekir. iki hesap kaynağının mevcut durumu bulabilmek için.  Sunucu aşağıdaki yaratılan URI kullanabilir.

http://www.example.org/transfers;t=e6e3c89d4dfe7f3a818734a6237ccfc5

Değiştirilmesi istenen iki kaynaktan; http://www.example.org/transfers  aksine bu URI bir işlev olarak bir belirteç içerir.  İstemci bir aktarım talebinde bulunmak için URI kullanabilir. Sunucu, URI deki belirtecin hala şuanki duruma karşılıl geldiğini doğrulayabilir. Bir hesap aktarımı oluşturmaya devam etmeden önce hesap kaynaklarını doğrulamak gerekir.

# Request
POST /transfer;t=e6e3c89d4dfe7f3a818734a6237ccfc5 HTTP/1.1 > İstemci geçerli veriyi temel alan bir URI ile koşullu bir POST isteği gönderir. Ancak bu gönderim sadece iki banka hesabı kaynağı olduğu sürece.

Host: example.org
Content-Type: application/xml;charset=UTF-8

<transfer>
   <source>urn:example:org:account:1</source>
   <target>urn:example:org:account:2</target>
   <currency>USD</currency>
   <amount>100.00</amount>
   <note>Testing transfer</note>

</transfer>

# Response

HTTP/1.1 201 Created > Sunucu, istemcinin isteğinin şuanki durumuna dayanıp dayanmadığının kontrolünü yapması ve hesap kaynaklarınında kontrolünün yapması sonrasında.

Content-Type: application/xml;charset=UTF-8
Location: http://www.example.org/transactions/1
Content-Location: http://www.example.org/transactions/1
<transfer xmlns:atom="http://www.w3.org/2005/Atom">

   <source>urn:example:org:account:1</source>
   <target>urn:example:org:account:2</target>
   <atom:link href="http://www.example.org/transactions/1" rel="self"/>
   <currency>USD</currency>
   <amount>100.00</amount>
   <note>Testing transfer</note>
</transfer>



Sunucudaki, jetonun sunucunun işlem günlüğü.

# Request
POST /transfer;t=e6e3c89d4dfe7f3a818734a6237ccfc5 HTTP/1.1 > İstemci koşullu bir POST isteği gönderir.
Host: example.org
Content-Type: application/xml;charset=UTF-8

<transfer>
   <source>urn:example:org:account:1</source>
   <target>urn:example:org:account:2</target>
   <currency>USD</currency>
   <amount>100.00</amount>
   <note>Testing transfer</note>

</transfer>

# Response
HTTP/1.1 403 Forbidden > Sunucu bir çakışma algıdı.
Content-Type: application/xml;charset=UTF-8
Date: Sat, 17 Oct 2019 20:16:18 GMT

<error xmlns:atom="http://www.w3.org/2005/Atom">
   <message xml:lang="en">Transfer already created.</message>
</error>


Bu sefer, sunucu, belirtecin önceden kaydedilmiş olup olmadığını görmek için işlem günlüğünü kontrol eder. Kullanılmış kopya oluşturmak yerine 403 döndürür. Bu teknikte POST tam olarak bir  kez çağrıldı.