HATEOAS kullanarak bir RESTful Web Hizmeti tasarlarken, bir bağlantıyı tam bir URL (" http: // sunucu: bağlantı noktası / uygulama / müşteriler / 1234 ") yerine yalnızca yol ("/ application / müşteriler / 1234 ")?
HATEOAS kullanarak bir RESTful Web Hizmeti tasarlarken, bir bağlantıyı tam bir URL (" http: // sunucu: bağlantı noktası / uygulama / müşteriler / 1234 ") yerine yalnızca yol ("/ application / müşteriler / 1234 ")?
Yanıtlar:
İnsanlar "göreceli URI" derken ince bir kavramsal belirsizlik vardır.
By RFC 3986 tanımına , genel URI içerir:
URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
hier-part = "//" authority path-abempty
/ path-absolute
/ path-rootless
/ path-empty
foo://example.com:8042/over/there?name=ferret#nose
\_/ \______________/\_________/ \_________/ \__/
| | | | |
scheme authority path query fragment
Zor olan, şema ve otorite ihmal edildiğinde, "yol" kısmının kendisi ya mutlak bir yol (ile başlar /
) ya da "köksüz" bir göreceli yol olabilir. Örnekler:
"http://example.com:8042/over/there?name=ferret"
/over/there
here
veya ./here
veya ../here
veya vb.Öyleyse, soru "bir sunucunun dinlendirici yanıtta göreli yol üretip üretmeyeceği " ise, yanıt "Hayır" dır ve ayrıntı nedeni burada mevcuttur . Bence çoğu insan (beni dahil) "göreli URI" ye karşı aslında "göreli yola" karşıdır.
Ve pratikte çoğu sunucu tarafı MVC framework kolayca oluşturabilir mutlak yolu ile göreli URI gibi /absolute/path/to/the/controller
ve soru "sunucu uygulaması önüne gerekip gerekmediğini olur scheme://hostname:port
mutlak yolun önünde". OP'nin sorusu gibi. Bundan tam olarak emin değilim.
Bir yandan, sunucunun tam bir URI döndürmesinin tavsiye edildiğini düşünüyorum. Bununla birlikte, sunucu hiçbir zaman hostname:port
kaynak kodunun içindeki şeyi bu şekilde kodlamamalıdır (aksi takdirde, mutlak yolla göreli uri'ye geri dönmeyi tercih ederim). Çözüm, sunucu tarafında bu öneki her zaman HTTP isteğinin "Host" başlığından almaktır. Bunun her durumda işe yarayıp yaramadığından emin değilim.
Öte yandan, müşterinin http://example.com:8042
mutlak yolu birleştirmesi çok zahmetli görünmüyor . Sonuçta, istemci isteği sunucuya gönderdiğinde bu düzeni ve etki alanı adını zaten biliyor değil mi?
Sonuçta, diyebilirim ki, mutlak URI, muhtemelen mutlak yol ile göreli URI'ye geri dönüş, asla göreli yol kullanmamanızı tavsiye ederim .
Müşteri kodunu kimin yazdığına bağlıdır. İstemci ve sunucuyu yazıyorsanız, o zaman pek bir fark yaratmaz. URL'leri istemcide veya sunucuda oluşturmanın acısını çekeceksiniz.
Ancak, sunucuyu oluşturuyorsanız ve diğer kişilerin istemci kodu yazmasını bekliyorsanız, tam URI'ler sağlarsanız sizi daha çok seveceklerdir. Göreli URI'leri çözmek biraz zor olabilir. Öncelikle bunları nasıl çözeceğiniz, döndürülen ortam türüne bağlıdır. Html temel etikete sahiptir, Xml her iç içe geçmiş öğede xml: base etiketlerine sahip olabilir, Atom beslemelerinin feed'de bir tabanı ve içerikte farklı bir tabanı olabilir. Müşterinize temel URI hakkında açık bilgi sağlamazsanız, temel URI'yi istek URI'sinden veya belki Content-Location başlığından almaları gerekir! Ve sondaki eğik çizgiye dikkat edin. Temel URI, son eğik çizginin sağındaki tüm karakterler yok sayılarak belirlenir. Bu, izleyen eğik çizginin göreli URI'leri çözümlerken artık çok önemli olduğu anlamına gelir.
Küçük bir değinmeyi gerektiren diğer tek sorun belge boyutudur. Her bir öğenin birden çok bağlantıya sahip olabileceği büyük bir öğe listesi döndürüyorsanız, varlığı sıkıştırmazsanız, mutlak URL'lerin kullanılması varlığınıza önemli miktarda bayt ekleyebilir. Bu mükemmel bir sorundur ve duruma göre önemli olup olmadığına karar vermeniz gerekir.
Uygulamanız ölçeklenirken, yük dengeleme, yük devretme vb. Yapmak isteyebilirsiniz. Mutlak URI'ler döndürürseniz, istemci tarafındaki uygulamalarınız gelişen sunucu yapılandırmanızı takip edecektir.
/xxx/yyy...
) Olarak tanımlamanız ve tam bir URI anlamına gelmemesi koşuluyla (ör. http://api.example.com/xxx/yyy...
).
RayLou'nun trichotomisini kullanma organizasyonum (2) 'yi tercih etmeyi seçti. Birincil neden, XSS (Siteler Arası Komut Dosyası) saldırılarından kaçınmaktır. Sorun şu ki, bir saldırgan sunucudan gelen yanıta kendi URL köklerini enjekte edebiliyorsa, sonraki kullanıcı istekleri (kullanıcı adı ve parolayla kimlik doğrulama isteği gibi) saldırganın kendi sunucusuna iletilebilir *.
Bazıları, yük dengeleme için istekleri başka sunuculara yeniden yönlendirebilme sorununu gündeme getirdi, ancak (bu benim uzmanlık alanım olmasa da) istemcileri açıkça farklı bir yere yönlendirmek zorunda kalmadan yük dengelemeyi etkinleştirmenin daha iyi yolları olduğuna bahse girerim. ana bilgisayarlar.
* Lütfen bu muhakemede herhangi bir kusur olup olmadığını bana bildirin. Amaç elbette tüm saldırıları önlemek değil, en az bir saldırı yolunu engellemektir.
Her zaman tam URL'yi kullanmalısınız. URL'lerin tümünün benzersiz olması gerektiğinden, kaynak için benzersiz tanımlayıcı görevi görür.
Ayrıca tutarlı olmanız gerektiğini de iddia ediyorum. Konum HTTP başlığı, HTTP belirtimine dayalı olarak tam bir URL beklediğinden, tam URL, yeni bir kaynak oluşturulduğunda istemciye Konum başlığında geri gönderilir. Konum başlığında tam bir URL ve ardından yanıt metninizdeki bağlantılarda göreceli URI'ler sağlamanız garip olurdu.
Location
başlık örneğinin verdiği şeydir - URI şemasını veya sunucunun ağ konumunu içermeyen mutlak bir URI. Bağlantılar ve kimlikler genellikle birbirine karıştırılırken aynı şey değildir - ilki bağlamlıdır, ikincisi yoktur.
Büyük API sonuçlarında önemli bir husus, tam URI'yi tekrar tekrar dahil etmenin fazladan ağ yüküdür. İster inanın ister inanmayın, gzip bu sorunu tamamen çözmez (neden olduğundan emin değilim). Bir sonuca yüzlerce bağlantı dahil edildiğinde tam URI'nin ne kadar yer kapladığına şaşırdık.
Mutlak URI kullanmanın bir dezavantajı, api'nin proxy'ye bağlanamamasıdır.
Geri al ... doğru değil. Alan dahil olmak üzere tam bir URL'ye gitmelisiniz.
Profesyonellerle ilgili olarak, bir müşterinin (mutlak) yol için ihtiyaç duyduğu ekstra işlem pahasına iletilecek baytlarda azalma görüyorum. Gzip olarak içerik kodlamayı denedikten sonra bile her baytı kaydetme konusunda çaresizseniz, önbelleğe alma başlıklarının doğru kullanımı, etag'lerin kullanımı ve istemcide koşullu istekler, sonunda bu gerekli olabilir, ancak Çabalarınız başka yerdeydi.
Eksileri ile ilgili olarak, gelecekte kaynaklar arasında müşteri akışını nasıl yönlendirebileceğiniz konusunda bir kontrol kaybı görüyorum (yük dengeleme, A / B testi, ...) ve bunun bir web yönetimiyle ilgili kötü bir uygulama olduğunu düşünüyorum. API. Sağladığınız URL artık müşteri için temelde opak değil ( URI opaklığı hakkında Tim Berners-Lee Web Mimarisi Axioms'a bakın ). Sonunda, yalnızca URL alanınızın yapısıyla ilgili olsa bile, müşterilerinizi API'nizin yaratıcı kullanımlarından memnun tutmaktan sorumlu olursunuz. Açıkça tanımlanmış bir URL değişikliğine izin vermeniz gerekirse , Köprü Metni Uygulama Dili'nde kullanılan URI şablonlarının kullanımını göz önünde bulundurun .