RESTful API ve i18n: Yanıt nasıl tasarlanır?


15

Esas olarak tek bir müşterinin ihtiyaçlarını karşılamaya yönelik RESTful API tasarlıyoruz. Çok özel koşulları nedeniyle, bu müşteri mümkün olduğunca az istekte bulunmalıdır.

API, i18n'yi isteklerde bir Accept-Language üstbilgisi aracılığıyla işler. Bu, istemcinin bir isteğin yanıtlarını kullanılabilir tüm yerel ayarlarda depolaması gereken bir özellik dışında istemcinin yapması gereken her şey için geçerlidir.

Bir şekilde API'yı, müşterinin tüm bu bilgileri tek bir istekle ve tutarlı, iyi yapılandırılmış bir RESTful API tasarımını kırmadan alabilmesini sağlayacak şekilde tasarlayabilir miyiz?

Şimdiye kadar düşündüğümüz seçenekler:

  • Accept-Language üstbilgisine birden fazla yerel ayar eklenmesine izin vermek ve yanıtta istenen her yerel ayar için her biri ISO 639-1 dil koduyla anahtar olarak tanımlanan yerelleştirilmiş sürümler eklemek.
  • Bu uç noktaya "? All_languages ​​= true" parametresi gibi bir şey oluşturma ve bu parametre varsa yanıttaki tüm kullanılabilir yerel ayarlar için yerelleştirilmiş sürümleri döndürme.
  • (Yukarıdakilerin hiçbiri bizim için işe yaramıyorsa) istemciden tüm yerelleştirilmiş sürümleri almak için birden fazla istekte bulunuyor.

Hangisi en iyi alternatif?

Yanıtlar:


22

Birden çok dil istemenin iki etkili yolunu tanımladınız. Her ikisi de iyi çalışmalıdır. Kendi kodum için açık dil isteği parametresini seçerdim.

TL; DR Backstory

Bir Accept-Language başlığı vardır . Not, Acceptdeğil Accepted. HTTP içerik anlaşmasının standart bir parçasıdır. Yanıt genellikle bir Content-Language üstbilgisini geri ayarlar .

Accept-Languagebir dizi seçenek sunan açılış teklifidir; Content-Languagehangi dilin seçildiğini belirten çözümdür. Çoğu Content-Languageyanıt tek bir dil döndürür, ancak yanıt dillerinin virgülle ayrılmış bir listesini sağlama seçeneği vardır. Genellikle bu karışık içeriktir, ancak birden fazla ayrık alternatifi gösterememesinin bir nedeni yoktur. İstemcinin kullanılabilir tüm dilleri istemesini istiyorsanız, zaten bir joker karakter isteği seçeneği vardır *.

Bu nedenle, kullanabileceğiniz bir HTTP başlık mekanizması zaten var. Bununla birlikte, bir dizi olası seçeneği sunan ve tek bir seçeneği geri alan bir müzakere sürecini piggyback yapacağınıza dikkat edin. "İşte bir seçenekler listesi, hepsini bana ver!" Eğer bu konuda bir fikriniz yoksa bir çözümünüz var.

Bununla birlikte, HTTP başlıklarında REST API parametrelerini sinyallemenin uygunluğu konusunda önemli tartışmalar vardır. Bu biraz garson veya garson görünmesini beklemek yerine, bir restoran girmek ve ana veya maître d 'için ayrıntılı sipariş bulanıklaştırma gibi. Çalışabilir ve örneğin, ana bilgisayara yönelik sipariş içecekler veya mezeler ile ilgiliyse iyi olabilir - ana bilgisayarın hızlı bir şekilde görebileceği veya sunucunuzla hızlı bir şekilde iletişim kurabileceği şeyler. Ancak, yanlış düzeyde / katmanda veya yanlış oyuncuya yönelik bir protokol ihlali olarak da görülebilir.

İkinci bir alternatif, açık bir istek parametresi olacaktır. Sen öner ?all_languages=true. Bu çok spesifik görünüyor. Böyle bir şey lang=en,fr,es(çoklu listelenmiş dilleri izin verilir) veya lang=*veyalang=all (mevcut her dil belirtin) daha genel görünüyor. Bu, URL'de veya istek gövdesinde ifade edilebilir.

Her iki durumda da, çok dilli yanıtınız iade edilen JSON yüküne kolayca kodlanabilir:

[ { "lang": "en", "content": "As Gregor Samsa awoke one morning..." },
  { "lang": "de", "content": "Als Gregor Samsa eines Morgens..." },
  ...
]

Sonunda, bu yaklaşımlardan herhangi birinin sizin için iyi çalışması gerekir. Her ikisi de "tutarlı, iyi yapılandırılmış RESTful API tasarımı" olarak görülebilir. Hangisinin daha iyi olduğu konusundaki kararlılık, çoğunlukla, piggybacking'in (ve tipik duygusunun hafifçe değiştirilmesinin) HTTP içerik anlaşması başlıklarının uygunluğuna yönelik tutumunuza dayanır.

Kendi tercihi olmaktır değil İntermiks başlıkları ve bir API isteği eşit parçaya gibi diğer parametreler. Açık langveya languageparametre benim için daha temiz görünüyor. Ama bu yana HTTP fiil (örneğin GET, PUT, POST, PATCH, ...) başlığının parçasıdır ve hiç / istek yorumlanması karışmış da kritik, ben zarf vs içeriği ayrım biraz yapay ve bulanık olduğunu kabul ediyorum. Çoğu tasarım kararında olduğu gibi, gerçek uzmanlar buna farklı cevap verir ve YMMV.


Tepkileri çok eğitici ve bilgilendirici oldu. Teşekkür ederim. Kabul Edilemez şeyi fark ettiğiniz için de teşekkür ederiz. Kodumuzda doğrudur, ancak daha sonra yazı yazarken uygun terimi kullanamadım. Daha fazla referans için değiştireceğim.
AMM
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.