Qual é o tipo de conteúdo JSON correto?
já vi por isso muitos pretensos "padrões" para o tipo de conteúdo JSON:
application/json
application/x-javascript
text/javascript
text/x-javascript
text/x-json
Mas qual é o correcto ou o melhor? Parece-me que há questões de segurança e de Apoio ao navegador que variam entre elas.
Sei que há uma pergunta semelhante., qual o tipo MIME se JSON é ser devolvida por uma API de descanso?, mas gostaria de uma resposta um pouco mais específica.
30 answers
Para o texto do JSON:
application/json
O tipo MIME para o texto JSON é
application/json
. A codificação por omissão é UTF-8. (Fonte: RFC 4627 ).
For JSONP (executável javascript) with callback:
Aqui estão alguns posts que foram mencionados nos comentários que são relevantes.
application/javascript
- por que não utilizar
text/html
JSON -
O Internet Explorer às vezes tem problemas com
application/json
(morto 2018-06-26) - uma lista bastante completa dos tipos MIME e para que os usar
- a lista oficial do tipo mime na IANA da resposta de @gnrfan abaixo
A IANA {[7] } registou o tipo MIME oficial da JSON como application/json
.
Quando perguntado sobre por que não text/json
, Crockford parece ter dito que JSON não é realmente JavaScript nem texto e também IANA era mais propenso a distribuir {[[2]} do que text/*
.
Mais recursos:
Claro, o tipo de mídia MIME correto para JSON é {[[2]}, mas é necessário perceber que tipo de dados é esperado em sua aplicação.
Por exemplo, eu uso Ext GWT e a resposta do servidor deve ir como text / html mas contém dados JSON.
lado do cliente, EXT GWT format listener
uploadForm.getForm().addListener(new FormListenerAdapter()
{
@Override
public void onActionFailed(Form form, int httpStatus, String responseText)
{
MessageBox.alert("Error");
}
@Override
public void onActionComplete(Form form, int httpStatus, String responseText)
{
MessageBox.alert("Success");
}
});
No caso de usar o tipo de respostaapplication/json , o navegador sugere-me que salve o ficheiro.
código-fonte do lado do servidor excerto com MVC de Primavera
return new AbstractUrlBasedView()
{
@SuppressWarnings("unchecked")
@Override
protected void renderMergedOutputModel(Map model, HttpServletRequest request,
HttpServletResponse response) throws Exception
{
response.setContentType("text/html");
response.getWriter().write(json);
}
};
JSON:
A resposta é gerada dinamicamente, de acordo com os parâmetros de consulta passados na URL.
Exemplo:
{ "Name": "Foo", "Id": 1234, "Rank": 7 }
Tipo De Conteúdo: application/json
JSON-P:
JSON com enchimento. A resposta é JSON data, com uma chamada de função enrolada em torno dela.Exemplo:
functionCall({"Name": "Foo", "Id": 1234, "Rank": 7});
Tipo De Conteúdo: application/javascript
Se está a usar o Ubuntu ou o Debian e serve .JSON files through Apache, you might want to serve the files with the correct content type. Estou a fazer isto principalmente porque quero usar a extensão Firefox JSONView
O módulo Apache mod_ MIME irá ajudar a fazer isto facilmente. Contudo, com o Ubuntu, terá de editar o ficheiro /etc/mime.tipos e adicionar a linha
application/json json
Depois reinicie o Apache:
sudo service apache2 restart
O tipo de conteúdo correcto para o JSON é application/json
a menos que esteja a usar o JSONP, também conhecido como JSON with Padding, que na verdade é JavaScript e por isso o tipo de conteúdo correcto seria application/javascript
.
Não há dúvida de que application/json
é o melhor MIME tipo para uma resposta JSON.
web.config
para comprimir as respostas.
<httpCompression>
<scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll"/>
<dynamicTypes>
<add mimeType="text/*" enabled="true"/>
<add mimeType="message/*" enabled="true"/>
<add mimeType="application/javascript" enabled="true"/>
<add mimeType="*/*" enabled="false"/>
</dynamicTypes>
<staticTypes>
<add mimeType="text/*" enabled="true"/>
<add mimeType="message/*" enabled="true"/>
<add mimeType="application/javascript" enabled="true"/>
<add mimeType="*/*" enabled="false"/>
</staticTypes>
</httpCompression>
<urlCompression doStaticCompression="true" doDynamicCompression="true"/>
Usando isto, o ...as páginas aspx foram comprimidas com g-zip, mas as respostas JSON não foram. I adicionado
<add mimeType="application/json" enabled="true"/>
Nas secções estáticas e dinâmicas. Mas isto não comprime as respostas do JSON.
Depois disso removi este novo tipo e adicionei
<add mimeType="application/x-javascript" enabled="true"/>
Tanto nas secções estáticas como dinâmicas, e alterou o tipo de resposta em
.ashx (manipulador assíncrono) a
application/x-javascript
E agora descobri que as minhas respostas JSON foram comprimidas com G-zip. Por isso, recomendo pessoalmente a utilização de
application/x-javascript
Só se quiseres. comprimir as suas respostas JSON num ambiente de hospedagem partilhado . Porque em Hospedagem Compartilhada, eles não permitem que você mude as configurações IIS.
Apenas quando utilizar application/json
como MIME tipo eu tenho o seguinte (a partir de novembro de 2011, com as versões mais recentes do Chrome, Firefox com Firebug):
- acabaram-se os avisos do Chrome quando o JSON é carregado a partir do servidor. O Firebug irá adicionar uma página à resposta que mostra os dados do JSON. formatado. Se o tipo MIME é diferente, ele só vai aparecer como "Teor de resposta".
Nem tudo funciona para o tipo de Conteúdo application/json
.
Se estiver a utilizar Ext JS form submit to upload file, tenha em atenção que a resposta do servidor é processada pelo navegador para criar o documento para o <iframe>
.
Se o servidor estiver a usar o JSON para enviar o objecto de retorno, então o cabeçalho Content-Type
deve ser definido para text/html
de modo a dizer ao navegador para inserir o texto inalterado no corpo do documento.
O JSON é uma linguagem específica ao Domínio (DSL) e um formato de dados independente do JavaScript, e como tal tem o seu próprio MIME Tipo, application/json
. O respeito pelos tipos MIME é, obviamente, conduzido pelo Cliente, pelo que text/plain
pode fazer a transferência de 'bytes', mas então você estaria a aumentar a interpretação para o domínio da aplicação do Fornecedor desnecessariamente - application/json
. Você transferiria XML via text/plain
?
text/plain
ou text/HTML
(quando não é HTML) é como o tipo apagamento - é tão desinformativo como fazer todos os seus objetos de tipo objeto em uma linguagem tipada.
Nenhum tempo de execução do navegador que eu conheça irá pegar num documento JSON e torná-lo automaticamente disponível para o tempo de execução como um objeto acessível JavaScript sem intervenção, mas se você está trabalhando com um cliente aleijado, isso é uma questão completamente diferente. Mas essa não é a história toda- repousante Os serviços JSON muitas vezes não têm JavaScript mas isso não os impede de usar o JSON como um formato de intercâmbio de dados viável. Se os clientes são assim tão aleijados... então eu consideraria talvez a injeção de HTML através de um serviço de templateAjax .
Aplicação/JSON!
Se estiver num ambiente do lado do cliente, investigar o suporte do navegador cruzado é obrigatório para uma aplicação web bem suportada.
O tipo de conteúdo HTTP certo seria {[[0]}, como outros já realçados também, mas alguns clientes não lidam muito bem com isso, é por isso que o jQuery recomenda o padrão text/html
.
A resposta correcta é:
Content-Type: application/json
Como muitos outros já mencionaram, application/json
é a resposta correcta.
application/x-javascript
: tipo MIME Experimental para JavaScript antes deapplication/javascript
ter sido feito padrão.text/javascript
: agora obsoleto. Deve usarapplication/javascript
ao usar javascript.text/x-javascript
: tipo MIME Experimental para a situação acima.text/x-json
: tipo MIME Experimental para o JSON antes do registo oficial.
Em suma, sempre que tiver dúvidas sobre os tipos de conteúdo, deve verificar este link
"application/json
" é o tipo de conteúdo JSON correto.
def ajaxFindSystems = {
def result = Systems.list()
render(contentType:'application/json') {
results {
result.each{sys->
system(id:sys.id, name:sys.name)
}
}
resultset (rows:result.size())
}
}
O registo IANA para application/json
diz:
Vais reparar que ... IANA.org não enumera nenhuma destas outras tipos de mídia , de fato atéAplicações que usam este tipo de suporte: o JSON foi usado para intercâmbio de dados entre aplicações escritas em todas estas linguagens de programação: ActionScript, C, C#, Clojure, ColdFusion, Common Lisp, e, Erlang, Go, Java, JavaScript, Lua, Objective CAML, Perl, PHP, Python, Rebol, Ruby, Scala e Scheme.
application/javascript
está agora obsoleto. Então application/json
é realmente a única resposta possível correcta.
O Suporte do navegador é outra coisa.
Os tipos de mídia não-padrão mais amplamente suportados são text/json
ou text/javascript
. Mas alguns grandes nomes até usam text/plain
.
Ainda mais estranho é o cabeçalho do tipo de conteúdo enviado pelo Flickr, que devolve JSON como text/xml
. O Google usa text/javascript
algumas das apis do ajax.
Exemplos:
curl -I "https://ajax.googleapis.com/ajax/services/search/video?v=1.0&q=jsonexample"
Resultado: Content-Type: text/javascript
curl -I "https://www.flickr.com/services/rest/?method=flickr.test.echo&format=json&api_key=f82254c1491d894f1204d8408f645a93"
Resultado: Content-Type: text/xml
O tipo MIME certo é application/json
MAS
Experimentei muitas situações em que o tipo de browser ou o utilizador do framework necessitavam:
text/html
application/javascript
Eu uso o abaixo
contentType: 'application/json',
data: JSON.stringify(SendData),
O cabeçalho Content-Type deve ser definido em 'application/json' ao publicar. O servidor que ouve o pedido deve incluir " Accept=application / json ". Na primavera MVC você pode fazer isso assim:
@RequestMapping(value="location", method = RequestMethod.POST, headers = "Accept=application/json")
Adicionar cabeçalhos à resposta:
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json");
O
application/json
funciona muito bem no PHP para armazenar um array ou um objecto dado.
Uso este código para colocar dados no JSON em Google Cloud Storage (GCS)) que é visível publicamente :
$context = stream_context_create([
'gs' => [
'acl'=>'public-read',
'Content-Type' => 'application/json',
]
]);
file_put_contents(
"gs://BUCKETNAME/FILENAME.json",
json_encode((object) $array),
false,
$context
);
Para obter de volta os dados são para a frente:
$data = json_decode(file_get_contents("gs://BUCKETNAME/FILENAME.json"));
Se o JSON estiver com enchimento, então será {[[0]}. Se o JSON estiver sem enchimento então será application/json
.
Para lidar com ambos, é uma boa prática usar: 'application / javascript' sem se preocupar se é com enchimento ou sem enchimento.
Para o JSON, estou a usar:
Content-Type: application/json
Esta informação encontra-se descrita no formato de intercâmbio de dados JSON do IETF, 7158 proposta, ponto 1.2: especificações do JSON.
Os programadores do PHP usam isto:
<?php
header("Content-type: application/json");
// Do something here...
?>
Alargar as respostas aceites, quando se está a usar o JSON num contexto de descanso...
Existe um argumento forte sobre o uso de {[[0]} e application/x-collection+json
quando você está a representar os recursos de repouso e as colecções.
E se decidir seguir a especificação jsonapi , deve Utilizar application/vnd.api+json
, Tal como está documentado.
application/json
.
Seguindo este raciocínio, outros contextos poderiam justificar um tipo de conteúdo mais específico .
Se obtiver dados da API REST em JSON, terá de utilizar o tipo de conteúdo
For JSON data: Content-Type:application/json
For HTML data: Content-Type:text/html,
For XHTML data: Content-Type:application/xhtml+xml,
For XML data: Content-Type:text/xml, application/xml
JSON (notação de objeto JavaScript) e JSONP ("JSON with padding") formatos parece ser muito semelhante e por isso pode ser muito confuso qual o tipo MIME que eles devem estar usando. Mesmo que os formatos parecem ser muito semelhantes, há algumas diferenças sutis entre eles.
Por isso, sempre que tiver dúvidas, tenho uma abordagem muito simples (que funciona perfeitamente na maioria dos casos), a saber, ir e verificar o RFC correspondente. documento.JSON RFC 4627 (o tipo de mídia application / json para notação de objeto JavaScript (JSON)) é uma especificação do formato JSON. Diz na secção 6 que o tipo de mídia MIME para o texto JSON é
application/json.
JSONP
JSONP ("JSON with padding") é tratado de forma diferente do JSON, em um navegador. JSONP é tratado como um script JavaScript regular e por isso deve usar application/javascript,
o tipo MIME oficial atual para JavaScript. Em muitos casos, no entanto, text/javascript
o tipo MIME também funcionará bem.
Note que text/javascript
foi marcado como obsoleto pelo documento RFC 4329 (Scripting Media Types) e recomenda-se a utilização do tipo application/javascript
. No entanto, devido a razões antigas, text/javascript
ainda é amplamente utilizado e tem suporte de navegador cruzado (o que nem sempre é um caso com application/javascript
tipo MIME, especialmente com navegadores mais antigos).
Content-type: application/json
- json
Content-Type: application/javascript
- json-P
Content-type: application/x-javascript
- javascript
Content-type: text/javascript
- javascript BUT obsolete, IE versões mais antigas usadas para usar como atributo html.
Content-type: text/x-javascript
- tipos de suportes JavaScript mas obsoletos
Content-type: text/x-json
- o json antes da candidatura/json foi oficialmente registado.