Qual é o tipo correto de conteúdo JSON?
-
20-08-2019 - |
Pergunta
Eu estive brincando com JSON por algum tempo, apenas empurrando-o para fora como texto e tem alguém se machucar (que eu saiba), mas eu gostaria de começar a fazer as coisas corretamente.
Eu vi para muitos supostos "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 correto, ou melhor? Percebi que há segurança e navegador problemas de suporte que variam entre eles.
Eu sei que há uma pergunta semelhante, tipo que MIME se JSON está sendo retornado por uma API REST? , mas eu gostaria de uma resposta um pouco mais direcionada.
Solução
Outras dicas
IANA tem registado o tipo de oficial MIME para JSON como application/json
.
Quando perguntado sobre por que não text/json
, Crockford parece ter dito JSON não é realmente JavaScript nem texto e também IANA foi mais propensos a mão application/*
que text/*
.
Mais recursos:
É claro, o tipo de mídia MIME correto para JSON é application/json
, mas é necessário perceber que tipo de dados está prevista para a sua aplicação.
Por exemplo, eu uso Ext GWT e a resposta do servidor deve ir como text / html , mas contém dados JSON.
do lado do cliente, Ext GWT forma ouvinte
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 utilizar application / json tipo de resposta, o navegador sugere-me para salvar o arquivo.
código fonte do lado do servidor snippet usando Spring MVC
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:
Response é gerado dinamicamente dados, de acordo com os parâmetros de consulta passados ??na URL.
{ "Name": "Foo", "Id": 1234, "Rank": 7 }
Content-Type: application/json
JSON-P:
JSON com estofamento. Resposta é dados JSON, com uma chamada de função envolvida em torno dela.
functionCall({"Name": "Foo", "Id": 1234, "Rank": 7});
Content-Type: application/javascript
Se você estiver usando o Ubuntu ou Debian e você servir .json arquivos através de Apache, você pode querer servir os arquivos com o tipo de conteúdo correto. Estou fazendo isso principalmente porque eu quero usar a extensão do Firefox JSONView
O Apache módulo mod_mime vai ajudar a fazer isso facilmente. No entanto, com o Ubuntu você precisa editar o arquivo /etc/mime.types e adicione a linha
application/json json
Em seguida, reinicie o Apache:
sudo service apache2 restart
Se você está chamando ASP.NET Web Services a partir do lado do cliente o que você tem a utilização application/json
para que ele funcione. Eu acredito que este é o mesmo para o jQuery e quadros Ext .
O tipo de conteúdo certo para JSON é application/json
menos que você está usando href="http://en.wikipedia.org/wiki/JSONP"> JSONP, também conhecido como JSON com padding, que é, na verdade, JavaScript e assim o tipo de conteúdo certo seria application/javascript
.
Não há dúvida de que application/json
é o melhor MIME tipo para uma resposta JSON.
Mas eu tinha alguma experiência em que eu tive que usar application/x-javascript
por causa de alguns problemas de compressão. Meu ambiente de hospedagem é de hospedagem compartilhada com GoDaddy . Eles não me permite alterar configurações de servidor. Eu tinha adicionado o seguinte código para o meu arquivo web.config
para comprimir 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 isso, as páginas .aspx foi comprimido com g-zip, mas respostas JSON não eram. Eu adicionei
<add mimeType="application/json" enabled="true"/>
nas seções estáticas e tipos dinâmicos. Mas isso não comprimir respostas JSON em tudo.
Depois disso, removida deste tipo recentemente adicionado e adicionado
<add mimeType="application/x-javascript" enabled="true"/>
tanto na estática e seções tipos dinâmicos, e mudou o tipo de resposta em
.ashx (manipulador assíncrono) para
application/x-javascript
E agora eu descobri que minhas respostas JSON foram comprimido com g-zip. Então, eu, pessoalmente, recomendo a utilização
application/x-javascript
apenas se você deseja compactar suas respostas JSON em um ambiente de hospedagem compartilhada . Porque em hospedagem compartilhada, eles não permitem que você mude IIS configurações.
Apenas quando utilizar application/json
como a MIME digite eu tenho a seguinte (em Novembro de 2011 com as versões mais recentes em Chrome, Firefox com Firebug ):
- Não há mais avisos de Chrome quando o JSON é carregado a partir do servidor.
- Firebug irá adicionar uma guia para a resposta mostrando-lhe os dados JSON formatado. Se o tipo de MIME é diferente, ela só vai aparecer como 'Conteúdo Response'.
Nem tudo funciona para tipo de conteúdo application/json
.
Se você estiver usando Ext JS envio de formulário para fazer o upload de arquivos, estar ciente de que a resposta do servidor é analisado pelo navegador para criar o documento para o <iframe>
.
Se o servidor estiver usando JSON para enviar o objeto de retorno, então o cabeçalho Content-Type
deve ser definido como text/html
, a fim de dizer ao navegador para inserir o texto inalterado no corpo do documento.
JSON é um linguagem específica de domínio (DSL) e um independente formato de dados de JavaScript, e como tal tem a sua própria MIME digita, application/json
. Respeito pelos tipos MIME é de cliente curso dirigido, de modo text/plain
pode fazer por transferência de bytes, mas então você estaria empurrando para cima interpretação ao domínio de aplicação fornecedor desnecessariamente - application/json
. Você transferir XML via text/plain
?
Mas, honestamente, a escolha do tipo MIME é um conselho para o cliente como para como interpretar o text/plain
data- ou text/HTML
(quando não HTML é) é como tipo erasure- é tão informativo quanto fazer todos os seus objetos do tipo de objeto em uma linguagem digitada.
No navegador runtime eu conheço vai demorar um documento JSON e automaticamente torná-lo disponível para o tempo de execução como um objeto acessível JavaScript sem intervenção, mas se você estiver trabalhando com um cliente aleijado, que é um assunto completamente diferente. Mas isso não é toda a serviços história- RESTful JSON muitas vezes não têm tempos de execução de JavaScript, mas ele não pára -los usando JSON como formato de intercâmbio de dados viável. Se os clientes são que aleijou ... então eu consideraria talvez injeção HTML através de uma Ajax serviço de templates em seu lugar.
Aplicação / JSON!
Se você estiver em um ambiente do lado do cliente, investigando sobre o suporte cross-browser é obrigatório para uma aplicação web bem suportado.
O HTTP direito Content-Type seria application/json
, como outros já destacado também, mas alguns clientes não lidar com isso muito bem, é por isso que jQuery recomenda a text/html
padrão.
A resposta correta é:
Content-Type: application/json
Como muitos outros já mencionado, application/json
é a resposta correta.
Mas o que ainda não foram ainda explicado é o que as outras opções que você propôs média.
-
application/x-javascript
:. Tipo Experimental MIME para JavaScript antesapplication/javascript
foi feito padrão -
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
:. Experimental MIME tipo para JSON antesapplication/json
foi oficialmente registrada
Ao todo, sempre que você tem alguma dúvida sobre tipos de conteúdo, você 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 IANA inscrições para application/json
diz
As aplicações que utilizam este tipo de mídia: JSON tem sido usado para a troca de dados entre aplicações escritas em todos estes linguagens de programação: ActionScript, C, C #, Clojure, ColdFusion, Lisp comum, E, Erlang, Go, Java, JavaScript, Lua, CAML Objetivo, Perl, PHP, Python, Rebol, Ruby, Scala, e Scheme.
Você notará que IANA.org não lista qualquer um esses outros tipos de mídia , de fato, mesmo application/javascript
agora está obsoleta. Então application/json
é realmente a única possível correta ??em> resposta.
O suporte ao navegador é outra coisa.
Os tipos de mídia não-padrão mais amplamente aceitos são text/json
ou text/javascript
. Mas alguns grandes nomes mesmo usar text/plain
.
Ainda mais estranho é o cabeçalho Content-Type enviado pelo Flickr, que retorna JSON como text/xml
. Google usa text/javascript
para algumas das suas APIs Ajax.
Exemplos:
curl -I "https://ajax.googleapis.com/ajax/services/search/video?v=1.0&q=jsonexample"
Saída: Content-Type: text/javascript
curl -I "https://www.flickr.com/services/rest/?method=flickr.test.echo&format=json&api_key=f82254c1491d894f1204d8408f645a93"
Saída: Content-Type: text/xml
O tipo MIME direita é application/json
MAS
Eu experimentei muitas situações em que o tipo de navegador ou o usuário quadro necessário:
text/html
application/javascript
Eu uso a seguir
contentType: 'application/json',
data: JSON.stringify(SendData),
O Content-Type cabeçalho deve ser definido como ' application / json ' quando postagem. escuta servidor para a solicitação deve incluir " Aceitar = application / json ". Em Spring MVC que você pode fazê-lo como este:
@RequestMapping(value="location", method = RequestMethod.POST, headers = "Accept=application/json")
Adicionar cabeçalhos para a resposta:
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json");
Na Primavera você tem um tipo definido: MediaType.APPLICATION_JSON_VALUE
o que equivale a application / JSON .
O
application/json
funciona muito bem em PHP para armazenar uma matriz ou objeto dados.
Eu uso este código para colocar os dados em JSON em Google Cloud Storage (GCS) que é definido publicamente visível :
$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 voltar a dados é direto:
$data = json_decode(file_get_contents("gs://BUCKETNAME/FILENAME.json"));
Se o JSON é com estofamento em seguida, será application/jsonp
. Se o JSON é sem preenchimento, então será application/json
.
Para lidar com ambos, é uma boa prática para uso: 'application / javascript' sem se preocupar se é com estofamento ou sem preenchimento
.Para JSON, eu estou usando:
Content-Type: application/json
Isto é descrito em JSON Data Interchange Format proposta 7158 da IETF, Seção 1.2: Especificações de JSON .
Estendendo as respostas aceitas, quando você estiver usando JSON em um contexto RESTO ...
Há um forte argumento sobre o uso application/x-resource+json
e application/x-collection+json
quando você está representando recursos descanso e coleções.
E se você decidir seguir o jsonapi especificação, você deve uso de application/vnd.api+json
, como é documentado.
Altough não existe um padrão universal, é claro que o agregado semântica para os recursos sendo transferidos justificar uma mais explícita Content-Type do que apenas application/json
.
Seguindo este raciocínio, outros contextos poderiam justificar uma mais específica Content-Type .
desenvolvedores PHP usar este:
<?php
header("Content-type: application/json");
// Do something here...
?>
Se você receber dados de API REST em JSON assim que você tem que usar 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 (JavaScript Object Notation) e JSONP ( 'JSON com estofamento') formatos parece ser muito similar e, portanto, ele pode ser muito confuso que MIME tipo deveriam estar usando. Mesmo que os formatos são semelhantes, existem algumas diferenças sutis entre eles.
Assim, sempre que em qualquer dúvida, eu tenho uma abordagem muito simples (que funciona perfeitamente bem na maioria dos casos), ou seja, ir e verificar documento RFC correspondente.
JSON RFC 4627 (The application / json tipo de mídia para JavaScript Object Notation (JSON)) é um especificações do formato JSON. Ele diz no capítulo 6, que o tipo de mídia MIME para o texto JSON é
application/json.
JSONP
JSONP ( "JSON com estofamento") é tratado maneira diferente do que JSON, em um navegador. JSONP é tratada como uma escrita regular JavaScript e, portanto, ele deve usar application/javascript,
o tipo MIME oficial atual para JavaScript. Em muitos casos, no entanto, text/javascript
tipo MIME irá funcionar bem também.
Note que text/javascript
foi marcado como obsoleto por RFC 4329 (Scripting Tipos de mídia) documento e recomenda-se usar o tipo application/javascript
vez. No entanto, devido a razões de legado, text/javascript
ainda é amplamente utilizado e tem suporte cross-browser (que nem sempre é o caso com o tipo application/javascript
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, mas obsoleto, versões mais antigas do IE costumava usar como atributo html.
Content-Type: text/x-javascript
- Tipos JavaScript mídia, mas obsoleto
Content-Type: text/x-json
-. json antes application / json foi oficialmente registrada