Quando faço uma solicitação POST com um corpo JSON para o meu serviço REST, incluo Content-type: application/json; charset=utf-8
no cabeçalho da mensagem. Sem esse cabeçalho, recebo um erro do serviço. Eu também posso usar com sucesso Content-type: application/json
sem a ;charset=utf-8
parte.
O que exatamente faz charset=utf-8
? Eu sei que especifica a codificação de caracteres, mas o serviço funciona bem sem ele. Essa codificação limita os caracteres que podem estar no corpo da mensagem?
character-encoding
mime-types
DenaliHardtail
fonte
fonte
application/json
Registro de tipo de mídia da IANA , não parece haver nenhumcharset
parâmetro suportado , embora seja frequentemente fornecido na prática.I know it specifies the character encoding but the service works fine without it.
"trabalhar" nem sempre significa "o código / configuração existente é a maneira mais correta de cobrir todos os casos de canto para fazer uma coisa". Depende de todas as convenções e premissas que podem não funcionar em outras circunstâncias. Para mim, pessoalmente, sempre tento ser o mais explícito possível.Respostas:
O cabeçalho apenas indica em que o conteúdo está codificado. Não é necessariamente possível deduzir o tipo de conteúdo do próprio conteúdo, ou seja, você não pode necessariamente olhar apenas para o conteúdo e saber o que fazer com ele. É para isso que servem os cabeçalhos HTTP, eles dizem ao destinatário que tipo de conteúdo eles estão (supostamente) lidando.
Content-type: application/json; charset=utf-8
designa o conteúdo para estar no formato JSON, codificado na codificação de caracteres UTF-8. A designação da codificação é um pouco redundante para JSON, pois a codificação padrão (apenas?) Para JSON é UTF-8. Portanto, nesse caso, o servidor de recebimento aparentemente fica feliz sabendo que está lidando com JSON e assume que a codificação é UTF-8 por padrão, é por isso que funciona com ou sem o cabeçalho.Não. Você pode enviar o que quiser no cabeçalho e no corpo. Mas, se os dois não corresponderem, você poderá obter resultados errados. Se você especificar no cabeçalho que o conteúdo é codificado em UTF-8, mas na verdade você está enviando conteúdo codificado em Latin1, o destinatário poderá produzir dados de lixo, tentando interpretar os dados codificados em Latin1 como UTF-8. Se, é claro, você especificar que está enviando dados codificados em Latin1 e realmente o está fazendo, então sim, você está limitado aos 256 caracteres que pode codificar em Latin1.
fonte
\u20AC
.application/json
precisa estar em um dos formatos de transformação do ucs. Além disso, como os quatro primeiros bytes do JSON são limitados, você sempre pode saber se são 8, 16 ou 32 e se há endianidade.charset=utf-8
por motivos de segurança: github.com/shieldfy/API-Security-Checklist/issues/25Para comprovar a afirmação de @ deceze de que a codificação JSON padrão é UTF-8 ...
De IETF RFC4627 :
fonte
"\u0000"
).xx 00 00 00
ainda é UTF-32LE exx 00 xx xx
ainda é UTF-16LE,00 xx xx xx
ainda é UTF-16BE.Observe que o IETF RFC4627 foi substituído pelo IETF RFC7158 . Na seção [8.1], ele retrai o texto citado por @Drew anteriormente, dizendo:
fonte
Concordo exatamente com o @deceze, mas quero desenvolver essa parte da pergunta "Recebo um erro do serviço" ,
Estamos recebendo esse tipo de erro como http 415
O código de resposta de erro do cliente Tipo de mídia não suportado HTTP 415 indica que o servidor se recusa a aceitar a solicitação porque o formato da carga útil está em um formato não suportado.
O problema de formato pode ser devido ao Tipo de Conteúdo ou Codificação de Conteúdo indicado pela solicitação ou como resultado da inspeção direta dos dados.
Em outras palavras, como visto em https://stackoverflow.com/a/22643964/914284 neste exemplo.
fonte
A implementação do http dardo processa os bytes graças a esse "charset = utf-8", por isso tenho certeza de que várias implementações suportam isso, para evitar o charset de retorno "latin-1" ao ler os bytes da resposta. No meu caso, perco totalmente o formato na string do corpo da resposta, portanto, tenho que fazer a codificação de bytes manualmente para utf8 ou adicionar esse parâmetro "interno" do cabeçalho na resposta da API do meu servidor.
fonte
Eu estava usando HttpClient e voltando ao cabeçalho de resposta com o tipo de conteúdo
application/json
, perdi caracteres como idiomas estrangeiros ou símbolo que usava unicode, pois o HttpClient é o padrão ISO-8859-1 . Portanto, seja explícito quanto possível, conforme mencionado por @WesternGun para evitar qualquer possível problema.Não há como lidar com isso devido ao servidor não manipular o cabeçalho solicitado charset (
method.setRequestHeader("accept-charset", "UTF-8");
) para mim e eu tive que recuperar dados de resposta como bytes de desenho e convertê-los em String usando UTF-8. Portanto, é recomendável ser explícito e evitar a suposição do valor padrão.fonte