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.

Foi útil?

Solução

Para texto JSON:

application/json

O tipo de mídia MIME para o texto JSON é application/json . A codificação padrão é UTF-8. . (Fonte: RFC 4627 )

Para JSONP (executável javascript) com callback:

application/javascript

Aqui estão alguns posts que foram mencionadas nos comentários que são relevantes.

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:

Para JSON:

Content-Type: application/json

JSON-P :

Content-Type: application/javascript

É 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.

Exemplo:

{ "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.

Exemplo:

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 .

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.

o Ext JS 3.4.0 API documentação .

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 antes application/javascript foi feito padrão

  • text/javascript: Agora obsoleto. Você deve usar application/javascript ao usar javascript.

  • text/x-javascript:. Tipo Experimental MIME para a situação acima

  • text/x-json:. Experimental MIME tipo para JSON antes application/json foi oficialmente registrada

Ao todo, sempre que você tem alguma dúvida sobre tipos de conteúdo, você deve verificar este link

Na JSP , você pode usar isso em diretiva de página:

<%@ page language="java" contentType="application/json; charset=UTF-8"
    pageEncoding="UTF-8"%>

O correto MIME tipo de mídia para JSON é application/json. JSP irá utilizá-lo para enviar uma resposta para o cliente.

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 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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top