Pubblica i dati su JsonP

È ansible inviare dati a JSONP? O tutti i dati devono essere passati in querystring come una richiesta GET?

Ho un sacco di dati che ho bisogno di inviare al servizio, cross domain, ed è troppo grande per essere inviato tramite la querystring

Quali sono le opzioni per aggirare questo?

Non è ansible eseguire un POST asincrono su un servizio su un altro dominio, a causa della (abbastanza ragionevole) limitazione della stessa politica di origine . JSON-P funziona solo perché ti è permesso inserire tag nel DOM e possono puntare ovunque.

Puoi, ovviamente, creare una pagina su un altro dominio con l'azione di un modulo POST regolare.

Modifica : Ci sono alcuni hack interessanti là fuori se sei disposto a fare un sacco di sforzi inserendo nascosti e mescolando con le loro proprietà.

Se devi inviare molti dati tra domini diversi. Generalmente creo un servizio che puoi chiamare in due passaggi:

  1. Prima il client invia un FORM (post consentito cross domain). Il servizio memorizza l’input nella sessione sul server (utilizzando il GUID come chiave). (il client crea un GUID e lo invia come parte dell’input)

  2. Quindi il client esegue un normale script-iniettore (JSONP) come parametro per utilizzare lo stesso GUID utilizzato nel post FORM. Il servizio elabora l’input dalla sessione e restituisce i dati nel normale modo JSONP. Dopo questo la sessione viene distrutta.

Questo ovviamente dipende dal fatto che si scrive il backend del server.

So che questa è una necromanzia seria, ma ho pensato di pubblicare la mia implementazione di JSONP POST usando jQuery, che sto usando con successo per il mio widget JS (utilizzato per la registrazione e l’accesso dei clienti):

Fondamentalmente, sto usando un approccio IFrame, come suggerito nella risposta accettata. Quello che sto facendo in modo diverso è dopo aver inviato la richiesta, sto osservando, se il modulo può essere raggiunto nell’iframe, usando un timer. Quando il modulo non può essere raggiunto, significa che la richiesta è stata restituita. Quindi, sto utilizzando una normale richiesta JSONP per richiedere lo stato dell’operazione.

Spero che qualcuno lo trovi utile. Testato in> = IE8, Chrome, FireFox e Safari.

 function JSONPPostForm(form, postUrl, queryStatusUrl, queryStatusSuccessFunc, queryStatusData) { var tmpDiv = $('
'); form.parent().append(tmpDiv); var clonedForm = cloneForm(form); var iframe = createIFrameWithContent(tmpDiv, clonedForm); if (postUrl) clonedForm.attr('action', postUrl); var postToken = 'JSONPPOST_' + (new Date).getTime(); clonedForm.attr('id', postToken); clonedForm.append(''); clonedForm.attr('id', postToken ); clonedForm.submit(); var timerId; var watchIFrameRedirectHelper = function() { if (watchIFrameRedirect(iframe, postToken )) { clearInterval(timerId); tmpDiv.remove(); $.ajax({ url: queryStatusUrl, data: queryStatusData, dataType: "jsonp", type: "GET", success: queryStatusSuccessFunc }); } } if (queryStatusUrl && queryStatusSuccessFunc) timerId = setInterval(watchIFrameRedirectHelper, 200); } function createIFrameWithContent(parent, content) { var iframe = $(''); parent.append(iframe); if (!iframe.contents().find('body').length) { //For certain IE versions that do not create document content... var doc = iframe.contents().get()[0]; doc.open(); doc.close(); } iframe.contents().find('body').append(content); return iframe; } function watchIFrameRedirect(iframe, formId) { try { if (iframe.contents().find('form[id="' + formId + '"]').length) return false; else return true; } catch (err) { return true; } return false; } //This one clones only form, without other HTML markup function cloneForm(form) { var clonedForm = $('
'); //Copy form attributes $.each(form.get()[0].attributes, function(i, attr) { clonedForm.attr(attr.name, attr.value); }); form.find('input, select, textarea').each(function() { clonedForm.append($(this).clone()); }); return clonedForm; }

In generale, JSONP viene implementato aggiungendo un tag al documento chiamante, in modo tale che l'URL del servizio JSONP sia "src". Il browser recupera l'origine dello script con una transazione HTTP GET.

Ora, se il tuo servizio JSONP si trova nello stesso dominio della tua pagina chiamante, allora probabilmente potresti mettere insieme qualcosa con una semplice $.ajax() . Se non si trova nello stesso dominio, non sono sicuro di come sarebbe ansible.

È ansible utilizzare un proxy CORS utilizzando questo progetto . Dirige tutto il traffico verso un endpoint sul tuo dominio e trasmette tali informazioni a un dominio esterno. Poiché il browser sta registrando tutte le richieste per essere nello stesso dominio, siamo in grado di pubblicare JSON. NOTA: funziona anche con i certificati SSL conservati sul server.

C’è una soluzione (hack) l’ho fatto molte volte, sarai in grado di pubblicare con JsonP. (Sarai in grado di inviare un modulo, più grande di 2000 caratteri di quelli che puoi utilizzare con GET)

Applicazione client Javascript

 $.ajax({ type: "POST", // you request will be a post request data: postData, // javascript object with all my params url: COMAPIURL, // my backoffice comunication api url dataType: "jsonp", // datatype can be json or jsonp success: function(result){ console.dir(result); } }); 

GIAVA:

 response.addHeader( "Access-Control-Allow-Origin", "*" ); // open your api to any client response.addHeader( "Access-Control-Allow-Methods", "POST" ); // a allow post response.addHeader( "Access-Control-Max-Age", "1000" ); // time from request to response before timeout 

PHP:

 header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Methods: POST'); header('Access-Control-Max-Age: 1000'); 

In questo modo, stai aprendo il tuo server a qualsiasi richiesta di posta, dovresti assicurarlo nuovamente fornendo identity framework o qualcos’altro.

Con questo metodo, puoi anche cambiare il tipo di richiesta da jsonp a json, entrambi funzionano, basta impostare il giusto tipo di contenuto di risposta

jsonp

 response.setContentType( "text/javascript; charset=utf-8" ); 

jSON

 response.setContentType( "application/json; charset=utf-8" ); 

Per favore, non che il tuo server non rispetterà più SOP (stessa politica di origine), ma a chi importa?

È ansible, ecco la mia soluzione:

Nella tua javascript:

 jQuery.post("url.php",data).complete(function(data) { eval(data.responseText.trim()); }); function handleRequest(data){ .... } 

Nel tuo url.php:

 echo "handleRequest(".$responseData.")";