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




json tutorial portugues (24)

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


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 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"));


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

@RequestMapping(value="location", method = RequestMethod.POST, headers = "Accept=application/json")

Adicione cabeçalhos à resposta:

HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json");


Para JSON:

Content-Type: application/json

Para JSONP :

Content-Type: application/javascript

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

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.


" 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())
  }
}

Se o JSON estiver com preenchimento, então será application/jsonp . Se o JSON for sem padding, será application/json .

Para lidar com ambos, é uma boa prática usar: 'application / javascript' sem se preocupar se é com preenchimento ou sem preenchimento.


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

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 .


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 Ext GWT e a resposta do servidor deve ir como texto / html, mas contém dados JSON.

Lado do cliente, ouvinte de formulário Ext GWT

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 resposta application / json , o navegador sugere que eu salve o arquivo.

Fragmento de código fonte do lado do servidor usando o 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);
    }
};

No JSP , você pode usar isso na diretiva page:

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

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


Eu uso o abaixo

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

JSON é uma linguagem específica de domínio (DSL) e um formato de dados independente do JavaScript e, como tal, tem seu próprio tipo MIME , application/json . O respeito pelos tipos MIME é, obviamente, orientado para o cliente, portanto, o text/plain pode fazer para a transferência de bytes, mas, então, você estaria elevando desnecessariamente a interpretação para o domínio do aplicativo do fornecedor - application/json . Você transferiria XML via text/plain ?

Mas honestamente, a sua escolha do tipo MIME é aconselhar o cliente sobre como interpretar o data- text/plain ou text/HTML (quando não é HTML) é como apagar o tipo - é tão pouco informativo quanto fazer todos os seus objetos do tipo Object em uma linguagem tipada.

Nenhum tempo de execução do navegador que eu conheço receberá 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 afetado, isso é uma questão totalmente diferente. Mas essa não é toda a história - os RESTful JSON geralmente não têm tempos de execução 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 tão aleijados ... então eu consideraria talvez a injeção de HTML através de um serviço de templates Ajax .

Aplicativo / JSON!


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


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 .


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


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.


Desenvolvedores PHP usam isso:

<?php
    header("Content-type: application/json");

    // Do something here...
?>

A resposta correta é:

Content-Type: application/json




content-type