REST - Kabul et üstbilgisine karşı uzantılara karşı içerik müzakeresi arasında takas


40

Bir RESTful API tasarlayarak çalışıyorum. Herhangi bir kaynak için JSON ve XML'i iade etmek istediğimizi biliyoruz. Böyle bir şey yapacağımızı düşünüyordum:

GET /api/something?param1=value1
Accept:  application/xml (or application/json)

Ancak, birisi bunun için uzantıları kullanarak attı, şöyle:

GET /api/something.xml?parm1=value1 (or /api/something.json?param1=value1)

Bu yaklaşımlarla yaşanan travmalar nelerdir? Bir uzantı belirtilmediğinde kabul başlığına güvenmek en iyisidir, ancak belirtildiğinde uzantıları onurlandırmak mıdır? Bu yaklaşımın bir sakıncası var mı?


Hangi web sunucusunu kullanıyorsunuz? ve URL’leri nasıl ayrıştırır?
Dipan Mehta

1
Şeylerin teknik (sunucu) tarafı hakkında hiçbir fikrim yok. Söylendiği gibi, yaklaşımınızı tercih ediyorum çünkü http standardını kullanıyor, bu da anlaşılmasını kolaylaştırıyor (örneğin, bir başkası yolda birkaç yıl bakım yapması gerektiğinde). Sen ne zaman uzantısı güvenebileceğini kabul belirtilmemişse veya beklenmedik bir değeri vardır, ama her zaman ilk standart yolu ile gitmek istiyorum.
Treb

@Dipan Bu MVC4 Web API ile hack ediyorum (hala beta). ASP.NET'in oldukça güzel olan yönlendirme soyutlamalarını kullanıyor.
Brandon Linton

1
@Treb Evet, başlık değerini kabul etmenin hayranıyım. Her ikisini de desteklemenin sakıncalı olup olmadığını merak ediyorum.
Brandon Linton

Yanıtlar:


38

Bu, "Bununla birlikte, felsefi olarak - ilk yaklaşım tek yaklaşımdır." Ve bu "Uygun resmi RESTful yaklaşım, Kabul et: başlığını kullanmaktır." Durumun yaygın olarak algılandığı , ancak kesinlikle yanlıştır .

İşte Roy Fielding'in (REST'i tanımlayan) kısa bir parçası ...

"Bölüm 6.2.1, içerik pazarlığının her zaman kullanılması gerektiğini söylemez." anmak

Bu özel ileti dizisi 'Kabul Et-Dili:' başlığı bağlamındadır, ancak aynısı 'Kabul et:' başlığı için de aynı şekilde geçerlidir;

"İnsanların neden üst sayfadaki ikinci ve üçüncü bağlantıyı göremediklerini bilmiyorum

http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm

bu iki PDF baskısına işaret ediyor. "

Onun demek istediği, aynı kaynak verinin farklı temsilleri için farklı uç noktaların kullanımında bir sorun olmadığı. (Bu durumda bir .html bitiş noktası ve iki farklı .pdf bitiş noktası.)

Ayrıca benzer bir tartışmada, bu kez sorgu parametrelerini kullanma ve farklı medya türleri için dosya uzantılarını kullanma erdemleriyle ilgili ...

“Bu yüzden her zaman uzantıları tercih ediyorum. Hiçbir seçeneğin REST ile hiçbir ilgisi yok.” anmak

Yine, bu, dosya adı uzantılarına göre Kabul et'den biraz farklıdır, ancak Fielding'in tutumu hala açıktır.

Cevap - bu gerçekten önemli değil. İkisi arasındaki takaslar çok önemli değildir ve her ikisi de kabul edilebilir stillerdir.


3
Harika dengeli cevap. Bazen URI’dan belirli bir içeriğin amaçlandığını 'açıkça' ekleyeceğimi düşünüyorum. örneğin, URI'daki .html uzantısı veya .pdf uzantısı. Ve bu durumda, içerik pazarlığını desteklemeye gerçekten gerek yoktur ve URI'da içeriğin açık olması insanların URI'yı paylaşmasını ve bir şeyleri derhal tüketebilecekleri bir şekilde bağlantı kurmak için kullanmalarını kolaylaştırır. URI'larınızdaki uzantılardan kaçınmak istediğiniz ve / veya json / XML'nin birden çok içerik türünü destekleyen bir web API'sini eşit olarak kullanmak gibi bazı durumlarda, bir kabul başlığı daha uygun olabilir.
Tim Lovell-Smith,

Yeni bağlantılar içerecek şekilde cevap güncellendi. Bence yahoo grupları yapılarını değiştirdi.
Phil Sturgeon

Katılmıyorum. Sunucu tarafından döndürülen kaynak açıklama dili, hizmet bitiş noktası tarafından gerçekleştirilen iş mantığıyla ilgili olmamalıdır. Aynı hizmet bitiş noktası için birden fazla URI'ye sahip olmak, yalnızca farklı kaynak açıklama dillerini barındırmak için, REST URI'lerinin nasıl oluşturulması gerektiğinin yanlış anlaşılması gibi görünüyor.
Dejay Clayton,

10

Uygun resmi RESTful yaklaşım, Accept:başlık kullanmaktır .

Ancak, REST'in gereksinimlerinden biri olan önbelleğe alınabilirliği kırmamaya dikkat etmeniz gerekir. Bunu Vary: Acceptanlayan bir başlık ve önbellek bulundurmanız gerekir. İdeal dünyada buna sahip olabilirsiniz, ancak gerçek hayatta kefaletiniz değişebilir. Yani ikinci çözüm o kadar temiz değil, ama daha pratik olabilir.

Ayrıca, çok eski bazı tarayıcıların, uzantıyı dikkate alarak başlıkları yoksaymak için kullandıklarını unutmayın.


1
Aslında yanlış. Kabul edilen cevaba bakınız.
Phil Sturgeon

9

Teknik olarak gerçekten farketmez - web sunucunuz göründüğü gibi işlemleri uygun bir şekilde geçebilecek. (Bunu varsayıyorum ama bir gösteri sunucusu gibi görünmüyor).

Bununla birlikte, felsefi olarak - ilk yaklaşım tek yaklaşımdır. REST’te, URL aslında yalnızca bir URI’ya işaret eder - bu yalnızca bir kaynaktır. Bir an için bu kaynağı nesne yönelimli programlamadaki nesne ile aynı düşünün . Sen konuş sadece 4 yöntemlerle (diğer adıyla GET / POST / PUT / DELETE -veya şey taşıma izin verdiğini ise) aracılığıyla bu kaynağa ama bu yöntem haline gelmez açıklama nesnenin. Aynı şekilde, dönüş değerinin yönü URI değildir. Nesne hala bir şey ve birşey.xml veya birşey.json değil

Kabul et başlığını kullanmak istemediğinizi varsayalım, ancak felsefi olarak gerçekten REST olmak istiyorsanız, şöyle bir şey umursamıyorum:

GET /api/something?parm1=value1&return_type=xml

aksine

GET /api/something.xml?parm1=value1 (or /api/something.json?param1=value1)

Ama dediğim gibi, bu fark sadece felsefidir.


+1 Dipan, bir şey dışında haklısın: / api / something? Return_type = xml hala dinlendirici değil . RESTful olmama nedeni URL’lerin opak olmasıdır. IOW, protokol bakış açısından, / api / something / xml ve / api / something? Xml arasında bir fark yoktur. W3.org/DesignIssues/Axioms.html dosyasına bakın .
Mark E. Haase,

0

@vartec: Yanlış olduğunu düşünüyorum

Uygun resmi RESTful prensibi, maruz kalan veya başvuruda bulunulan URI olduğu için HTTP başlıklarında hiçbir şeyin gizlenmemesi gerektiğini, istek / yanıtla ilgili tüm ayrıntıların URI'nin bir parçası olarak sunulması gerektiğini söyler.

Bu nedenle, istek ve yanıtla ilgili ayrıntılar için üstbilgi kullanmaktan kaçının ve

 GET /api/something.xml?parm1=value1 (or /api/something.json?param1=value1)

Referansları hızlı bir şekilde bulamıyorum, ancak onlarla birlikte geri göndereceğim (aslında O'reilly yayın kitabına "RESTful web services" ( http://shop.oreilly.com/product/9780596529260.do ) adresinden ulaşabilirsiniz. hangi aynı onaylar


17
-1 Tamamen yanlış. Birincisi, URL , HTTP başlıklarında gönderilir. Ayrıca, her bir ayrı URL, ayrı bir kaynak göstermelidir. Aynı içeriğin XML ve JSON kodlamaları açıkça 2 farklı kaynak değildir; Aynı kaynağın 2 farklı temsilidirler.
Mark E. Haase,

HTTP başlıkları, güvenlik mesajlaşma, korelasyon tanımlayıcı, oturum kimliği, işlem içeriği, veri formatları gibi "mesajlaşma meta verilerini" depolamak için meşru ve tavsiye edilen bir yerdir. Bu tür bir bilgi, URL’lerinizi veya mesaj yükünüzü karıştırmamalıdır.
Paulo Merson
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.