usar - Qual é o tipo de conteúdo JSON correto?




json tutorial portugues (20)

O application/json funciona muito bem no PHP para armazenar uma matriz ou dados de objeto.

Eu uso esse código para colocar dados em JSON no Google Cloud Storage (GCS), que é definido como 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 recuperar os dados, siga em frente:

$data = json_decode(file_get_contents("gs://BUCKETNAME/FILENAME.json"));

Eu tenho andado com o JSON por algum tempo, apenas fazendo o texto e não machucou ninguém (que eu saiba), mas eu gostaria de começar a fazer as coisas corretamente.

Vi tantos "padrões" supostos para o tipo de conteúdo JSON:

application/json
application/x-javascript
text/javascript
text/x-javascript
text/x-json

Mas o que é correto ou melhor? Eu entendo que há problemas de segurança e suporte ao navegador que variam entre eles.

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


JSON:

A resposta é dados gerados dinamicamente, de acordo com os parâmetros de consulta transmitidos na URL.

Exemplo:

{ "Name": "Foo", "Id": 1234, "Rank": 7 }

Tipo de Conteúdo: application/json

JSON-P:

JSON com preenchimento. A resposta é dados JSON, com uma chamada de função envolvida.

Exemplo:

functionCall({"Name": "Foo", "Id": 1234, "Rank": 7});

Tipo de Conteúdo: application/javascript


A resposta correta é:

Content-Type: application/json

Como muitos outros mencionaram, application/json é a resposta correta.

Mas o que não foi explicado ainda é o que as outras opções que você propôs significam.

  • application/x-javascript : O tipo experimental de MIME para JavaScript antes do application/javascript foi padronizado.

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

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

  • text/x-json : Tipo MIME experimental para JSON antes do application/json ser registrado oficialmente.

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


Estendendo as respostas aceitas, quando você estiver usando o JSON em um contexto REST ...

Há um forte argumento sobre o uso de application/x-resource+json e application/x-collection+json quando você está representando recursos REST e coleções.

E se você decidir seguir a especificação jsonapi , você deve usar o application/vnd.api+json , como está documentado.

Embora não haja um padrão universal, fica claro que a adição semântica dos recursos sendo 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.


Eu uso o abaixo

contentType: 'application/json',
data: JSON.stringify(SendData),

Não há dúvidas de que application/json é o melhor tipo MIME para uma resposta JSON.

Mas eu tive alguma experiência onde eu tive que usar application/x-javascript por causa de alguns problemas de compressão. Meu ambiente de hospedagem é compartilhado com o GoDaddy . Eles não me permitem alterar as configurações do servidor. Eu adicionei o seguinte código ao meu arquivo web.config para compactar 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 isso, as páginas .aspx foram compactadas com g-zip, mas as respostas JSON não foram. Eu adicionei

<add mimeType="application/json" enabled="true"/>

nas seções de tipos estáticos e dinâmicos. Mas isso não comprime as respostas JSON.

Depois disso, removi esse tipo recém-adicionado e adicionei

<add mimeType="application/x-javascript" enabled="true"/>

nas seções dos tipos estático e dinâmico e alterou o tipo de resposta em

.ashx (manipulador assíncrono) para

application/x-javascript

E agora descobri que minhas respostas JSON foram compactadas com g-zip. Então eu pessoalmente recomendo usar

application/x-javascript

somente se você quiser compactar suas respostas JSON em um ambiente de hospedagem compartilhada . Porque na hospedagem compartilhada, eles não permitem que você altere as configurações do IIS .


Nem tudo funciona para o tipo de conteúdo application/json .

Se você estiver usando o formulário Ext JS para enviar o arquivo, esteja ciente de que a resposta do servidor é analisada pelo navegador para criar o documento para o <iframe> .

Se o servidor estiver usando JSON para enviar o objeto de retorno, o cabeçalho Content-Type deverá ser definido como text/html para que o navegador insira o texto inalterado no corpo do documento.

Consulte a documentação da API Ext JS 3.4.0 .


No Spring você tem um tipo definido: MediaType.APPLICATION_JSON_VALUE que é equivalente a application / json .


O registro da IANA para o application/json diz

Aplicativos que usam esse tipo de mídia: JSON foi usado para trocar dados entre aplicativos escritos em todas essas linguagens de programação: ActionScript, C, C #, Clojure, ColdFusion, Common Lisp, E, Erlang, Go, Java, JavaScript, Lua, Objetivo CAML, Perl, PHP, Python, Rebol, Ruby, Scala e Scheme.

Você notará que o IANA.org não lista nenhum desses outros tipos de mídia , na verdade, até mesmo o application/javascript está obsoleto. Então, application/json é realmente a única resposta correta possível.

Suporte de navegador é outra coisa.

Os tipos de mídia não padrão mais suportados são text/json ou text/javascript . Mas alguns grandes nomes usam text/plain .

Ainda mais estranho é o cabeçalho Content-Type enviado pelo Flickr, que retorna JSON como text/xml . O Google usa text/javascript para algumas de suas ajax apis.

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 correto é application/json

MAS

Eu experimentei muitas situações em que o tipo de navegador ou o usuário da estrutura precisava:

text/html

application/javascript

O tipo de conteúdo correto para JSON é application/json menos que você esteja usando JSONP , também conhecido como JSON com Padding, que na verdade é JavaScript e, portanto, o tipo de conteúdo correto seria application/javascript .



Para o texto JSON:

application/json

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

Para JSONP (javascript executável) com retorno de chamada:

application/javascript

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


Se você estiver chamando ASP.NET Web Services do lado do cliente, precisará usar application/json para que ele funcione. Eu acredito que isso é o mesmo para os frameworks jQuery e Ext .


Se você estiver em um ambiente do lado do cliente, investigar sobre o suporte entre navegadores é obrigatório para um aplicativo da Web bem suportado.

O tipo de conteúdo HTTP correto seria application/json , como outros já destacaram também, mas alguns clientes não lidam com isso muito bem, é por isso que o jQuery recomenda o text/html padrão.


Se você obtiver dados da API REST em JSON, será necessário usar 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

Somente ao usar o 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 ):

  • Não há mais avisos do Chrome quando o JSON é carregado do servidor.
  • O Firebug adicionará uma guia à resposta mostrando os dados JSON formatados. Se o tipo MIME for diferente, ele será exibido apenas como "Conteúdo de resposta".

JSON formatos JSON (JavaScript Object Notation) e JSONP ("JSON with padding") parecem ser muito semelhantes e, portanto, pode ser muito confuso qual tipo MIME eles devem usar. Mesmo que os formatos pareçam ser muito semelhantes, existem algumas diferenças sutis entre eles.

Portanto, sempre que tiver alguma dúvida, tenho uma abordagem muito simples (que funciona perfeitamente na maioria dos casos), ou seja, vá e verifique o documento RFC correspondente.

JSON RFC 4627 (O tipo de mídia do aplicativo / json para JavaScript Object Notation (JSON)) é uma especificação do formato JSON. Ele diz na seção 6, que o tipo de mídia MIME para o texto JSON é

application/json.

JSONP JSONP ("JSON com preenchimento") é tratado de maneira diferente de JSON, em um navegador. JSONP é tratado como um script JavaScript regular e, portanto, deve usar o application/javascript, o tipo MIME oficial atual para JavaScript. Em muitos casos, no entanto, o tipo MIME de text/javascript também funciona bem.

Observe que o text/javascript foi marcado como obsoleto pelo documento rfc-editor.org/rfc/rfc4329.txt (Tipos de mídia de script) e é recomendável usar o tipo de application/javascript . No entanto, devido a razões legadas, o text/javascript ainda é amplamente usado e tem suporte a vários navegadores (o que nem sempre é um caso com o tipo MIME de application/javascript , 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 versões antigas e obsoletas do IE costumavam usar como atributo html.
Content-type: text/x-javascript - Tipos de mídia JavaScript MAS obsoletos
Content-type: text/x-json - json antes da aplicação / json ser oficialmente registrada.







content-type