
Also known as JSON with Padding
thumb | right | alt=Graphical logo for JSONP | Graphical logo for JSONP JSONP, or JSON-P (JSON with Padding), is a JavaScript technique for requesting data via the HTML element. It was proposed by Bob Ippolito in 2005. JSONP enables sharing of data bypassing same-origin policy, which disallows running JavaScript code to read media DOM elements or XMLHttpRequest data fetched from outside the page's originating site. The originating site is indicated by a combination of URI scheme, hostname, and port number.
JSONP ou "JSON with padding" é um complemento ao formato de dados JSON. Ele provê um método para enviar requisições de dados de um servidor para um domínio diferente, uma coisa proibida pelos navegadores típicos por causa da Política de mesma origem. Com a Política de mesma origem, uma página servida de server1.example.com não pode normalmente se conectar ou se comunicar com servidores diferentes de server1.example.com. Uma exceção é a tag HTML <script></code>. Explorando a política aberta para a tag <code><script></code>, algumas páginas usam a tag para receber código <a href="/wiki/JavaScript" title="JavaScript">Javascript</a> que opera com dados em formato JSON de outra origem gerados dinamicamente. Esse padrão de uso é conhecido com JSONP. Requisições de JSONP não trazem JSON, mas código Javascript arbitrário. Eles são executados pelo <a href="/wiki/Interpretador" title="Interpretador">interpretador</a> Javascript, e não parseados pelo parser JSON.</p><p>Tem sido levantadas algumas críticas ao JSONP. <a href="/wiki/Cross-origin_resource_sharing" title="Cross-origin resource sharing">Cross-Origin Resource Sharing</a> é um método mais recente de obter dados de um servidor num domínio diferente, que lida com alguma dessas críticas.</p><meta property="mw:PageProp/toc" /><h2><span class="mw-headline" id="Como_funciona">Como funciona</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=JSONP&veaction=edit§ion=1" class="mw-editsection-visualeditor" title="Editar secção: Como funciona">editar</a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=JSONP&action=edit§ion=1" title="Editar secção: Como funciona">editar código-fonte</a><span class="mw-editsection-bracket">]</span></span></h2><p>Para ver como esse pattern funciona, considere uma requisição a uma <a href="/wiki/URL" title="URL">URL</a> que retorna um documento JSON. Um programa Javascript pode fazer a requisição dessa URL por <a href="/wiki/XMLHttpRequest" title="XMLHttpRequest">XMLHttpRequest</a>, por exemplo. Suponha que uma URL é <code>http://server2.example.com/RetrieveUser?UserId=xxx</code>. Suponha que userID de Foo é 1234. Um navegador requerendo a URL <code>http://server2.example.com/RetrieveUser?UserId=1234</code>, passando o userID de Foo, pode receber algo como:</p><div class="mw-highlight mw-highlight-lang-javascript mw-content-ltr" dir="ltr"><pre><span></span><span class="p">{</span><span class="s2">"Name"</span><span class="o">:</span> <span class="s2">"Foo"</span><span class="p">,</span> <span class="s2">"Id"</span> <span class="o">:</span> <span class="mf">1234</span><span class="p">,</span> <span class="s2">"Rank"</span><span class="o">:</span> <span class="mf">7</span><span class="p">}</span></pre></div><p>Esses dados em formato JSON podem ser dinamicamente gerados, de acordo com os parâmetros passados na URL.</p><p>Agora imagine especificar uma URL que retorna JSON como um atributo src para um elemento <a href="/wiki/HTML_element#script_tag" class="mw-redirect" title="HTML element"><code><script></code></a>. O problema como isso é que o JSON é interpretado com Javascript, mas ao invés de interpretar o conteúdo como notação literal de um objeto ele seria interpretado como um bloco e descartado como um erro de sintaxe. Mesmo que ele fosse corretamente interpretado como uma notação literal de objeto ele não poderia ser acessado por Javascript já que não estaria atribuído a uma variável.</p><p>No uso do JSONP, o atributo src no elemento <code><script></code> é um JSON gerado dinamicamente, com uma chamada de função o encapsulando. Dessa forma, o recurso retornado continua sendo código Javascript válido, mas por ser um literal de um objeto anônimo encapsulado em uma chamada de função, o ambiente Javascript do navegador por agir nos dados retornados. Ele poderia parecer com isso:</p><div class="mw-highlight mw-highlight-lang-javascript mw-content-ltr" dir="ltr"><pre><span></span> <span class="nx">functionCall</span><span class="p">({</span><span class="s2">"Name"</span><span class="o">:</span> <span class="s2">"Foo"</span><span class="p">,</span> <span class="s2">"Id"</span> <span class="o">:</span> <span class="mf">1234</span><span class="p">,</span> <span class="s2">"Rank"</span><span class="o">:</span> <span class="mf">7</span><span class="p">});</span></pre></div><p>A chamada de função é o P do JSONP - o "padding" (espaçamento) em volta do JSON puro, ou de acordo com alguns<sup id="cite_ref-1" class="reference"><a href="#cite_note-1"><span>[</span>1<span>]</span></a></sup> o "prefixo".</p><div class="mw-highlight mw-highlight-lang-html mw-content-ltr" dir="ltr"><pre><span></span> <span class="p"><</span><span class="nt">script</span> <span class="na">type</span><span class="o">=</span><span class="s">"text/javascript"</span> <span class="na">src</span><span class="o">=</span><span class="s">"http://server2.example.com/RetrieveUser?UserId=1234&jsonp=parseResponse"</span><span class="p">></span> <span class="p"></</span><span class="nt">script</span><span class="p">></span></pre></div><p>Neste exemplo, a carga recebida seria:</p><div class="mw-highlight mw-highlight-lang-javascript mw-content-ltr" dir="ltr"><pre><span></span> <span class="nx">parseResponse</span><span class="p">({</span><span class="s2">"Name"</span><span class="o">:</span> <span class="s2">"Foo"</span><span class="p">,</span> <span class="s2">"Id"</span> <span class="o">:</span> <span class="mf">1234</span><span class="p">,</span> <span class="s2">"Rank"</span><span class="o">:</span> <span class="mf">7</span><span class="p">});</span></pre></div><h2><span class="mw-headline" id="Padding">Padding</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=JSONP&veaction=edit§ion=2" class="mw-editsection-visualeditor" title="Editar secção: Padding">editar</a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=JSONP&action=edit§ion=2" title="Editar secção: Padding">editar código-fonte</a><span class="mw-editsection-bracket">]</span></span></h2><p>Enquanto o padding (prefixo) é <i>tipicamente</i> o nome da função callback que é definida dentro do contexto de execução do navegador, ela pode ser uma atribuição de uma variável, trecho de if , ou qualquer outro trecho de código Javascript.A resposta a uma requisição JSONP (nominalmente, uma requisição seguindo a patter de uso do JSONP) não é JSON e não é parseada como JSON; o payload pode ser qualquer expressão Javascript arbitraria, e não precisa nem mesmo incluir JSON. Mas convencionalmente, é um fragmento Javascript que invoca uma chamada de função em algum dado formatado em JSON.Em outras palavras, o uso típico do JSONP provê acesso cross-domanin a uma API JSON existente, encapsulando o conteúdo JSON em uma chamada de função.</p><h2><span id="Inje.C3.A7.C3.A3o_do_elemento_script"></span><span class="mw-headline" id="Injeção_do_elemento_script"><i>Injeção</i> do elemento script</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=JSONP&veaction=edit§ion=3" class="mw-editsection-visualeditor" title="Editar secção: Injeção do elemento script">editar</a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=JSONP&action=edit§ion=3" title="Editar secção: Injeção do elemento script">editar código-fonte</a><span class="mw-editsection-bracket">]</span></span></h2><p>JSONP só faz sentido quando usado com o elemento script. Para cada novo request JSONP, o navegador precisa adicionar um novo elemento <a href="/wiki/HTML_element#script_tag" class="mw-redirect" title="HTML element"><code><script></code></a>, ou reutilizar um já existente. A forma antiga, adicionando um novo elemento script, é feita via manipulação dinâmica do DOM, e é conhecida como <i>injeção de elemento script</i>. O elemento <code><script></code> é injetado no DOM, com a URL do endpoint JSON desejado setado como o valor do atributo "src". Esse <i>injeção de elemento script</i> dinâmica é comumente feita por uma biblioteca Javascript auxiliar. jQuery e outros frameworks tem funções auxiliares; há também opções padrões. <sup id="cite_ref-2" class="reference"><a href="#cite_note-2"><span>[</span>2<span>]</span></a></sup></p><p>A <i>injeção dinâmica</i> do elemento script para uma chamada JSONP seria parecido com isso:</p><div class="mw-highlight mw-highlight-lang-html mw-content-ltr" dir="ltr"><pre><span></span> <span class="p"><</span><span class="nt">script</span> <span class="na">type</span><span class="o">=</span><span class="s">"text/javascript"</span> <span class="na">src</span><span class="o">=</span><span class="s">"http://server2.example.com/RetrieveUser?UserId=1234&jsonp=parseResponse"</span><span class="p">></span> <span class="p"></</span><span class="nt">script</span><span class="p">></span></pre></div><p>Após o elemento ser injetado, o navegador interpreta o elemento, e faz um HTTP GET na URL definida no atributo "src", obtendo o conteúdo. O navegador então interpreta o payload como Javascript. Isso é tipicamente uma invocação de função.</p><p>Dessa forma, o uso do JSONP pode ser dito por <i>permite que páginas do navegador contornem a política de mesma origem via injeção de elemento script.</i></p><p><br /></p><h2><span id="Hist.C3.B3ria"></span><span class="mw-headline" id="História">História</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=JSONP&veaction=edit§ion=4" class="mw-editsection-visualeditor" title="Editar secção: História">editar</a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=JSONP&action=edit§ion=4" title="Editar secção: História">editar código-fonte</a><span class="mw-editsection-bracket">]</span></span></h2><p>Em Julho de 2005 George Jempty sugeriu uma forma opcional de atribuir uma variavel ao JSON.<sup id="cite_ref-3" class="reference"><a href="#cite_note-3"><span>[</span>3<span>]</span></a></sup><sup id="cite_ref-4" class="reference"><a href="#cite_note-4"><span>[</span>4<span>]</span></a></sup> A proposta original para o JSONP, onde o padding é uma função callback, parece ter sido feita por Bob Ippolito em Dezembro de 2005<sup id="cite_ref-5" class="reference"><a href="#cite_note-5"><span>[</span>5<span>]</span></a></sup> e agora é usado por muitas aplicações <a href="/wiki/Web_2.0" title="Web 2.0">Web 2.0</a> como o <a href="/wiki/Dojo_Toolkit" title="Dojo Toolkit">Dojo Toolkit</a>, <a href="/wiki/Google_Web_Toolkit" title="Google Web Toolkit">Google Web Toolkit</a>,<sup id="cite_ref-6" class="reference"><a href="#cite_note-6"><span>[</span>6<span>]</span></a></sup> e <a href="/wiki/Web_service" title="Web service">Web services</a>.</p><h2><span class="mw-headline" id="References">References</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=JSONP&veaction=edit§ion=5" class="mw-editsection-visualeditor" title="Editar secção: References">editar</a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=JSONP&action=edit§ion=5" title="Editar secção: References">editar código-fonte</a><span class="mw-editsection-bracket">]</span></span></h2><div class="reflist columns references-column-width" style="-moz-column-width: 30em; -webkit-column-width: 30em; column-width: 30em; list-style-type: decimal;"><ol class="references"><li id="cite_note-1"><span class="mw-cite-backlink"><a href="#cite_ref-1">↑</a></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20141115070803/http://epimorph-pubx1.appspot.com/help.html">«Experimental RDF result set to JSON translator»</a><span class="reference-accessdate">. Consultado em 20 de fevereiro de 2012</span>. Arquivado do <a rel="nofollow" class="external text" href="http://epimorph-pubx1.appspot.com/help.html">original</a> em 15 de novembro de 2014</cite><span title="ctx_ver=Z39.88-2004&rfr_id=info%3Asid%2Fpt.wikipedia.org%3AJSONP&rft.btitle=Experimental+RDF+result+set+to+JSON+translator&rft.genre=unknown&rft_id=http%3A%2F%2Fepimorph-pubx1.appspot.com%2Fhelp.html&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook" class="Z3988"><span style="display:none;"> </span></span></span></li><li id="cite_note-2"><span class="mw-cite-backlink"><a href="#cite_ref-2">↑</a></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://pastebin.com/ADxHdCnB">«example jsonp library on pastebin»</a></cite><span title="ctx_ver=Z39.88-2004&rfr_id=info%3Asid%2Fpt.wikipedia.org%3AJSONP&rft.btitle=example+jsonp+library+on+pastebin&rft.genre=unknown&rft_id=http%3A%2F%2Fpastebin.com%2FADxHdCnB&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook" class="Z3988"><span style="display:none;"> </span></span></span></li><li id="cite_note-3"><span class="mw-cite-backlink"><a href="#cite_ref-3">↑</a></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://replay.web.archive.org/20060212113746/http://htmatters.net/htm/1/2005/07/evaling-JSON.cfm">«eval'ing JSON»</a>. 19 de julho de 2005</cite><span title="ctx_ver=Z39.88-2004&rfr_id=info%3Asid%2Fpt.wikipedia.org%3AJSONP&rft.btitle=eval%27ing+JSON&rft.date=2005-07-19&rft.genre=unknown&rft_id=http%3A%2F%2Freplay.web.archive.org%2F20060212113746%2Fhttp%3A%2F%2Fhtmatters.net%2Fhtm%2F1%2F2005%2F07%2Fevaling-JSON.cfm&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook" class="Z3988"><span style="display:none;"> </span></span></span></li><li id="cite_note-4"><span class="mw-cite-backlink"><a href="#cite_ref-4">↑</a></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://tech.groups.yahoo.com/group/json/message/82">«json: Message: Re: Comments»</a>. 17 de agosto de 2005</cite><span title="ctx_ver=Z39.88-2004&rfr_id=info%3Asid%2Fpt.wikipedia.org%3AJSONP&rft.btitle=json%3A+Message%3A+Re%3A+Comments&rft.date=2005-08-17&rft.genre=unknown&rft_id=http%3A%2F%2Ftech.groups.yahoo.com%2Fgroup%2Fjson%2Fmessage%2F82&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook" class="Z3988"><span style="display:none;"> </span></span></span></li><li id="cite_note-5"><span class="mw-cite-backlink"><a href="#cite_ref-5">↑</a></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://www.webcitation.org/65OHzF7n5?url=http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/">«Remote JSON - JSONP»</a>. <i>from __future__ import *</i>. Bob.pythonmac.org. 5 de dezembro de 2005<span class="reference-accessdate">. Consultado em 8 de setembro de 2008</span>. Arquivado do <a rel="nofollow" class="external text" href="http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/">original</a> em 12 de fevereiro de 2012</cite><span title="ctx_ver=Z39.88-2004&rfr_id=info%3Asid%2Fpt.wikipedia.org%3AJSONP&rft.atitle=Remote+JSON+-+JSONP&rft.date=2005-12-05&rft.genre=unknown&rft.jtitle=from+__future__+import+%2A&rft_id=http%3A%2F%2Fbob.pythonmac.org%2Farchives%2F2005%2F12%2F05%2Fremote-json-jsonp%2F&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal" class="Z3988"><span style="display:none;"> </span></span></span></li><li id="cite_note-6"><span class="mw-cite-backlink"><a href="#cite_ref-6">↑</a></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="https://www.webcitation.org/6Djo88laj?url=http://www.gwtapps.com/?p=42">«GWT Tutorial: How to Read Web Services Client-Side with JSONP»</a>. <i>Google Web Toolkit Applications</i>. 6 de fevereiro de 2008<span class="reference-accessdate">. Consultado em 3 de julho de 2009</span>. Arquivado do <a rel="nofollow" class="external text" href="http://www.gwtapps.com/?p=42">original</a> em 17 de janeiro de 2013</cite><span title="ctx_ver=Z39.88-2004&rfr_id=info%3Asid%2Fpt.wikipedia.org%3AJSONP&rft.atitle=GWT+Tutorial%3A+How+to+Read+Web+Services+Client-Side+with+JSONP&rft.date=2008-02-06&rft.genre=unknown&rft.jtitle=Google+Web+Toolkit+Applications&rft_id=http%3A%2F%2Fwww.gwtapps.com%2F%3Fp%3D42&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal" class="Z3988"><span style="display:none;"> </span></span></span></li></ol></div><h2><span id="Liga.C3.A7.C3.B5es_externas"></span><span class="mw-headline" id="Ligações_externas">Ligações externas</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=JSONP&veaction=edit§ion=6" class="mw-editsection-visualeditor" title="Editar secção: Ligações externas">editar</a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=JSONP&action=edit§ion=6" title="Editar secção: Ligações externas">editar código-fonte</a><span class="mw-editsection-bracket">]</span></span></h2><ul><li>Site official: <a rel="nofollow" class="external free" href="http://www.json-p.org">http://www.json-p.org</a> (em inglês)</li><li><a rel="nofollow" class="external text" href="http://www.vcarrer.com/2010/11/about-jsonp-in-javascript.html">About JSONP in JavaScript</a> (em inglês)</li><li><a rel="nofollow" class="external text" href="https://code.google.com/p/jsonp-java/">jsonp-java wraps any response content into a jsonp callback</a> (em inglês)</li><li><a rel="nofollow" class="external text" href="https://web.archive.org/web/20111227014302/http://cheeso.members.winisp.net/srcview.aspx?dir=js">An implementation of a JSONP utility class</a> (em inglês)</li></ul><!-- NewPP limit reportParsed by mw1441Cached time: 20221216193800Cache expiry: 1814400Reduced expiry: falseComplications: [show‐toc]CPU time usage: 0.369 secondsReal time usage: 1.014 secondsPreprocessor visited node count: 593/1000000Post‐expand include size: 15136/2097152 bytesTemplate argument size: 122/2097152 bytesHighest expansion depth: 12/100Expensive parser function count: 7/500Unstrip recursion depth: 0/20Unstrip post‐expand size: 35045/5000000 bytesLua time usage: 0.303/10.000 secondsLua memory usage: 2569761/52428800 bytesNumber of Wikibase entities loaded: 0/400--><!--Transclusion expansion time report (%,ms,calls,template)100.00% 993.460 1 -total 30.63% 304.280 1 Predefinição:Mais_notas 28.99% 288.002 1 Predefinição:Ambox 5.23% 51.923 1 Predefinição:Reflist 4.03% 40.002 6 Predefinição:Citar_web 1.54% 15.286 4 Predefinição:En 1.32% 13.135 1 Predefinição:()-meta1 1.21% 12.011 1 Predefinição:Língua-meta 0.43% 4.260 1 Predefinição:Argvar 0.17% 1.672 1 Predefinição:Encontre_fontes--><!-- Saved in parser cache with key ptwiki:pcache:idhash:3655591-0!canonical and timestamp 20221216193759 and revision id 64429144. --></div></script>
Abstract from DBpedia / Wikipedia · CC BY-SA
via Wikidata sitelinks · CC0
Discovered by embedding cosine similarity (sentence-transformers MiniLM, 384-dim).