Kiedy wysyłam żądanie POST z treścią JSON do mojej usługi REST, dołączam Content-type: application/json; charset=utf-8
do nagłówka komunikatu. Bez tego nagłówka otrzymuję błąd z usługi. Mogę również z powodzeniem korzystać Content-type: application/json
bez ;charset=utf-8
porcji.
Co dokładnie robi charset=utf-8
? Wiem, że określa kodowanie znaków, ale usługa działa bez niego. Czy to kodowanie ogranicza znaki, które mogą znajdować się w treści wiadomości?
character-encoding
mime-types
DenaliHardtail
źródło
źródło
application/json
, wydaje się, że nie macharset
w ogóle obsługiwanego parametru, choć często jest on dostarczany w praktyce.I know it specifies the character encoding but the service works fine without it.
„działający” nie zawsze oznacza „istniejący kod / konfiguracja jest najbardziej poprawnym sposobem obejmującym wszystkie narożne przypadki, aby wykonać jedną rzecz”. Zależy to od wszystkich konwencji i założeń, które mogą nie działać w innych okolicznościach. Dla mnie osobiście zawsze staram się być tak wyraźny, jak to możliwe.Odpowiedzi:
Nagłówek oznacza po prostu, w co jest zakodowana treść. Niekoniecznie jest możliwe wywnioskowanie rodzaju treści z samej treści, tzn. Nie można po prostu spojrzeć na treść i wiedzieć, co z nią zrobić. Właśnie po to są nagłówki HTTP, mówią odbiorcy, z jakim rodzajem treści (podobno) mają do czynienia.
Content-type: application/json; charset=utf-8
oznacza treść w formacie JSON, zakodowaną w kodowaniu znaków UTF-8. Oznaczenie kodowania jest nieco zbędne dla JSON, ponieważ domyślnym (tylko?) Kodowaniem dla JSON jest UTF-8. Więc w tym przypadku serwer odbierający najwyraźniej jest szczęśliwy wiedząc, że ma do czynienia z JSON i zakłada, że kodowanie jest domyślnie UTF-8, dlatego działa z nagłówkiem lub bez.Nie. Możesz wysłać cokolwiek chcesz w nagłówku i treści. Ale jeśli nie pasują do siebie, możesz uzyskać błędne wyniki. Jeśli określisz w nagłówku, że treść jest zakodowana w UTF-8, ale faktycznie wysyłasz zawartość zakodowaną w Latin1, odbiornik może generować niepotrzebne dane, próbując interpretować dane zakodowane w Latin1 jako UTF-8. Jeśli oczywiście określisz, że wysyłasz dane zakodowane w Latin1 i faktycznie to robisz, to tak, jesteś ograniczony do 256 znaków, które możesz zakodować w Latin1.
źródło
\u20AC
.application/json
musi być w jednym z formatów transformacji ucs. Ponadto, ponieważ pierwsze cztery bajty JSON są ograniczone, zawsze możesz stwierdzić, czy jest to 8, 16 lub 32 i jego endianność.charset=utf-8
ze względów bezpieczeństwa: github.com/shieldfy/API-Security-Checklist/issues/25Aby uzasadnić twierdzenie @ deceze, że domyślnym kodowaniem JSON jest UTF-8 ...
Z IETF RFC4627 :
źródło
"\u0000"
.).xx 00 00 00
nadal jest UTF-32LE ixx 00 xx xx
wciąż jest UTF-16LE,00 xx xx xx
wciąż jest UTF-16BE.Należy pamiętać, że IETF RFC4627 został zastąpiony przez IETF RFC7158 . W sekcji [8.1] cofa tekst cytowany wcześniej przez @Drew, mówiąc:
źródło
Dokładnie zgadzam się z @deceze, ale chcę rozwinąć tę część pytania „otrzymuję błąd z usługi” ,
Otrzymujemy tego rodzaju błędy jako http 415
Kod odpowiedzi klienta na błąd nieobsługiwanego typu HTTP 415 wskazuje, że serwer odmawia przyjęcia żądania, ponieważ format ładunku jest nieobsługiwany.
Problem z formatem może być spowodowany wskazanym typem treści lub kodowaniem treści lub bezpośrednim sprawdzeniem danych.
Innymi słowy, na przykład w https://stackoverflow.com/a/22643964/914284 w tym przykładzie.
źródło
Implementacja Dart http przetwarza bajty dzięki temu „charset = utf-8”, więc jestem pewien, że kilka implementacji tam to obsługuje, aby uniknąć rezerwowego zestawu znaków „latin-1” podczas odczytu bajtów z odpowiedzi. W moim przypadku całkowicie tracę format ciągu znaków odpowiedzi, więc muszę ręcznie kodować bajty do utf8 lub dodać ten parametr „wewnętrzny” nagłówka w odpowiedzi interfejsu API mojego serwera.
źródło
Używałem HttpClient i otrzymywałem nagłówek odpowiedzi z typem treści
application/json
, straciłem znaki, takie jak języki obce lub symbol, który używał Unicode, ponieważ HttpClient jest domyślnie ustawiony na ISO-8859-1 . Tak więc, bądź wyraźny, jak to możliwe, jak wspomniano w @WesternGun, aby uniknąć ewentualnego problemu.Nie ma mowy o tym, że serwer nie obsługuje charset (
method.setRequestHeader("accept-charset", "UTF-8");
) żądanego nagłówka i musiałem pobrać dane odpowiedzi jako bajty rysujące i przekonwertować je na String za pomocą UTF-8. Dlatego zaleca się, aby być jawnym i unikać zakładania wartości domyślnej.źródło