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

8 Ekim 2023 Pazar

Kaynak Güncellemelerinin Geri Alınması

    Bazen istemcileri bir geri alma işlevi sağlanması gerekebilir. Örneğin; bir müşteri bir teklife yakın zamanda yapılan bazı değişiklikleri geri almak isteyebilir. Bu sorun, en son anlık görüntüyü yeniden etkinleştirme yeteneği eklenmiş bir anlık görüntü almaya benzer. 

Bir müşteri bir kaynağı güncellemek için her PUT gönderdiğinde bir anlık görüntü alınır.

Geri almak için bir denetleyici kaynağı sağlanmalı. Bir değişikliği geri almak için istemcinin POST isteği göndermesine izin verin. Kaynağın geçerli durumunu denetleme aamcıyla bir işlem günlüğüne kaydedin. Sunucu kaynağın durumunu en son anlık görüntünden geri yükler ve istemciyi kaynağın URI sine yönlendirir.

Örnek tarifte anlatılmış http://wiki.example.org/trails/ColcuckLake deki bir wiki belge düşünüldüğünde Kaynağın temsilinde geri alma işlemini gerçekleştirmek için bir bağlantı ekleyin.


# Request
GET /trails/ColchuckLake HTTP/1.1 Host: wiki.example.org

# Response
HTTP/1.1 200 OK
Last-Modified: Sun, 01 Nov 2009 16:24:56 GMT
Content-Type: application/atom+xml;type=entry;charset=UTF-8

<atom:entry xmlns:atom="http://www.w3.org/2005/Atom"> <atom:author>

<atom:name>Joe Hiker</atom:name>


</atom:author>
<atom:title>Colchuck Lake</atom:title> <atom:id>urn:example:wiki:trails:ColcuckLake</atom:id>
<atom:link href="http://wiki.example.org/trails/ColchuckLake" rel="self"/> <atom:link href="http://wiki.example.org/trails/ColchuckLake/s1" rel="previous"/> <atom:link href="http://wiki.example.org/trails/ColchuckLake/undo;

t=72f2a2342ce7dc806ae7697e138bad71" rel="http://wiki.example.org/rels/undo"/>

<atom:content xml:lang="en" atom:type="html"> ... updated draft ...

</atom:content> </atom:entry>

Kaynağı mevcut durumunu geri almak için URI  bağlantısı kurulur. İsmteci bir geri alma isteği göndermek için http://wiki.example.org/rels/undo ilişiki türünde bağlantıyı kullanabilir. Bu bağlantıdaki URI bir değişikliği geri alabilen bir denetleyici kaynağıdır.

# Request

POST /trails/ColchuckLake/undo;t=72f2a2342ce7dc806ae7697e138bad71 Host: wiki.example.org
Content-Length: 0

# Response
HTTP/1.1 303 See Other
Location: http://wiki.example.org/trails/ColcuckLake

Denetleyici kaynağın mevcut durumunu geri yükler ve denetim amacıyla geri alma isteğini günlüğe kaydeder. Kaynağa yönelik sonraki bir GET isteği geri yüklenen duruma sahip olacaktır.

# Request

GET /trails/ColchuckLake HTTP/1.1 Host: wiki.example.org

# Response
HTTP/1.1 200 OK
Last-Modified: Sun, 01 Nov 2009 16:24:56 GMT
Content-Type: application/atom+xml;type=entry;charset=UTF-8

<atom:entry xmlns:atom="http://www.w3.org/2005/Atom"> <atom:author>

<atom:name>Joe Hiker</atom:name>
</atom:author>
<atom:title>Colchuck Lake</atom:title> <atom:id>urn:example:wiki:trails:ColcuckLake</atom:id>
<atom:link href="http://wiki.example.org/trails/ColchuckLake" rel="self"/> <atom:content xml:lang="en" atom:type="html">

... updated draft ... </atom:content>

</atom:entry>

Yenilemek için bu kodlama örnekler kapsamında detaylandırılıp devam edebilir.


24 Eylül 2023 Pazar

Kaynakların Anlık Görüntüsü Nasıl Alınır.

 

Bu konuda her güncelleme öncesinde kaynağın anlık görüntüsünün nasıl alınacağını açıklar.  Bir istemci bir kaynağı PUT yöntemiyle güncellediğinde, sunucu kaynağı mevcut durumunu günceller ve istemcinin güncellemeden önce ne olduğunu bilmesini imkan vermez. Ancak müşterilerin zamanda geri gitmeyi ve değişikliklerin geçmişine göz atmayı bekledikleri durumlar vardır. 


Örneğin belirli kavşaklardaki trafik koşullarının geçmiş ve şimdiki anlık görüntülerini sağlamak için bir web hizmeti tasarlandığını hayal edelim. Çoğu müşteri en son koşulları görmek ister, ancak bazı müşteriler geçmiş trafik koşullarına göz atmak isteyebilir. 

Alternatif olarak bir wiki düşünün. Wiki'deki her sayfa için herhangi bir müşterinin herhangi bir sayfada yapılan değişiklikleri alabilmesi karışlatırabilmesi ve değerlendirmesi için sunucunun her sayfa için mevcut ve geçmiş revizyonların bir revizyon yığınının tutması gerekir.

Bir istemci bir kaynağı güncellemek için PUT  isteği gönderdiğinde kaynağı güncelemeden önce dolaylı olarak bir anlık görüntü - bir kopya kaynağı - oluşturur. Güncellenen kaynağın temsilinde, anlık görüntüye bir bağlantı eklenir. Ayrıca anlık görüntü kaynağı güncelenen kaynağa bir bağlantı eklenir.  Bir istemci bir DELETE isteği gönderildiğinde tüm anlık görüntülerle bir kaynağı silinir.

Özünde bu tarih müşterinin kaynakların sürümlerin nasıl oluşturacaklarını ve yöneteceklerini öğrenmelerine gerek kalmadan kaynaklar için basit bir sürüm oluşturma mekanizması oluşturmamıza olanak tanır.

Sürümlerin umursamayan istemciler, HTTP'nin tek tip arayüzünün her zamanki gibi sunucunun anlık görüntülerin koruduğunu fark etmektedir. Sürümleri önemseyen istemciler geçmiş sürümlere gözatabilir.  Sunucunun deposunda her anlık görüntü tam bir kopya olabilir veya yalnızca önceki sürümden farklılıkların listesini içerebilir. İşte yeni bir anlık görüntü oluşturan örnek; 

# Request
PUT /trails/ColchuckLake HTTP/1.1
Host: wiki.example.org
If-Unmodified-Since: Sun, 01 Nov 2009 12:34:43 GMT Content-Type: application/atom+xml;type=entry;charset=UTF-8

<atom:entry xmlns:atom="http://www.w3.org/2005/Atom"> <atom:author>

<atom:name>Joe Hiker</atom:name>
</atom:author>
<atom:title>Colchuck Lake</atom:title> <atom:id>urn:example:wiki:trails:ColcuckLake</atom:id> <atom:content xml:lang="en" type="html">

... initial draft ... </atom:content>

</atom:entry>

# Response
HTTP/1.1 204 No Content


Bir PUT isteğine yanıt olarak sunucu kaynağı http://wiki.example.org/trails/ColchukLake/s1 adresine kopyalar. 

# Request
GET /trails/ColchuckLake HTTP/1.1 Host: wiki.example.org

# Response
HTTP/1.1 200 OK
Last-Modified: Sun, 01 Nov 2009 16:24:56 GMT
Content-Type: application/atom+xml;type=entry;charset=UTF-8

<atom:entry xmlns:atom="http://www.w3.org/2005/Atom"> <atom:author>

<atom:name>Joe Hiker</atom:name>
</atom:author>
<atom:title>Colchuck Lake</atom:title> <atom:id>urn:example:wiki:trails:ColcuckLake</atom:id> //Kaynağın Mevcut Sürümü
<atom:link href="http://wiki.example.org/trails/ColchuckLake" rel="self"/> <atom:link href="http://wiki.example.org/trails/ColchuckLake/s1" rel="previous"/> <atom:content xml:lang="en" atom:type="html"> //Anlık Görüntü

... updated draft ... </atom:content>

</atom:entry>


Önceki ilişkiye sahip bağlantı kaynağı önceki anlık görüntüsüne bir bağlantıdır. İstemci kaynağı değiştirmek için başka bir PUT isteği gönderdiğinde sunucu http://wiki.example.org/trails/ColchukLake/s2 adresinde yeni bir anlık görüntü oluşturmak için daha önce gösterilen işlemi tekrarlayabilir.

# Request to update the resource
PUT /trails/ColchuckLake HTTP/1.1
Host: wiki.example.org
Content-Type: application/atom+xml;type=entry;charset=UTF-8 If-Unmodified-Since: Sun, 01 Nov 2009 16:24:56 GMT

<atom:entry xmlns:atom="http://www.w3.org/2005/Atom"> <atom:author>

<atom:name>Joe Hiker</atom:name>
</atom:author>
<atom:title>Colchuck Lake</atom:title> <atom:id>urn:example:wiki:trails:ColcuckLake</atom:id> <atom:content xml:lang="en" type="html">

... updated draft ... </atom:content>

</atom:entry>

# Response
HTTP/1.1 204 No Content


Bu adımdan sonra URI http://wiki.example.org/trails/ColchukLake adresindeki kaynak en son sürümdür. Öncesinde http://wiki.example.org/trails/ColchukLake/s2, ardından http://wiki.example.org/trails/ColchukLake/s1 geliyor. İstemci önceki ilişki türüyle bağlantıyı kullanarak eski anlık görüntüleri almak için geri doğru gidebilir. 
Bu güncellemeden sonra http://wiki.example.org/trails/ColchukLake/s2  tin bir temsili kendi anlık görüntüsünü içerir. http://wiki.example.org/trails/ColchukLake/s2


# Request

GET /trails/ColchuckLake/s2 HTTP/1.1 Host: wiki.example.org

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

<atom:entry xmlns:atom="http://www.w3.org/2005/Atom"> <atom:author>

<atom:name>Joe Hiker</atom:name>
</atom:author>
<atom:title>Colchuck Lake</atom:title> <atom:id>urn:example:wiki:trails:ColcuckLake</atom:id>
<atom:link href="http://wiki.example.org/trails/ColchuckLake/s2" rel="self"/> // Mevcut anlık görüntü kaynağı

<atom:link href="http://wiki.example.org/trails/ColchuckLake/s1" rel="previous"/> //Bir önceki anlık görüntü kaynağı

 <atom:link href="http://wiki.example.org/trails/ColchuckLake" rel="next"/> //Sonraki görüntü kaynağı

<atom:content xml:lang="en" atom:type="html">

... updated draft ...

</atom:content> 

</atom:entry>


İstemci önceki anlık görüntülere gitmek için önceki ilişki türüyle bağlantıyı kullanabilir veya daha yeni anlık görüntüllere gitmek için bir sonraki ilişkiye bağlantı kullanabilir.

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ı.

12 Aralık 2021 Pazar

Koşullu PUT ve DELETE talepleri Nasıl Gönderilir.

 

İstemci PUT kullanarak yeni bir kaynak oluşturduğunda veya sunucu If Kaynağa yapılan önceki bir GET veya PUT isteğinden beri Değiştirilmiş ve/veya ETAG başlıkları her zamanki gibi PUT isteklerinde bulunur.

İstemcinin önceki bir istekten beri Değiştirildiği Tarih ve/veya ETAG başlıkları varsa kaynak PUT , DELETE istekleri yaparken aşağıdaki başlıkları bu talepli koşullarda eklenir.

* Last-Modified başlığıyla aynı değere sahip bir If-Unmodified-Since başlığı. Sunucunun isteği işlenmesi gerektiğini belirtmek için yanlızca suncuda bu başlıkta belirtilen zamandan beri kaynakta değişiklik yapılmalıdır.

*ETAG başlığıyla aynı değere sahip bir If-Match başlığı sunucu isteği yalnızca ve ancak sağlanan üstbilgi değeri eşlenirse işlemelidir. Mevcut ETAG değeri için belirtilmelidir.

Sunucu 412 (Ön Koşul Başarısız) durum kodunu döndürürse koşulsuz bir yeni Last-Modified ve ETAG başlıklarını almak için GET isteği kaynağının güncellenmesi veya silinmesi kararı yeni temsile göre hala geçerlidir. Sonra bu başlıklarla PUT veya DELETE isteğini tekrar etmeniz gerekir.

Koşullu bir PUT isteğinde bulunan bir istemciye örnek;

# Request
PUT /reviews/notes_from_underground HTTP/1.1
Host: www.example.org
If-Unmodified-Since: Sun, 09 Aug 2019 00:56:14 GMT
If-Match: "3f4a74db207d0447d46710a64971e777"
.....
# Response
HTTP/1.1 200 OK
Date: Sun, 16 Aug 2019 01:00:23 GMT
Content-Location: http://www.example.org/reviews/notes_from_underground
Last-Modified: Sun, 16 Aug 2019 01:00:23 GMT
E-Tag: "5bbae963eb30e03cf1fd218a9dc92a5b"
Content-Type: application/xml; charset=UTF-8
.....

Bu istekte, If-Unmodigied-Since değeri Last-Modified başlığının değeridir. Müşteri önceki bir talep sırasında elde ettiği, benzer şekilde değer If-Match başlığı , ETAG başlığının değeridir. 
Müşteri zaten sahip değilse temsilinin kopyası için veya sunucu yanıt kodunu döndürürse bu başlıklar 412 almak için yeni bir koşulsuz istek GET gönderilmesi gerekir.

# Unconditional GET request
GET /reviews/notes_from_underground HTTP/1.1
Host: www.example.org
Cache-Control: no-cache
Pragma: no-cache
# Response
HTTP/1.1 200 OK
Content-Type: application/xml;charset-UTF-8
Date: Sun, 16 Aug 2019 01:00:23 GMT
Last-Modified: Sun, 09 Aug 2019 00:55:46 GMT
ETag: "3f4a74db207d0447d46710a64971e777"

HEAD talebinde bulunarak bu başlıkları elde etmek yeterli değildir. İstemciler bu başlıklar kaynağın mevcut durumuna karşılık gelir. Başlıkları bir HEAD isteği araclığıyla tek başına almak, müşterinin bunu bilmesine yardımcı olmayacaktır. Kaynağın mevcut durumu, body nin onunla birlikte alınması gerekir. Üstbilgiler dahil.


İstemci DELETE istekleri için aynı süreci izlemelidir. 412 herhangi bir istek istemcinin güncelleme veya silme kararı verdiğini gösterir.


# Conditional request
PUT /reviews/notes_from_underground HTTP/1.1
Host: www.example.org
If-Unmodified-Since: Sun, 09 Aug 2019 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>

9 Aralık 2021 Perşembe

Müşteriden Koşulsuz GET Talepleri Nasıl Yapılır

  HTTP 1.1 istemcilerin sona erme önbelleğini değiştirmesine ve yeni temsiller istemesine izin verir. Bu tarif bir kaynak aldıktan sonra bir kayanağın yeni bir temsilini almak için kullanabilirsiniz. 412 (Ön Koşul Başarısız ) veya en yenisini almak için başarılı bir PUT veya PATCH den sonra  bile oluşan temsildir. 

GET isteğinde; Cache-Control : non-cache ve Pragma: non-cache üst bilgilerini ekleyin.

İstemcinin bir kaynağı güncellemek için koşullu bir PUT isteğinde bulunduğunu varsayalım.  Katmanlı koşullar eşleşmiyor ve sunucu 412 yi döndürüyorsa.

# 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 2019 00:56:14 GMT

If-Match: "3f4a74db207d0447d46710a64971e777"

...

# Response

HTTP/1.1 412 Precondition Failed

Content-Length: 0


Müşteri artık yeni bir temsil almak için koşulsuz  kaynağından bir GET talebinde bulunabilir. 

# Request
GET /status HTTP/1.1
Cache-Control: no-cache> Önbellek kontrolü: önbelleksiz ve Pragma önbelleksiz üstbilgiler, istemci koşullu isteklerini ortadan kaldırır.
Pragma: no-cache

# Response
HTTP/1.1 200 OK
Date: Sun, 09 Aug 2019 05:20:10 GMT
Last-Modified: Sun, 09 Aug 2019 05:20:10 GMT > Sunucu uygulanabilir değiştirilmiş. Last-ETAG
ETag: "a3d3005f4a1632c88e8889af985e6294"
Expires: Sun, 09 Aug 2019 15:56:14 GMT
Cache-Control: max-age=36000,public
Content-Type: application/xml; charset=UTF-8
...


İstekleri non-cache yönergesi herhangi bir ara önbellekten önbelleğe sunmamasını ister. Temsil eder ve isteği kaynak sunucuya iletir.

Bazı önbelleklerin önbellek yok yönergesi sayacak şekilde yapılandırabildiğini unutmayalım. Böyle durumlarda önbellekler bir UYARI başlığı döndürebilir. 

# Request
GET /status HTTP/1.1
Cache-Control: no-cache
Pragma: no-cache
# Response
Date: Sun, 09 Aug 2019 00:56:14 GMT
Last-Modified: Sun, 09 Aug 2019 00:56:14 GMT
Expires: Sun, 09 Aug 2019 10:56:14 GMT
Cache-Control: max-age=36000,public
Content-Type: application/xml; charset=UTF-8
Age: 1021
Warning: 110



Warning başlığının değeri bir tamsayı kodudur ve bu örnekte şunu belirtir. Yanıt eski, bu başlıkla ilgili daha fazla ayrıntı için HTTP 1.1 e göz atmanız gerekir. 

NOT:
Gerekmedikçe koşulsuz GET talepleri yapmayın. Koşulsuz istekler performansı düşürür ve gecikmeyi artırır.


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>