Eu entendo JSON, mas não JSONP. O documento da Wikipedia sobre JSON é (foi) o principal resultado da pesquisa para JSONP. Diz o seguinte:
JSONP ou "JSON com preenchimento" é uma extensão JSON em que um prefixo é especificado como um argumento de entrada da própria chamada.
Hã? Que ligação? Isso não faz nenhum sentido para mim. JSON é um formato de dados. Não há ligação.
O segundo resultado da pesquisa é de um cara chamado Remy , que escreve isso sobre JSONP:
JSONP é a injeção de tag de script, passando a resposta do servidor para uma função especificada pelo usuário.
Eu posso entender isso, mas ainda não faz sentido.
Então, o que é JSONP? Por que foi criado (que problema resolve)? E por que eu iria usá-lo?
Adendo : Acabei de criar uma nova página para JSONP na Wikipedia; agora possui uma descrição clara e completa do JSONP, com base na resposta do jvenema .
fonte
Respostas:
Na verdade, não é muito complicado ...
Digamos que você esteja no domínio
example.com
e deseje fazer uma solicitação ao domínioexample.net
. Para fazer isso, você precisa cruzar os limites do domínio , um não-não na maioria dos idiomas da navegação.O único item que ignora essa limitação são as
<script>
tags. Quando você usa uma tag de script, a limitação do domínio é ignorada, mas em circunstâncias normais, você realmente não pode fazer nada com os resultados, o script é avaliado.Enter
JSONP
. Ao fazer sua solicitação para um servidor habilitado para JSONP, você passa um parâmetro especial que informa ao servidor um pouco sobre sua página. Dessa forma, o servidor é capaz de agrupar sua resposta de uma maneira que sua página possa suportar.Por exemplo, digamos que o servidor espere um parâmetro chamado
callback
para ativar seus recursos JSONP. Em seguida, sua solicitação seria semelhante a:Sem JSONP, isso pode retornar algum objeto JavaScript básico, como:
No entanto, com JSONP, quando o servidor recebe o parâmetro "callback", o resultado é um pouco diferente, retornando algo como isto:
Como você pode ver, agora ele chamará o método que você especificou. Então, na sua página, você define a função de retorno de chamada:
E agora, quando o script for carregado, ele será avaliado e sua função será executada. Voila, solicitações entre domínios!
Também vale a pena notar o principal problema do JSONP: você perde muito controle da solicitação. Por exemplo, não há uma maneira "agradável" de recuperar os códigos de falha adequados. Como resultado, você acaba usando temporizadores para monitorar a solicitação, etc., o que é sempre um pouco suspeito. A proposição para JSONRequest é uma ótima solução para permitir scripts entre domínios, manter a segurança e permitir o controle adequado da solicitação.
Hoje em dia (2015), o CORS é a abordagem recomendada vs. JSONRequest. O JSONP ainda é útil para suporte a navegadores mais antigos, mas dadas as implicações de segurança, a menos que você não tenha escolha, o CORS é a melhor opção.
fonte
JSONP é realmente um truque simples para superar a mesma política de domínio XMLHttpRequest . (Como você sabe, não é possível enviar uma solicitação AJAX (XMLHttpRequest) para um domínio diferente.)
Portanto, em vez de usar XMLHttpRequest , precisamos usar tags HTML de script , aquelas que você costuma usar para carregar arquivos js, para que js obtenha dados de outro domínio. Soa estranho?
A coisa é - as tags de script podem ser usadas de maneira semelhante ao XMLHttpRequest ! Veja isso:
Você terminará com um segmento de script que se parece com este após carregar os dados:
No entanto, isso é um pouco inconveniente, porque precisamos buscar esse array na tag de script . Então, os criadores do JSONP decidiram que isso funcionaria melhor (e é):
Percebe a função my_callback por lá? Então - quando o servidor JSONP receber sua solicitação e encontrar o parâmetro de retorno de chamada - em vez de retornar a matriz js simples, ele retornará isso:
Veja onde está o lucro: agora temos o retorno de chamada automático (my_callback) que será acionado assim que recebermos os dados.
É tudo o que há para saber sobre o JSONP : são tags de retorno de chamada e script.
NOTA: estes são exemplos simples de uso de JSONP, não são scripts prontos para produção.
Exemplo básico de JavaScript (feed simples do Twitter usando JSONP)
Exemplo básico de jQuery (feed simples do Twitter usando JSONP)
JSONP significa JSON com preenchimento . (técnica muito mal nomeada, pois realmente não tem nada a ver com o que a maioria das pessoas pensaria como "preenchimento".)
fonte
O JSONP funciona construindo um elemento "script" (na marcação HTML ou inserido no DOM via JavaScript), que solicita um local de serviço de dados remoto. A resposta é um javascript carregado no seu navegador com o nome da função predefinida, juntamente com o parâmetro sendo passado, que é o pedido de dados JSON. Quando o script é executado, a função é chamada junto com os dados JSON, permitindo que a página solicitante receba e processe os dados.
Para mais informações, visite: https://blogs.sap.com/2013/07/15/secret-behind-jsonp/
snippet de código do lado do cliente
Parte do servidor do código PHP
fonte
Porque você pode solicitar ao servidor que acrescente um prefixo ao objeto JSON retornado. Por exemplo
function_prefix(json_object);
para que o navegador
eval
"inline" a sequência JSON como uma expressão. Esse truque possibilita ao servidor "injetar" o código javascript diretamente no navegador do cliente, ignorando as restrições da "mesma origem".Em outras palavras, você pode obter uma troca de dados entre domínios .
Normalmente,
XMLHttpRequest
não permite a troca de dados entre domínios diretamente (é preciso passar por um servidor no mesmo domínio), enquanto:<script src="some_other_domain/some_data.js&prefix=function_prefix
> `pode-se acessar dados de um domínio diferente da origem.Também vale a pena notar: mesmo que o servidor deva ser considerado "confiável" antes de tentar esse tipo de "truque", os efeitos colaterais de uma possível alteração no formato do objeto etc. podem ser contidos. Se uma
function_prefix
(ou seja, uma função js adequada) for usada para receber o objeto JSON, a referida função poderá executar verificações antes de aceitar / processar mais os dados retornados.fonte
O JSONP é uma ótima maneira de contornar erros de script entre domínios. Você pode consumir um serviço JSONP exclusivamente com o JS sem precisar implementar um proxy AJAX no lado do servidor.
Você pode usar o serviço b1t.co para ver como ele funciona. Este é um serviço JSONP gratuito que permite que você reduza seus URLs. Aqui está o URL a ser usado para o serviço:
http://b1t.co/Site/api/External/MakeUrlWithGet?callback=[resultsCallBack}&url=[escapedUrlToMinify]
Por exemplo, a chamada, http://b1t.co/Site/api/External/MakeUrlWithGet?callback=whateverJavascriptName&url=google.com
retornaria
E assim, quando esse get é carregado em seus js como um src, ele executa automaticamente o javascriptName que você deve implementar como função de retorno de chamada:
Para realmente fazer a chamada JSONP, você pode fazer isso de várias maneiras (incluindo o uso de jQuery), mas aqui está um exemplo JS puro:
Um exemplo passo a passo e um serviço da web jsonp para praticar estão disponíveis em: este post
fonte
Um exemplo simples para o uso de JSONP.
client.html
server.php
fonte
Antes de entender o JSONP, é necessário conhecer o formato JSON e o XML. Atualmente, o formato de dados mais frequentemente usado na web é XML, mas XML é muito complicado. Isso torna os usuários inconvenientes ao processo incorporado nas páginas da Web.
Para que o JavaScript possa trocar dados com facilidade, mesmo como o programa de processamento de dados, usamos o texto de acordo com os objetos JavaScript e desenvolvemos um formato simples de troca de dados, que é JSON. JSON pode ser usado como dados ou como um programa JavaScript.
O JSON pode ser incorporado diretamente no JavaScript, usando-o, você pode executar diretamente certo programa JSON, mas devido a restrições de segurança, o mecanismo Sandbox do navegador desativa a execução de código JSON entre domínios.
Para que o JSON possa ser passado após a execução, desenvolvemos um JSONP. O JSONP ignora os limites de segurança do navegador com a funcionalidade JavaScript Callback e a tag <script>.
Portanto, em resumo, ele explica o que é JSONP, que problema resolve (quando usá-lo).
fonte
TL; DR
JSONP é um truque antigo inventado para contornar a restrição de segurança que nos proíbe obter dados JSON de um servidor diferente (uma origem diferente * ).
O truque funciona usando uma
<script>
tag que solicita o JSON daquele local, por exemplo{ "user":"Smith" }
:, mas envolvido em uma função, o JSONP real ("JSON with Padding"):Recebê-lo desta forma nos permite usar os dados em nossa
peopleDataJSONP
função. JSONP é uma prática ruim , não a use (leia abaixo)O problema
Digamos que estamos navegando
ourweb.com
e queremos obter dados JSON (ou quaisquer dados brutos)anotherweb.com
. Se usarmos a solicitação GET (comoXMLHttpRequest
, umfetch
chamada,$.ajax
etc.), nosso navegador nos dirá que não é permitido com este erro feio:Como obter os dados que queremos? Bem, as
<script>
tags não estão sujeitas a toda essa restrição do servidor (origem *)! É por isso que podemos carregar uma biblioteca como o jQuery ou o Google Maps de qualquer servidor, como uma CDN, sem erros.Ponto importante : se você pensar bem, essas bibliotecas são códigos JS reais e executáveis (geralmente uma função massiva com toda a lógica). Mas dados brutos? Dados JSON não são código . Não há nada para correr; são apenas dados simples.
Portanto, não há como manipular ou manipular nossos dados preciosos. O navegador fará o download dos dados apontados pela nossa
<script>
tag e, ao processar, reclamará com razão:O corte JSONP
A maneira antiga / hacky de utilizar esses dados? Precisamos desse servidor para enviá-lo com alguma lógica, portanto, quando estiver carregado, seu código no navegador poderá usar esses dados. Portanto, o servidor estrangeiro nos envia os dados JSON dentro de uma função JS. Os dados em si são configurados como entrada dessa função. Se parece com isso:
o que torna o código JS que nosso navegador analisará sem reclamar! Exatamente como acontece com a biblioteca jQuery. Agora, para obtê-lo assim, o cliente "solicita" o servidor compatível com JSONP, geralmente feito assim:
Nosso navegador receberá o JSONP com esse nome de função, portanto, precisamos de uma função com o mesmo nome em nosso código, assim:
Ou assim, o mesmo resultado:
O navegador fará o download do JSONP e o executará, que chama nossa função , onde o argumento
data
será nosso JSON. Agora podemos fazer com nossos dados o que quisermos.Não use JSONP, use CORS
JSONP é um hack entre sites com algumas desvantagens:
O argumento é que não há necessidade de usá-lo hoje em dia .
JSONP é o truque para obter dados JSON de outro servidor, mas violaremos o mesmo princípio de segurança (mesma origem) se precisarmos de outros tipos de coisas entre sites.
Você deve ler sobre o CORS aqui , mas a essência é:
* origem é definida por três coisas: protocolo , porta e host . Então, por exemplo,
https://web.com
é uma origem diferente dehttp://web.com
(protocolo diferente) ehttps://web.com:8081
(porta diferente) e obviamentehttps://thatotherweb.net
(host diferente)fonte
As ótimas respostas já foram dadas, só preciso fornecer minha peça na forma de blocos de código em javascript (também incluirei uma solução mais moderna e melhor para solicitações de origem cruzada: CORS with HTTP Headers):
JSONP:
1.client_jsonp.js
2.server_jsonp.js
CORS :
3.client_cors.js
4.server_cors.js
fonte
Aqui está o site, com ótimos exemplos , com a explicação do uso mais simples dessa técnica ao mais avançado no JavaScript do plano:
w3schools.com / JSONP
Uma das minhas técnicas mais favoritas descritas acima é o resultado JSON dinâmico , que permite enviar JSON para o arquivo PHP no parâmetro URL e permitir que o arquivo PHP também retorne um objeto JSON com base nas informações obtidas .
Ferramentas como o jQuery também possuem facilidades para usar o JSONP :
fonte