REST API'leri: özel HTTP üstbilgileri ve URL parametreleri


98

Bir REST API'sinin istek bölümünde özel HTTP üstbilgilerini ne zaman kullanırsınız?

Misal:

Hiç kullanır mısın

GET /orders/view 
(custom HTTP header) CLIENT_ID: 23

onun yerine

GET /orders/view/client_id/23 or 
GET /orders/view/?client_id=23

Yanıtlar:


126

URL, kaynağın kendisini gösterir. Bir "müşteri" böylece taban url parçası olmalıdır, ona göre hareket edilebilen bir kaynaktır: /orders/view/client/23.

Parametreler sadece kaynağa erişimi parametreleştirmek içindir. Bu, özellikle mesajların ve aramalarla devreye giriyor: /orders/find?q=blahblah&sort=foo. Parametreleri ve alt kaynaklar arasında ince bir çizgi vardır: /orders/view/client/23/active versus /orders/view/client/23?show=active. Alt kaynak stilini ve aramalar için yedek parametreleri öneririm.

Her uç nokta bir Durum Aktarımını (anımsatıcıyı karıştırmak için) temsil ettiğinden, özel başlıklar yalnızca kaynağın adını (url), kaynağın durumunu (gövde) veya doğrudan parametreleri içermeyen şeyler için kullanılmalıdır. kaynağı etkileyen (parametreler). Bu, özel üstbilgi isteği hakkında gerçek meta verileri bırakır.

HTTP, ihtiyacınız olan her şeyi kapsayan çok çeşitli başlıklara sahiptir. Özel başlıkların ortaya çıktığını gördüğüm yer, bir kullanıcı adına çalışan sistem isteği sistemidir. Proxy sistemi kullanıcıyı doğrular ve X-User: useridbaşlıklara " " ekler ve uç noktaya ulaşmak için sistem kimlik bilgilerini kullanır. Alıcı sistem, sistem kimlik bilgilerinin kullanıcı adına hareket etme yetkisine sahip olduğunu doğrular, ardından kullanıcının eylemi gerçekleştirmeye yetkili olduğunu doğrular.


Böylesine kapsamlı bir cevap için teşekkürler! X-User'ı, kötü bir proxy'ye sahip olma riskinin (üstbilgiyi kaldıran) hala yüksek olduğu bir mobil API için hala kullanıyor musunuz?
Vasile Cotovanu

1
Hayır, bahsettiğim X-User kullanımı, sistemin üçüncü bir şahıs adına hareket ettiği sistem bağlantılarında sistemdedir. Örneğin, Kullanıcı U, Sunucu A ile konuşur. Sunucu A, "Bu eylemi Kullanıcı U adına gerçekleştirme yetkisine sahip olduğumu kontrol etmek için kimlik bilgilerimi kullan" diyen bir X-Kullanıcısı başlığıyla birlikte Kimlik bilgilerini Sunucu B'ye sunar. Bu, Servis Odaklı Mimarilerde ortaya çıkıyor ve genellikle HTTPS kullanıyorsunuz. Bir mobil platform, neredeyse her zaman kullanıcının kendisi olmalıdır ve işlem için uygun birinci şahıs kimlik bilgilerini kullanmalıdır.
Nialscorva

8
Üçüncü paragraf, SO ;-)
Alistair77

1
@Nialscorva Harika açıklama! kullanıcının API'mle yetkili bir kapsayıcı (mobil uygulamam gibi) aracılığıyla etkileşimde bulunmasını istersem ne olur? Şu anda yaptığım şey, mobil uygulamamın kendi başına herhangi bir eylemi gerçekleştirme yetkisine sahip olmaması ve son kullanıcı olmamasıdır .. Kullanıcı bir eylemi gerçekleştirmek istiyorsa, her iki kimlik bilgisi de mevcut olmalıdır.
bolbol

6

Özel başlıklar aşağıdaki avantajlara sahiptir:

  • Ağ araçları / komut dosyaları (kimlik doğrulama, meta bilgi, ...) ile kolayca okunabilir
  • URL'leri güvenlik unsurlarından arındırır (tarayıcı / proxy önbelleklerinde değil, daha güvenlidir)
  • URL'leri daha temiz tutar: kaynakların daha iyi önbelleğe alınmasını sağlar

ayrıca
proxyler

@fusi iyi nokta ... konuyla ilgili konu şu: stackoverflow.com/questions/20820572/…
Christophe Roussy

5

Standart veya kurallara göre bilgi aktarmanın başka bir yolu olmadığında yalnızca özel bir başlık kullanırdım. Darren102, bu değeri aktarmanın tipik yolunu açıklıyor. Api'niz, özel başlıklar kullanarak tipik kalıp dizeleri kullanarak çok daha kolay olacaktır.


Gönülden katılıyorum ... bir görevi başarmanın standart bir yolu varsa, tekerleği asla yeniden icat etmeyin.
Alessandro Santini

5

REST API'nin istek bölümünde ... HTTP başlıklarını ne zaman kullanıyorsunuz?

Kimlik doğrulama: GUID'ler, temel kimlik doğrulama, özel belirteçler, vb. Örneğin, kullanıcı adı / parola yerine REST api için Guid belirteci ile Temel Kimlik Doğrulama

PCI-DSS veya diğer güvenlik kuralları tarafından kapsanan etki alanları arasında belirteçleri veya kimlik doğrulama benzeri diğer bilgileri geçirmeye dahil olursanız, parametreleri de gömmeniz gerekebilir çünkü bazı düzenlemeler, kimlik doğrulama öğelerinin, önemsiz şekilde yeniden oynatılabilecek URL'lerin dışında kalmasını açıkça gerektirebilir. tarayıcı geçmişleri, proxy günlükleri vb.).


1

REST için bir standart yoktur, ancak kabul edilen yol olacaktır

GET /orders/view/23

Özel başlıkları kullanmamak ve dolayısıyla 23 after view id olduğunu varsayar, bu nedenle id'yi alan ve dolayısıyla sadece bu bilgiyi üreten bir işleve sahip olursunuz.


1

Herhangi bir proxy'nin bunları aktarıp aktarmayacağını bilmediğiniz için özel başlıkları kullanmam. URL tabanlı, gitmenin yoludur.

GET / siparişler / görüntüle / müşteri / 23


1
Özel başlıkları da önermem, ancak bozuk proxy'ler bunun nedeni değil. Proxy bozulmuşsa düzeltilmesi gerekir.
Julian Reschke

1

Kesinlikle tamam:

GET /orders/view/client_id/23 or 
GET /orders/view/?client_id=23

Ayrıca tamam:

GET /orders/view/23 or 

Bunun da sorun olmayacağını düşünüyorum:

POST /orders/view 
(custom HTTP header) CLIENT_ID: 23

REST-ful POST yanıtı, Location başlığı "/ orders / view / 23" gibi bir şeye ayarlanmış bir HTTP 303 olmalıdır.
Rich Remer

0

Zarflamanın iyi bir uygulama olmadığını göz önünde bulundurarak, kısmen işlenmiş bir istek hakkında daha fazla bilgi eklemek için özel üstbilgileri kullanabilirsiniz . Başlıklar güvenlidir .

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.