Posso fazer uma solicitação JSONP entre domínios em JavaScript sem usar o jQuery ou outra biblioteca externa? Gostaria de usar o próprio JavaScript, analisar os dados e torná-los um objeto para que eu pudesse usá-los. Preciso usar uma biblioteca externa? Se não, como posso fazer isso?
javascript
jsonp
Dave
fonte
fonte
Respostas:
fonte
foo(payload_of_json_data)
a idéia é que, quando carregada na tag de script, chama a função foo com a carga útil já como um objeto javascript e nenhuma análise é necessária.Exemplo leve (com suporte para onSuccess e onTimeout). Você precisa passar o nome de retorno de chamada na URL, se necessário.
Uso da amostra:
No GitHub: https://github.com/sobstel/jsonp.js/blob/master/jsonp.js
fonte
O que é JSONP?
O importante a lembrar com o jsonp é que na verdade não é um protocolo ou tipo de dados. É apenas uma maneira de carregar um script rapidamente e processar o script que é introduzido na página. No espírito do JSONP, isso significa introduzir um novo objeto javascript do servidor no aplicativo / script do cliente.
Quando o JSONP é necessário?
É um método de permitir que um domínio acesse / processe dados de outro na mesma página de forma assíncrona. Principalmente, é usado para substituir as restrições do CORS (compartilhamento de recursos de origem cruzada) que ocorreriam com uma solicitação XHR (ajax). As cargas de script não estão sujeitas a restrições CORS.
Como isso é feito
A introdução de um novo objeto javascript no servidor pode ser implementada de várias maneiras, mas a prática mais comum é o servidor implementar a execução de uma função de 'retorno de chamada', com o objeto necessário passado para ele. A função de retorno de chamada é apenas uma função que você já configurou no cliente que o script que você carrega chama no ponto em que o script carrega para processar os dados passados para ele.
Exemplo:
Eu tenho um aplicativo que registra todos os itens na casa de alguém. Meu aplicativo está configurado e agora quero recuperar todos os itens no quarto principal.
Meu aplicativo está ativado
app.home.com
. As APIs das quais eu preciso carregar os dados estão ativadasapi.home.com
.A menos que o servidor esteja configurado explicitamente para permitir isso, não posso usar o ajax para carregar esses dados, pois mesmo as páginas em subdomínios separados estão sujeitas a restrições XHR CORS.
Idealmente, configure as coisas para permitir XHR no domínio x
Idealmente, como a API e o aplicativo estão no mesmo domínio, talvez eu tenha acesso para configurar os cabeçalhos
api.home.com
. Se assim for, posso adicionar umAccess-Control-Allow-Origin:
item de cabeçalho que conceda acessoapp.home.com
. Supondo que o cabeçalho esteja configurado da seguinte maneiraAccess-Control-Allow-Origin: "http://app.home.com"
:, isso é muito mais seguro do que configurar o JSONP. Isso ocorre porque eleapp.home.com
pode obter tudo o que desejaapi.home.com
semapi.home.com
dar acesso ao CORS a toda a Internet.A solução XHR acima não é possível. Configurar o JSONP No script do meu cliente: configurei uma função para processar a resposta do servidor ao fazer a chamada JSONP. :
O servidor precisará ser configurado para retornar um mini-script parecido com algo como
"processJSONPResponse('{"room":"main bedroom","items":["bed","chest of drawers"]}');"
Ele pode ser projetado para retornar essa sequência se algo como//api.home.com?getdata=room&room=main_bedroom
for chamado.Em seguida, o cliente configura uma tag de script como tal:
Isso carrega o script e chama imediatamente
window.processJSONPResponse()
como gravado / eco / impresso pelo servidor. Os dados passados como parâmetro para a função agora são armazenados nadataFromServer
variável local e você pode fazer o que precisar.Limpar
Uma vez que o cliente tenha os dados, ie. imediatamente após o script ser adicionado ao DOM, o elemento de script pode ser removido do DOM:
fonte
SyntaxError: JSON.parse: unexpected character at line 1 column 2 of the JSON data
. Depois de adicionar aspas simples para os dados, tudo funcionou bem, então:"processJSONPResponse('{"room":"main bedroom","items":["bed","chest of drawers"]}');"
Meu entendimento é que você realmente usa tags de script com JSONP, então ...
A primeira etapa é criar sua função que manipulará o JSON:
Verifique se essa função está acessível em nível global.
Em seguida, adicione um elemento de script ao DOM:
O script carregará o JavaScript que o provedor da API cria e o executa.
fonte
eval
ouparse
nem nada. Você deve obter o JavaScript que o navegador pode executar, certo?do jeito que eu uso jsonp como abaixo:
use o método 'jsonp' como este:
referência:
JavaScript XMLHttpRequest usando JsonP
http://www.w3ctech.com/topic/721 (fale sobre o modo de uso Promise)
fonte
Eu tenho uma biblioteca javascript pura para fazer isso https://github.com/robertodecurnex/J50Npi/blob/master/J50Npi.js
Dê uma olhada e informe-me se precisar de ajuda para usar ou entender o código.
Aliás, você tem um exemplo simples de uso aqui: http://robertodecurnex.github.com/J50Npi/
fonte
Amostra de uso:
fonte
window[callback] = null
permitir que a função seja coletada no lixo.Eu escrevi uma biblioteca para lidar com isso, da maneira mais simples possível. Não há necessidade de torná-lo externo, é apenas uma função. Diferentemente de outras opções, esse script é limpo e é generalizado para fazer solicitações adicionais em tempo de execução.
https://github.com/Fresheyeball/micro-jsonp
fonte
Por favor, encontre o
JavaScript
exemplo abaixo para fazer umaJSONP
chamada sem o JQuery:Além disso, você pode consultar meu
GitHub
repositório para referência.https://github.com/shedagemayur/JavaScriptCode/tree/master/jsonp
fonte
fonte
window.document.getElementsByTagName('script')[0];
e nãodocument.body.appendChild(…)
?logAPI
ser definido comonull
quando terminar para que a coleta de lixo possa ser executada nele?Se você estiver usando o ES6 com NPM, tente o módulo de nó "fetch-jsonp". API de busca Fornece suporte para fazer uma chamada JsonP como uma chamada XHR regular.
Pré-requisito: você deve usar o
isomorphic-fetch
módulo node na sua pilha.fonte
Apenas colando uma versão ES6 da boa resposta de sobstel:
fonte