2010-08-08 15 views
13

Ho chiesto un precedente question che è stato sicuramente utile e fammi sapere su JSONP. Tuttavia, vedo che devo specificare JSONP come tipo di dati. Ora, per quanto ne so, questo è il tipo di ritorno dei dati che ritornano, che sarebbe XML. XML può essere restituito usando JSONP o sono limitato a tornare in formato JSONP? Grazie!Utilizzo di JSONP quando si restituisce XML

risposta

13

Sei limitato a JSONP (e non XML) a causa di come funziona. JSONP si trasforma in questo:

<script src="myPage?callback=myFunction" type="text/javscript"> 

Così, quando si prende il contenuto, è efficacemente fare questo:

<script type="text/javascript"> 
    myFunction({ data: value, data2: value2 }); 
</script> 

Che torna è reale l'esecuzione di JavaScript, quindi non può essere XML, è 'll ottenere tutti i tipi di errori di sintassi, esattamente come si farebbe a fare questo:

<script type="text/javascript"> 
    <elem> 
    <data>value</data> 
    <data2>value2</data2> 
    </elem> 
</script> 

come si può i Magine, il parser JavaScript non piacerà molto a questo, e non sa cosa farne. jQuery può analizzare XML nella maggior parte dei casi senza alcun problema, ma se usi JSONP ed è per richieste tra domini ... beh, JSONP è la tua unica opzione, a meno che tu non abbia scritto una pagina proxy sul tuo sito che non violi regole dei criteri di origine originaria e utilizzato come proxy per recuperare l'XML.

+0

Grazie per l'aiuto! Se volessi pubblicare i dati nell'API _without_ utilizzando JSONP, potrei semplicemente inviare i dati all'API e non dovermi preoccupare del fatto che le cose bizzarri del dominio incrociato siano corrette? Grazie per l'aiuto, sono un ragazzo php e Javascript/jQuery è ancora abbastanza nuovo per me! Fondamentalmente sto provando a scrivere un widget da inserire su altri siti, quindi sono limitato a Javascript e non posso usare niente lato server. Grazie ancora! – patricksweeney

+1

@patricksweeney - Puoi postare sì, ma non riceverai una risposta, è la risposta * dal * server, non un POST * a * il server che il tuo browser blocca ... il contenuto della risposta POST sarebbe essere vuoto, è così che la sicurezza della stessa origine funziona in tutti i principali browser. –

+1

Quindi in pratica dovrei vedere se possiamo avvolgere la risposta del server in JSONP o usare un proxy, giusto? – patricksweeney

2

L'idea è di inviare indietro il codice eseguibile dal server. Scrivi un plugin jQuery o estendi la funzione Ajax per restituire la stringa XML come parametro di funzione.

myCallback(" 
    <root> 
    <person> 
     <first>John</first> 
     <last>Doe</last> 
    </person> 
    </root>") 

Il plug-in analizzerà questa stringa in XML e la restituirà al callback effettivo. Per quanto riguarda il tuo callback, non è al corrente del processo di conversione string -> xml.

Ecco uno esistente implementation.

L'interfaccia più ideale per questo con jQuery sarebbe,

$.ajax({ 
    url: 'http://example.com/resource?type=xml', 
    dataType: 'xmlp', 
    success: function(xml) { .. } 
}); 

ma dal momento che scherzare e riscrittura jQuery.ajax è problematica, si potrebbe scrivere questo come un plugin namespace separata stessa che utilizzerà getScript sotto.

$.myNamespace.ajax({ 
    .. 
}); 

Per far funzionare tutto ciò, è necessario il controllo del server. Il server deve sapere che XML è richiesto e rispondere con una chiamata di funzione che contiene la stringa XML come parametro. Assumendo il nome di callback che hai inviato verso il server remoto è stato foo, il server dovrà rispondere con qualcosa di simile:

foo("<names><name>..</name></names>") 

Penso che se si stesse utilizzando un browser supportato E4X, allora non ci sarebbe alcun bisogno di avvolgere l'XML all'interno di una stringa. Il server potrebbe semplicemente restituire il XML come argomento alla funzione di callback:

foo(
    <names> 
    <name>John Doe</name> 
    </names> 
) 

Ma, purtroppo, E4X non è ancora ampiamente supportato.

+3

jQuery supporta xmlp se si imposta 'dataType' su' jsonp xml'. Per quanto riguarda i documenti: "A partire da jQuery 1.5, jQuery può convertire un dataType da ciò che ha ricevuto nell'intestazione Content-Type a ciò che si richiede.Ad esempio, se si desidera che una risposta di testo sia trattata come XML, utilizzare" text xml " per il dataType. Puoi anche creare una richiesta JSONP, riceverla come testo e interpretata da jQuery come XML: "jsonp text xml." Analogamente, una stringa abbreviata come "jsonp xml" tenterà prima di convertire da jsonp a xml e, in caso contrario, convertire da jsonp in testo e quindi da testo in xml. " –

+0

@ greg.kindel - grazie per le informazioni. Io ** cercherò ** di aggiornare la risposta, ma mi sento abbastanza pigro in questo momento. – Anurag

-3

È possibile scrivere XML nella funzione Javascript all'interno di /* comment */ e convertire questa funzione in testo con il metodo nome funzione.toString() e il testo di analisi tra "/*" e "*/" con callback funzione JSONP s', che funziona in tutti i vecchi browser. Esempio xml_via_jsonp.js:

function myfunc() 
{/* 
<xml> 
<div class="container"> 
     <div class="panel panel-info col-lg-10 col-lg-offset-1 added-panel"> 
      <div class="panel-heading">Random1 - Random2</div> 
      <div class="panel-body"> 
       <div>Random3</div> 
      </div> 
     </div> 
    </div> 
</xml> 
*/} 

function callback(func) 
{ 
var myhtml = func.toString(); 
var htmlstart = myhtml.indexOf('/*'); 
var htmlend = myhtml.lastIndexOf('*/'); 
return myhtml.substr(htmlstart+2, htmlend-htmlstart-2); 
} 
+2

Questa è una pessima idea. – cpburnz

+0

E qual è la tua migliore idea? – Derozer

+0

Si potrebbe semplicemente archiviare l'XML in una stringa. Saltare completamente l'intero 'func.toString()' con 'xml_string'. – cpburnz

Problemi correlati