Estou brincando com o JSON há algum tempo, apenas enviando-o como texto e não machucou ninguém (que eu saiba), mas eu gostaria de começar a fazer as coisas corretamente.
Eu vi assim que muitos "padrões" supostamente para o tipo de conteúdo JSON:
application/json
application/x-javascript
text/javascript
text/x-javascript
text/x-json
Mas qual é a correta ou melhor? Entendo que há problemas de segurança e suporte ao navegador que variam entre eles.
Sei que há uma pergunta semelhante: que tipo MIME se JSON está sendo retornado por uma API REST? , mas eu gostaria de uma resposta um pouco mais direcionada.
A IANA registrou o tipo MIME oficial para JSON como
application/json
.Quando perguntado por que não
text/json
, Crockford parece ter dito que o JSON não é realmente JavaScript nem texto, e que a IANA tem maior probabilidade de distribuir doapplication/*
quetext/*
.Mais recursos:
fonte
text/*
seção nos primeiros dias que provavelmente seriam colocadas naapplication/*
seção atualmente.cat file.jpg
por exemplo. Considerando que qualquer arquivo xml ou json é 100% imprimível. Então, acho que o argumento de Stijn de Witt é válido, apesar do fato de que sim, é tarde demais para mudar agora.x
caracteres minúsculos . Não 78. JSON é texto exatamente da mesma maneira que HTML (text / html). Ele contém apenas caracteres de texto legíveis, com significado estruturado neles.Para JSON:
Para JSON-P :
fonte
Obviamente, o tipo de mídia MIME correto para JSON é
application/json
, mas é necessário perceber que tipo de dados é esperado em seu aplicativo.Por exemplo, eu uso o Ext GWT e a resposta do servidor deve ser em texto / html, mas contém dados JSON.
Lado do cliente, ouvinte de formulário Ext GWT
No caso de usar o tipo de resposta application / json , o navegador sugere que eu salve o arquivo.
Fragmento de código-fonte do servidor usando o Spring MVC
fonte
JSON:
A resposta são dados gerados dinamicamente, de acordo com os parâmetros de consulta passados no URL.
Exemplo:
Tipo de conteúdo:
application/json
JSON-P:
JSON com preenchimento. A resposta são dados JSON, com uma chamada de função envolvida.
Exemplo:
Tipo de conteúdo:
application/javascript
fonte
Se você estiver usando o Ubuntu ou o Debian e forneça arquivos .json através do Apache, convém servir os arquivos com o tipo de conteúdo correto. Estou fazendo isso principalmente porque quero usar a extensão JSONView do Firefox
O módulo Apache mod_mime ajudará a fazer isso facilmente. No entanto, com o Ubuntu, você precisa editar o arquivo /etc/mime.types e adicionar a linha
Em seguida, reinicie o Apache:
fonte
Se você estiver chamando o ASP.NET Web Services do lado do cliente, precisará usar
application/json
para que ele funcione. Eu acredito que isso é o mesmo para as estruturas jQuery e Ext .fonte
content-Type: text/plain
,content-Type: application/json
,content-Type: application/json; charset=UTF-8
,contentType: "application/x-www-form-urlencoded; charset=UTF-8"
O tipo de conteúdo certo para JSON é, a
application/json
menos que você esteja usando JSONP , também conhecido como JSON com preenchimento, que na verdade é JavaScript e, portanto, seria o tipo de conteúdo certoapplication/javascript
.fonte
Não há dúvida de que
application/json
é o melhor MIME tipo para uma resposta JSON.Mas tive alguma experiência em que tive que usar
application/x-javascript
devido a alguns problemas de compactação. Meu ambiente de hospedagem é uma hospedagem compartilhada com o GoDaddy . Eles não me permitem alterar as configurações do servidor. Eu adicionei o seguinte código ao meuweb.config
arquivo para compactar respostas.Ao usar isso, as páginas .aspx foram compactadas com g-zip, mas as respostas JSON não. Eu adicionei
nas seções de tipos estático e dinâmico. Mas isso não compacta as respostas JSON.
Depois disso, removi esse tipo recém-adicionado e adicionei
nas seções de tipos estático e dinâmico e alterou o tipo de resposta em
.ashx (manipulador assíncrono) para
E agora descobri que minhas respostas JSON foram compactadas com g-zip. Então, eu pessoalmente recomendo usar
somente se você deseja compactar suas respostas JSON em um ambiente de hospedagem compartilhado . Como na hospedagem compartilhada, eles não permitem alterar as configurações do IIS .
fonte
application/json
, eu aproveitá-lo na minha hospedagem compartilhada e eu não iria sugerir o uso de um tipo de conteúdo diferente para ativar a compactação de qualquer maneira, é simplesmente errado. Isso pode ser feito, mas ainda estará errado. O uso de diferentes tipos de conteúdo para suporte ao navegador é uma coisa, o uso de diferentes tipos de conteúdo para compactação no servidor.Somente ao usar
application/json
como o tipo MIME , tenho o seguinte (a partir de novembro de 2011 com as versões mais recentes do Chrome, Firefox com Firebug ):fonte
Nem tudo funciona para o tipo de conteúdo
application/json
.Se você estiver usando o envio de formulário Ext JS para fazer upload do arquivo, esteja ciente de que a resposta do servidor é analisada pelo navegador para criar o documento para
<iframe>
.Se o servidor estiver usando JSON para enviar o objeto de retorno, o
Content-Type
cabeçalho deverá ser definido comotext/html
solicitar ao navegador que insira o texto inalterado no corpo do documento.Consulte a documentação da API Ext JS 3.4.0 .
fonte
application/json
por especificação.iframe
parece fogoload
evento paraapplication/javascript
,application/x-javascript
,text/javascript
,text/plain
, mas não atirando-o paraapplication/json
nemtext/html
. Atualmente, o Android <= 2.3 representa cerca de 50% da participação no mercado do Android.JSON é uma linguagem específica de domínio (DSL) e um formato de dados independente do JavaScript e, como tal, possui seu próprio tipo MIME
application/json
. Obviamente, o respeito pelos tipos MIME é direcionado ao cliente, o quetext/plain
pode acontecer com a transferência de bytes, mas você pressionaria desnecessariamente a interpretação para o domínio do aplicativo do fornecedor -application/json
. Você transfere XML viatext/plain
?Mas, honestamente, sua escolha do tipo MIME é aconselhar o cliente sobre como interpretar os dados -
text/plain
outext/HTML
(quando não é HTML) é como apagar o tipo - é tão pouco informativo quanto transformar todos os seus objetos do tipo Object em uma linguagem digitada.Nenhum tempo de execução do navegador que eu conheça pegará um documento JSON e o disponibilizará automaticamente para o tempo de execução como um objeto acessível por JavaScript sem intervenção, mas se você estiver trabalhando com um cliente com problemas, isso é uma questão totalmente diferente. Mas essa não é a história toda - os serviços JSON RESTful geralmente não têm tempos de execução do JavaScript, mas não os impedem de usar o JSON como um formato viável de intercâmbio de dados. Se os clientes são tão aleijados ... então eu consideraria talvez a injeção de HTML por meio de um serviço de modelagem do Ajax .
Aplicação / JSON!
fonte
Se você estiver em um ambiente do lado do cliente, é obrigatório investigar sobre o suporte a vários navegadores para um aplicativo Web bem suportado.
O tipo de conteúdo HTTP correto seria
application/json
, como outros já destacados, mas alguns clientes não lidam muito bem com isso, é por isso que o jQuery recomenda o padrãotext/html
.fonte
A resposta correta é:
fonte
Como muitos outros mencionaram,
application/json
é a resposta correta.Mas o que ainda não foi explicado é o que significam as outras opções que você propôs.
application/x-javascript
: O tipo experimental MIME para JavaScript antesapplication/javascript
era padronizado.text/javascript
: Agora obsoleto. Você deve usarapplication/javascript
ao usar javascript.text/x-javascript
: Tipo experimental MIME para a situação acima.text/x-json
: Tipo experimental de MIME para JSON antes deapplication/json
ser oficialmente registrado.Em suma, sempre que você tiver alguma dúvida sobre os tipos de conteúdo, verifique este link
fonte
text/javascript
ficou obsoleto? Ainda estou preenchendo documentos HTML com<script type="text/javascript" ...
tags.type="text/javascript"
e fazer<script>...</script>
pelo menos de acordo com o HTML5.No JSP , você pode usar isso na diretiva de página:
O tipo de mídia MIME correto para JSON é
application/json
. O JSP o utilizará para enviar uma resposta ao cliente.fonte
"
application/json
" É o tipo de conteúdo JSON correto.fonte
O registro IANA para
application/json
dizVocê notará que o IANA.org não lista nenhum desses outros tipos de mídia , na verdade até
application/javascript
agora está obsoleto. Entãoapplication/json
é realmente a única possível correta resposta .O suporte ao navegador é outra coisa.
Os tipos de mídia não padrão mais amplamente suportados são
text/json
outext/javascript
. Mas alguns grandes nomes até usamtext/plain
.Ainda mais estranho é o cabeçalho Content-Type enviado pelo Flickr, que retorna JSON como
text/xml
. O Google usatext/javascript
para algumas das suas APIs do Ajax.Exemplos:
Resultado:
Content-Type: text/javascript
Resultado:
Content-Type: text/xml
fonte
O tipo MIME certo é
application/json
MAS
Eu experimentei muitas situações em que o tipo de navegador ou o usuário da estrutura precisava:
fonte
Eu uso o abaixo
fonte
O cabeçalho Content-Type deve ser definido como ' application / json ' ao postar. O servidor que atende a solicitação deve incluir " Accept = application / json ". No Spring MVC, você pode fazer o seguinte:
Adicione cabeçalhos à resposta:
fonte
No Spring, você tem um tipo definido:
MediaType.APPLICATION_JSON_VALUE
que é equivalente a application / json .fonte
Eu uso esse código para colocar dados em JSON no Google Cloud Storage (GCS), definido publicamente :
Para voltar, os dados são simples:
fonte
Se o JSON estiver com preenchimento, será
application/jsonp
. Se o JSON estiver sem preenchimento, seráapplication/json
.Para lidar com ambos, é uma boa prática usar: 'application / javascript' sem se preocupar se é com preenchimento ou sem preenchimento.
fonte
Para JSON, estou usando:
Isso é descrito na proposta JSON Data Interchange Format 7158 da IETF, seção 1.2: Especificações do JSON .
fonte
Estendendo as respostas aceitas, quando você estiver usando JSON em um contexto REST ...
Há um forte argumento sobre o uso
application/x-resource+json
eapplication/x-collection+json
quando você está representando recursos e coleções REST.E se você decidir seguir a especificação jsonapi , deverá usar
application/vnd.api+json
, conforme documentado.Embora não haja um padrão universal, é claro que a semântica adicionada aos recursos transferidos justifica um Tipo de Conteúdo mais explícito do que apenas
application/json
.Seguindo esse raciocínio, outros contextos poderiam justificar um tipo de conteúdo mais específico .
fonte
application/vnd.api+json
parece ser especificamente para apis usando json: api , uma especificação muito estreita com suas próprias expectativas e formato, não entendo que seja para qualquer API que retorne json. Por favor, corrija-me se estiver errado #Os desenvolvedores de PHP usam isso:
fonte
Se você obtiver dados da API REST em JSON, precisará usar o tipo de conteúdo
fonte
Content-Type: application/json
- jsonContent-Type: application/javascript
- json-PContent-Type: application/x-javascript
- javascriptContent-Type: text/javascript
- javascript MAS obsoletas, versões mais antigas do IE costumavam usar como atributo html.Content-Type: text/x-javascript
- Tipos de mídia JavaScript MAS obsoletosContent-Type: text/x-json
- json antes do aplicativo / json ser registrado oficialmente.fonte
Os formatos JSON (JavaScript Object Notation) e JSONP ("JSON com preenchimento") parecem ser muito semelhantes e, portanto, pode ser muito confuso qual tipo MIME eles devem usar. Mesmo que os formatos sejam semelhantes, existem algumas diferenças sutis entre eles.
Portanto, sempre que tiver alguma dúvida, tenho uma abordagem muito simples (que funciona perfeitamente bem na maioria dos casos), a saber, vá e verifique o documento RFC correspondente.
JSON RFC 4627 (O tipo de mídia application / json para JavaScript Object Notation (JSON)) é uma especificação do formato JSON. Diz na seção 6, que o tipo de mídia MIME para o texto JSON é
JSONP JSONP ("JSON com preenchimento") é tratado de maneira diferente da JSON, em um navegador. O JSONP é tratado como um script JavaScript regular e, portanto, deve usar
application/javascript,
o tipo MIME oficial atual para JavaScript. Em muitos casos, no entanto, otext/javascript
tipo MIME também funcionará bem.Observe que
text/javascript
foi marcado como obsoleto pelo documento RFC 4329 (tipos de mídia de script) e é recomendável usar oapplication/javascript
tipo. No entanto, devido a motivos herdados,text/javascript
ainda é amplamente utilizado e possui suporte para vários navegadores (o que nem sempre é o caso doapplication/javascript
tipo MIME, especialmente em navegadores mais antigos).fonte