OK etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
OK 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.

14 Mayıs 2021 Cuma

Sunuculardaki Koşullu PUT İstekleri


PUT istekleri için uygulama veya eşzamanlılık kontrolünün güncellemelerde olmaması, Last-Modified ve/veya ETAG başlıklarında nasıl uygulanacağını gösterilecektir. Kaynak henüz mevcut değilse ve sunucu PUT aracılıyla kaynak oluşturmayı destekliyorsa, istemci tarafından belirtilen URl de yeni bir kaynak oluşturun. Sunucu desteklemiyorsa kaynak oluşturma, istemciye 404 durumunu döndürün. 


Kaynak varsa aşağıdaki adımları uygulayalım.

* İstemci If-Unmodified-Since ve/veya If-Match üstbilgilerini içermiyorsa döndür, 403  cevap gövdesinde nedenini açıklayın.
* Sağlanan If-Unmodified-Since veya If-Match başlıkları gerçek sunucudaki gösterimin değiştirilmiş tarih-saat ve ETAG değerleri hata döndürürse. Kod 412 (Ön koşul başarısız)
*İstemci koşullu bir PUT isteği gönerirse ve sağlanan koşullar eşleşir kaynağı günceller ve 200 (OK) veya 204 (İçerik Yok) geri dönüş sağlanır.
İsteğe bağlı olarak, sağlanan güncellenmiş Son Değiştirilmiş ve/veya ETAG başlıklarını eklenebilir. Kaynak yanıt aynı zamanda güncellenen URI ile bir Content-Location başlığı içerir.

Sunucunun yapması gereken kontrollere genel bir bakış için.





Bunun işe yaraması için her zaman Last-Modified ve/veya ETAG başlıklarını eklediğinizden emin olun. Çünkü Sunucu istemciye bir temsil döndürür.


Koşullu PUT isteklerini uygulama adımları, koşullu PUT isteklerini uygulamaya benzer GET istekleri  için bir sonraki makalede ele alınacaktır.  Temel fark If-Unmodified-Since kullanılmasıdır. ve/veya If-Match-Since ve/veya If-None-Match başlıkları yerine If-Match başlıkları kullanılabilir.

Bir müşteri tarafından gönderilen PUT isteği;


# Process this request if and only if the included conditional tags match
PUT /reviews/notes_from_underground HTTP/1.1
Host: www.example.org
If-Unmodified-Since: Sun, 09 Aug 2020 00:56:14 GMT
If-Match: "3f4a74db207d0447d46710a64971e777"

Sunucu koşullu üstbilgiler bekleniyorsa ancak istek hiçbirini bulamazsa dönüş yanıt kodu 403 olarak geri dönüş yapılabilir. İstek koşullu başlıklar bulursa, bunları Last-Modified ve/veya ETAG değerlerinin mevcut değerleri ile karşılaştırılmalıdır. Eğer onlar eşleşirse, sunucu güncellemeyi işleyebilir. 200 (OK) yanıtı döndürebilir. Değilse; sunucu dönüş yanıt kodu 412 (Ön Koşul Başarısız) döndürebilir. Bazı örnekler için bir sonraki makalelerde yer verilecektir.

Suncu istekleri üzerine hem son değiştirilmiş hemde ETAG üst bilgileri gönderirse, PUT isteğini yanlızca If-Unmodified-Since ve If-Match başlıkları mevcut değerlerle eşleşir.  İçlerinden biri başarısız olsa bile MATCH 412 döndürülür.

İşte PUT isteklerini koşullu yapmanın neden önemli olduğunu gösteren bir örnek; İstemcilerin değiştirilebileceği ve/veya içeriği yöneten wiki benzeri bir sunucu düşünün. İçeriği silin. Değiştirilmek isteyen A ve B olmak üzere iki müşteri olduğunu varsayın. Aşağıdaki sırayla bir kaynak istemci A kaynağın bir temsilini alır. A istemcisinin bir kullanıcısı, kaynağı yerel olarak bir metin düzenleyicisinde düzenlemeye başlar.

# Request from client A
GET /reviews/notes_from_underground HTTP/1.1
Host: www.example.org
# Response
HTTP/1.1 200 OK
Content-Type: application/xml;charset-UTF-8
...


Müşteri B aynı kaynağın bir temsilini alır ve B istemcisinin bir kullanıcısı yerel olarak düzenlemeye başlar. 

# Request from client B
GET /reviews/notes_from_underground HTTP/1.1
Host: www.example.org
# Response
HTTP/1.1 200 OK
Content-Type: application/xml;charset-UTF-8

B istemcisinin kullancısı düzenlemlerini tamamlar ve bir PUT isteğinde bulunarak değişikliği sunucuya gönderir.

# Request from client B
PUT /reviews/notes_from_underground HTTP/1.1
Host: www.example.org
HTTP/1.1 200 OK
Content-Type: application/xml;charset-UTF-8

İLK GÜNCELLEME:
Bir kaç saniye sonra A istemcisinin kullanıcısı düzenlemelerini bitirir ve değişiklikleri  ile birlikte gönderir. Başka bir PUT isteği;

# Request from client A
PUT /reviews/notes_from_underground HTTP/1.1
Host: www.example.org

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

ikinci güncelleme ilk güncellemenin üzerine yazar.

Bu sıranın bir sonucu olarak, A müşterisi, B müşterisi tarafından yapılan değişikliklerin üzerine yazar. İstemci B'nin güncellemesi kaybolur.! ne müşteri A nede müşteri B de kayıp güncellemeden haberi yoktur.
Her iki PUT işlemi sonuçta başarılı oldu. Ancak daha sonra B'nin kullanıcısı güncellemelerinin kaybolduğunu görecektir. Her değişikliği kaydetmek için sunucuda uygulamazsanız bu kayıp güncelleştirmeyi algılamak için sunucuda hatayı ayıklayamazsınız.

PUT isteklerini koşullu yapmak güncelleme kaybını önler. Gelen bir istek müşteri B için;

# Request from client B
PUT /reviews/notes_from_underground HTTP/1.1 >> İlk koşullu güncelleme başarılı
Host: www.example.org
If-Unmodified-Since: Sun, 09 Aug 2020 00:56:14 GMT
If-Match: "3f4a74db207d0447d46710a64971e777"

# Response
HTTP/1.1 204 No Content
Content-Location: http://www.example.org/reviews/notes_from_underground
Content-Type: application/xml;charset-UTF-8
Last-Modified: Sun, 09 Aug 2020 01:10:14 GMT
If-Match: "5dcb920acfd4f3943dbc1672756d7f43"

İlk koşullu güncelleme başarılı ;
Yanıt bir Content-Location başlığı ve güncellenmiş Last-Modified ve istemcinin gelecekteki isteklerde kullanabileceği ETAG değerleri.

İstemcinin isteği koşulluysa ve sunucu istemcinin isteği çatışmaları doğru bir şekilde tanımlayabilir.

# Request from client A
PUT /reviews/notes_from_underground HTTP/1.1 > 2 nci güncelleme Failed etti. 
Host: www.example.org
If-Unmodified-Since: Sun, 09 Aug 2020 00:56:14 GMT

If-Match: "3f4a74db207d0447d46710a64971e777"
# Response
HTTP/1.1 412 Precondition Failed
Content-Type: application/xml;charset-UTF-8
<error>

   <message>The review you are trying to update has changed.</message>
   <description>You are trying to update a resource based on stale information.
   Get a new copy of this review, resolve any differences, and retry.</description>
</error>



24 Nisan 2021 Cumartesi

Sunuculardaki Koşullu GET isteklerinin Uygulanması

 


Koşullu GET istekleri sunucuya yanıt gövdesini atlama fırsatı verir. Koşullu istekler, istemcinin If-Modified-Since ve If-Match başlıklarının göndermesini içerir. Önceki bir istekten son Değiştirilen ve ETAG başlıklarına dayalıdır. Koşullu istekler müşteriden gelen isteklerin sayısını azaltmaz ancak kullanımdaki değişikliklerden dolayı azaltılabilir.

Sunucuyu son değşiklik saat ve tarih değerlerini ve/veya varlık etiklerini takip edecek şekilde tasarlanması gerekir. Son değiştirilme tarih ve saatini Last-Modified başlığı olarak ve varlık etiketine ETAG başlığı eklenmeli.

İstemci bir If gönderdiyse istemciden gelen GET ve HEAD isteklerine yanıt verirken None-Match başlığı değerini sunucudaki temsilin ETAG ile karşılaştırın. istemci If-Unmodified-Since gönderdiyse değerini sunucudaki temsil zamanı son değiştirilen ile karşılaştırın.

Kontrollerden herhangi biri yanlışsa veya istemci bu başlıklardan hiçbirini göndermediyse en son yeni ETAG ve/veya Last-Modified head dahil olmak üzere müşteriye sunumun kopyası değilse, istemciye 304(Değiştirilmedi) HTTP durum kodu mesaj olmadan döndürün.

Ön belleğe alınmış bir kopyanın ömrünü uzatmak için koşullu GET isteklerini kullanma sürecine doğrulama deniyor. Bunu desteklemek için sunucunun sona erme başlıklarını birlikte döndürmesi gerekiyor. İstemcilere koşullu üstbilgilerle ve 304 (Değiştirilmedi) önbelleğe alınmış bir yanıtın ömrünü uzatmak için kullanılabilir.

Aşağıdaki verilecek örnekte; müşterinin bir önbelleğe alınmış yanıtı depolamak ve önbelleğin işlenmesini sağlamak için önbellek alma proxy sunucusu otomatik olarak doğrular. Müşterinizin bir kopyasını saklıyorsanız, yerel deposunda bir temsil olup olmadığını kontrol etmek yerel olarak saklanan kopya hala yeni kabul edilir.

Son kullanma tarihi ile birlikte ETAG ve Last-Modified başlıklarını içeren bir gösterim önbelleğe alma başlıklarına örnek;


# Response

HTTP/1.1 200 OK

Date: Sun, 09 Aug 2009 00:56:14 GMT

Last-Modified: Sun, 09 Aug 2009 00:56:14 GMT

Expires: Sun, 09 Aug 2009 01:56:14 GMT

Cache-Control: max-age=3600,must-revalidate

E-Tag: "3f4a74db207d0447d46710a64971e777"

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


Bu örnekteki ETAG başlığının değeri bir varlık etiketidir. iki GET yapılırsa ETAG başlığı için iki farklı değer ister ve alır. Bu temsilcinin yeniden yönlendirmesini değiştirir.

Sunucunun bu örnekteki amacı, bir önbelleğin bir sunucu için depolanan bir temsil sunmasına izin vermektir. Saat sona erdiğinde koşullu bir GET talebinde bulunarak sunumu doğrulamak. Aşağıdaki sıra doğrulama sürecini temsil eder.

# First request

GET /person/joe HTTP/1.1

Host: www.example.org

# First response

HTTP/1.1 200 OK

Date: Sun, 09 Aug 2009 00:44:14 GMT

Last-Modified: Sun, 09 Aug 2009 00:40:14 GMT

Expires: Sun, 09 Aug 2009 01:44:14 GMT

Cache-Control: max-age=3600,must-revalidate


...

# Second request after 10 minutes

GET /person/joe HTTP/1.1

Host: www.example.org

# Second response - returned by cache

HTTP/1.1 200 OK

Date: Sun, 09 Aug 2009 00:54:14 GMT

Last-Modified: Sun, 09 Aug 2009 00:40:14 GMT

Expires: Sun, 09 Aug 2009 01:44:14 GMT

Cache-Control: max-age=3600,must-revalidate

Age: 600


 HTTP/1.1 200 OK > Sunucu tarafından oluşturulan yanıt

Cache-Control: max-age=3600,must-revalidate > Yanıt 3600 saniye önbelleğe alınabilir ancak bu sürenin sonunda yeniden doğrulanması gereken dönem.

Age: 600 > Önbellek tarafından sunulan 600 saniyelik eski bir yanıt.

Bir saatlik sürenin dolmasından sonra istemciler tarafından yapılan istekler önbelleğin önbelleğe alınmış yanıtını gösterir.


# Third request after an hour

GET /person/joe HTTP/1.1

Host: www.example.org

# Request sent by the cache to the origin server
GET /person/joe HTTP/1.1
Host: www.example.org
If-Modified-Since: Sun, 09 Aug 2009 00:40:14 GMT
If-None-Match: "3f4a74db207d0447d46710a64971e777"

# Response generated by the server
HTTP/1.1 304 Not Modified
Date: Sun, 09 Aug 2009 01:54:14 GMT
Last-Modified: Sun, 09 Aug 2009 00:56:14 GMT
Expires: Sun, 09 Aug 2009 02:54:14 GMT
Cache-Control: max-age=3600,must-revalidate
E-Tag: "3f4a74db207d0447d46710a64971e777"
Content-Type: application/xml; charset=UTF-8

# Response returned by the cache
HTTP/1.1 200 OK
Date: Sun, 09 Aug 2009 00:54:14 GMT
Last-Modified: Sun, 09 Aug 2009 00:40:14 GMT
Expires: Sun, 09 Aug 2009 01:44:14 GMT
Cache-Control: max-age=3600,must-revalidate

# Third request after an hour 

GET /person/joe HTTP/1.1 > Son kullanma tarihinden sonra müşteri talebi


# Request sent by the cache to the origin server

GET /person/joe HTTP/1.1 > Önbelleğe alınan yanıtı doğrulama isteği


HTTP/1.1 304 Not Modified> Kaynak sunucunun yanıtının değiştirilmediğini belirten yanıt parçası.


HTTP/1.1 200 OK> Önbelleğe alınmış bir  kopyayı içeren istemciye önbellek tarafından verilen yanıt.

Yanıt süresi dolmadığından sunucu ikinci isteği görmez ve önbelleğin hala bir kopyası mevcut. Üçüncü istek, doğrulama içi sunucuya ulaşır.  Üçüncü sunucunun yanıtı temsilin değişmediğini bildiriyor ve bir saate daha ömrünün olduğunu belirtiyor.

Bu örnekte, sunucunun sorumluluğu şu değerleri karşılaştırmaktır.

If-Modified-Since ve/veya If-None-Match başlıkları mevcut, değerleri ise bir kaynak gösterimi ile 200 (OK) veya 304 (Not Modified)