RESTful API yöntemleri; BAŞLIK VE SEÇENEKLER


100

PHP'deki bir uygulama için bir RESTful API modülü yazıyorum ve fiillere biraz karıştım HEADve OPTIONS.

  • OPTIONS  Belirli bir kaynak için mevcut HTTP fiillerini almak için mi kullanılır?
  • HEAD Belirli bir kaynağın mevcut olup olmadığını belirlemek için kullanılır?

Birisi bu fiilleri * netleştirebilseydi, bu çok takdir edilecektir.

* Açıklama, HTTP fiillerini yeniden amaçlayan RESTful API mimarileriyle ilgiliydi. O zamandan beri de o gerçekleşme geldiniz HEADve OPTIONSgerektiği değil yeniden amaçlı olabilir ve herhangi bir HTTP uygulaması gerektiği gibi yerine tahmin edilebileceği gibi davranırlar. Oh, 2 yılda nasıl büyüyoruz.


büyük olasılıkla HTTP spesifikasyonlarının web'de kolayca bulunabilmesidir.
Gordon

@Gordon - Yeterince adil ve RESTful API hizmetlerinin mevcut HTTP spesifikasyonlarından yararlanmaya yönelik olduğunu anladığım halde, uygulama ayrıntıları için bazı kısmi sapmalar olduğunu varsaymıştım. Benim hatam.
Dan Lugg

16
Çoğu şeyin teknik özellikleri web'de kolayca bulunur. SO ile ilgili sorular, dokümantasyonun ötesinde açıklama içindir. Bu buna uyuyor.
Andrew Ensley

Yanıtlar:


63

Göre: http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

9.2 SEÇENEKLER

SEÇENEKLER yöntemi, İstek-URI tarafından tanımlanan istek / yanıt zincirinde bulunan iletişim seçenekleri hakkında bilgi için bir talebi temsil eder. Bu yöntem, istemcinin bir kaynakla ilişkili seçenekleri ve / veya gereksinimleri veya bir sunucunun yeteneklerini, bir kaynak eylemi gerektirmeden veya bir kaynak erişimini başlatmadan belirlemesine izin verir.

Bu yönteme verilen yanıtlar önbelleğe alınamaz.

OPTIONS talebi bir varlık gövdesi içeriyorsa (İçerik Uzunluğu veya Transfer Kodlamasının varlığıyla belirtildiği gibi), ortam türü bir İçerik Türü alanıyla gösterilmelidir ZORUNLU. Bu belirtim böyle bir gövde için herhangi bir kullanım tanımlamasa da, HTTP'nin gelecekteki uzantıları, sunucuda daha ayrıntılı sorgular yapmak için SEÇENEKLER gövdesini kullanabilir. Böyle bir uzantıyı desteklemeyen bir sunucu, istek gövdesini iptal EDEBİLİR.

İstek URI'si bir yıldız işaretiyse ("*"), OPTIONS isteğinin belirli bir kaynak yerine genel olarak sunucuya uygulanması amaçlanır. Bir sunucunun iletişim seçenekleri tipik olarak kaynağa bağlı olduğundan, "*" isteği yalnızca "ping" veya "işlemsiz" yöntem türü olarak kullanışlıdır; istemcinin sunucunun yeteneklerini test etmesine izin vermenin ötesinde hiçbir şey yapmaz. Örneğin, bu, HTTP / 1.1 uyumluluğu (veya eksikliği) için bir proxy'yi test etmek için kullanılabilir.

İstek URI'si bir yıldız işareti değilse, OPTIONS isteği yalnızca bu kaynakla iletişim kurulurken kullanılabilen seçenekler için geçerlidir.

200 yanıtı, sunucu tarafından uygulanan ve bu kaynak için geçerli olan isteğe bağlı özellikleri gösteren (örneğin, İzin Ver), muhtemelen bu belirtimle tanımlanmayan uzantılar da dahil olmak üzere, herhangi bir başlık alanını içermelidir ÖNERİ. Varsa yanıt kuruluşu, iletişim seçenekleri ile ilgili bilgileri de İÇERMELİDİR. Böyle bir gövdenin biçimi bu belirtim tarafından tanımlanmamıştır, ancak HTTP'nin gelecekteki uzantıları tarafından tanımlanabilir. Uygun yanıt biçimini seçmek için içerik pazarlığı KULLANILABİLİR. Yanıt gövdesi dahil edilmemişse, yanıt "0" alan değerine sahip bir İçerik Uzunluğu alanı İÇERMELİDİR.

Max-Forwards istek başlığı alanı, istek zincirindeki belirli bir proxy'yi hedeflemek için KULLANILABİLİR. Bir proxy, istek iletmesine izin verilen bir absoluteURI üzerinde bir OPTIONS talebi aldığında, proxy'nin bir Maks-İletme alanını kontrol etmesi ZORUNLUdur. Max-Forwards alan değeri sıfırsa ("0"), proxy mesajı iletmemelidir * ZORUNLU *; bunun yerine, proxy kendi iletişim seçenekleriyle yanıt vermelidir. Max-Forwards alan değeri sıfırdan büyük bir tamsayı ise, proxy, isteği iletirken alan değerini azaltması ZORUNLUdur. Talepte Max-Forwards alanı yoksa, iletilen istek bir Max-Forwards alanı İÇERMEMELİDİR.

9.4 KAFA

HEAD yöntemi, sunucunun yanıtta bir ileti gövdesi döndürmemesi ZORUNLU olması dışında GET ile aynıdır. Bir HEAD isteğine yanıt olarak HTTP başlıklarında bulunan meta bilgiler, bir GET isteğine yanıt olarak gönderilen bilgilerle aynı olmalıdır. Bu yöntem, kuruluşun kendisini devretmeden, talebin ima ettiği varlık hakkında meta bilgi elde etmek için kullanılabilir. Bu yöntem genellikle geçerlilik, erişilebilirlik ve son değişiklikler için köprü metni bağlantılarını test etmek için kullanılır.

Bir HEAD isteğine verilen yanıt, yanıtta yer alan bilgilerin o kaynaktan önceden önbelleğe alınmış bir varlığı güncellemek için kullanılabilmesi açısından önbelleğe alınabilir. Yeni alan değerleri, önbelleğe alınan varlığın mevcut varlıktan farklı olduğunu gösteriyorsa (Content-Length, Content-MD5, ETag veya Last-Modified'daki bir değişiklikle gösterildiği gibi), o zaman önbellek, önbellek girişini eski olarak ele almalıdır ZORUNLU.


1
Kapsamlı alıntı için teşekkürler @sdolgy; Ancak pratikte (do gerektiğini birçok başarılı RESTful API modülleri bu HTTP standartlarının tamamına uygun veya kabul edilebilir bir vardır) ince bu operasyonlar için cevap? Tembellikten değil, sadece meraktan; Muhtemelen uymak için gereken her şeyi uygulayacağım.
Dan Lugg

2
Kendinizinkini oluşturuyorsanız, ki öyle olduğunuzu varsayıyorum, hayatınızı kolaylaştırmak için belgelenmiş standartlarla bir miktar uyum sağlamaya çalışmalısınız ... ve API'nizi kullanan insanlarınki ... Microsoft'u takip etmeyin.
RFC'ler

Teşekkürler @sdolgy. Bağlantılı dokümana brifing verdikten sonra CONNECTfiilin sonunda dikkatimi çekti. RESTful kimlik doğrulaması için bu yöntemi kullanmak kötü bir seçim olur mu?
Dan Lugg

Bunun amaçlanan amaç olup olmadığından emin değilim "Bu belirtim, CONNECT yöntem adını dinamik olarak tünele dönüşebilen bir proxy ile kullanım için ayırır (ör. SSL tünelleme [44])." ... başka bir soruyu bir tanesine göndermek yararlı olabilir Bu konuda
stackexchange.com

2
@DanLugg Uygulamanız CONNECTSSL tünelleme şeklinde kullanmıyor olabilir , ancak uygulamanızın bir tüketicisinin CONNECTRFC'de belirtildiği şekilde uygulanan bir proxy'si varsa ne olacağını hayal edin , istekler size iletilemeyebilir. uygulama.
Steve Buzonas

97

OPTIONSyöntem API hakkında bilgi döndürür (yöntemler / içerik türü)

HEADyöntem, kaynak hakkında bilgi döndürür (sürüm / uzunluk / tür)

Sunucu cevabı

SEÇENEKLER

HTTP/1.1 200 OK
Allow: GET,HEAD,POST,OPTIONS,TRACE
Content-Type: text/html; charset=UTF-8
Date: Wed, 08 May 2013 10:24:43 GMT
Content-Length: 0

KAFA

HTTP/1.1 200 OK
Accept-Ranges: bytes
Content-Type: text/html; charset=UTF-8
Date: Wed, 08 May 2013 10:12:29 GMT
ETag: "780602-4f6-4db31b2978ec0"
Last-Modified: Thu, 25 Apr 2013 16:13:23 GMT
Content-Length: 1270
  • OPTIONS Bir kaynağın hangi HTTP yöntemlerini desteklediğini belirleme, örneğin onu SİLİNEBİLİR MİYİZ veya bir PUT yoluyla güncelleyebilir miyiz?
  • HEADBir kaynağın değişip değişmediğini kontrol etme. Bu, bir kaynağın önbelleğe alınmış bir sürümünü korurken kullanışlıdır
  • HEAD Muhtemelen maliyetli bir geri alma işlemi yapmadan önce, kaynakla ilgili meta verileri, örneğin ortam türü veya boyutu gibi geri alma
  • HEAD, OPTIONSBir kaynağın var olup olmadığını ve erişilebilir olup olmadığını test etme. Örneğin, bir uygulamada kullanıcı tarafından gönderilen bağlantıların doğrulanması

HEAD ve OPTIONS'ın RESTful mimarisine nasıl uyduğuna dair güzel ve özlü bir makale burada .


11
Harika cevap, çok kötü, partiye geç kalma cezasını ödeyecek. Kopyalayıp yapıştırılan kabul edilmiş cevap, bu fiillerin özellikle RESTful mimarisindeki yerine değinmeye bile başlamıyor.
Todd Menier

1
Bağlantınız kesildi. İşte son anlık görüntüsü: web.archive.org/web/20160528151316/https://…
kolobok

33

SEÇENEKLER size "Bu kaynak için hangi yöntemlere izin verilir" gibi şeyler söyler.

HEAD, gövde olmadan bir GET isteğinde bulunmanız durumunda alacağınız HTTP başlığını alır. Bu, istemcinin önbelleğe alma bilgilerini, hangi içerik türünün döndürüleceğini, hangi durum kodunun döndürüleceğini belirlemesini sağlar. Kullanılabilirlik bunun sadece küçük bir kısmı.


Teşekkürler @Quentin; OPTIONSdüşündüğüm buydu ve bu tür bir uygulama mevcut yaklaşımımla kolay olacak. Sdolgy'nin RFC alıntısına göre, OPTIONSformatta bir standart tanımlamıyor. Yanıt formatının diğer yanıtlarla aynı olduğu varsayılıyor mu? ( örneğin; JSON, XML, vb. )
Dan Lugg

@Tomcat RFC'den Alıntı: "Uygun yanıt biçimini seçmek için içerik anlaşması KULLANILABİLİR." Başka bir deyişle, yanıt, İsteğin başlıkta istediği şey olmalıdır.
Gordon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.