Opisałeś dwa skuteczne sposoby proszenia o wiele języków. Albo powinno działać dobrze. Wybrałbym parametr żądania jawnego języka dla mojego własnego kodu.
TL; DR Backstory
Istnieje nagłówek Accept-Language . Uwaga Accept
nie Accepted
. Jest to standardowa część negocjacji treści HTTP. Odpowiedź zwykle przywraca nagłówek języka treści .
Accept-Language
to oferta otwarcia oferująca zestaw opcji; Content-Language
to rozdzielczość określająca, jaki język został wybrany. Większość Content-Language
odpowiedzi zwraca jeden język, ale istnieje możliwość podania listy języków odpowiedzi oddzielonych przecinkami. Zwykle byłaby to treść mieszana, ale nie ma powodu, dla którego nie mogłaby zasygnalizować wielu rozłącznych alternatyw. Jeśli chciał klienta do żądania wszystkie dostępne języki, nie jest już opcja wieloznaczny prośba *
.
Istnieje już mechanizm nagłówka HTTP, którego można użyć. Uważaj jednak na to, że będziesz prześladować proces negocjacji, który częściej przedstawia szereg możliwych opcji i zwraca jedną opcję. Zmieniłbyś sens na „tutaj jest lista opcji, daj mi je wszystkie!” Jeśli nie masz nic przeciwko, masz rozwiązanie.
Istnieje jednak poważna debata na temat przydatności sygnalizowania parametrów interfejsu API REST w nagłówkach HTTP. To trochę jak wchodzenie do restauracji i zamawianie szczegółowego zamówienia gospodarzowi lub maître d 'zamiast czekania na pojawienie się kelnera lub kelnerki. Może działać i może działać dobrze, np. Jeśli zamówienie skierowane do gospodarza dotyczy napojów lub przekąsek - rzeczy, które gospodarz może szybko zobaczyć lub szybko komunikować się z serwerem. Ale może to być również postrzegane jako naruszenie protokołu, skierowane do niewłaściwego poziomu / warstwy lub do niewłaściwego odtwarzacza.
Drugą alternatywą byłby jawny parametr żądania. Sugerujesz ?all_languages=true
. To wydaje się zbyt szczegółowe. Coś w rodzaju lang=en,fr,es
(zezwól na wiele wymienionych języków) lub lang=*
lub lang=all
(określ każdy dostępny język) wydaje się bardziej ogólne. Można to wyrazić w adresie URL lub treści żądania.
Tak czy inaczej, twoja wielojęzyczna odpowiedź może być łatwo zakodowana w zwrócony ładunek JSON:
[ { "lang": "en", "content": "As Gregor Samsa awoke one morning..." },
{ "lang": "de", "content": "Als Gregor Samsa eines Morgens..." },
...
]
W końcu jedno z tych podejść powinno być dla Ciebie dobre. Oba mogą być postrzegane jako „spójny, dobrze zorganizowany projekt interfejsu API RESTful”. Ustalenie, która opcja jest lepsza, zależy głównie od twojego nastawienia do stosowności piggybackingu (i nieznacznie zmieniającego typowe poczucie) nagłówków negocjacji treści HTTP.
Moje własne preferencje to nie mieszanie nagłówków i innych parametrów jako równych części żądania API. Wyraźny lang
lub language
parametr wydaje mi się czystszy. Ale ponieważ HTTP czasownik (np GET
, PUT
, POST
, PATCH
, ...) jest częścią nagłówka, a także krytyczne / przemieszane z interpretacją wniosek, przyznaję koperta vs. zawartość rozróżnienie jest nieco sztuczny i rozmyte. Podobnie jak w przypadku większości decyzji projektowych, prawdziwi eksperci odpowiadają na to inaczej, a YMMV.