2015-04-08 11 views
10

Ho un beacon di segnalazione errori creato utilizzando lo script di Google Apps ed è pubblicato per essere eseguito da me e per essere accessibile a "chiunque, anche anonimo", che deve indicare Sono consentite richieste di domini X a GAS.Richieste cross-script di Google Apps interrotte in funzione

Tuttavia, i miei browser ora stanno indicando che non c'è l'intestazione Access-Control-Allow-Origin sulla risposta dopo i messaggi di codice al beacon.

Mi manca qualcosa qui? Questo funzionava fino a due mesi fa. Fino a quando il GAS è stato pubblicato per l'accesso pubblico, quindi era impostando l'intestazione Access-Control-Allow-Origin.

In Google Apps Script:

Code.gs
function doPost(data){ 
    if(data){ 
     //Do Something 
    } 
    return ContentService.createTextOutput("{status:'okay'}", ContentService.MimeType.JSON); 
} 

lato client:

script.js
$.post(beacon_url, data, null, "json"); 

risposta

13

Quando si effettuano chiamate a uno script contentService ho sempre mandato un callback per JSONP. Poiché GAS non supporta CORS, questo è l'unico modo affidabile per garantire che l'app non si interrompa quando arrivano i problemi relativi al dominio x.

Effettuare una chiamata in jQuery basta aggiungere "& callback =?". Immaginerà tutto il resto.

var url = "https://script.google.com/macros/s/{YourProjectId}/exec?offset="+offset+"&baseDate="+baseDate+"&callback=?"; 
$.getJSON(url,function(returnValue){...}); 

Sul lato server

function doGet(e){ 
var callback = e.parameter.callback; 
//do stuff ... 
return ContentService.createTextOutput(callback+'('+ JSON.stringify(returnValue)+')').setMimeType(ContentService.MimeType.JAVASCRIPT); 
} 
+0

ho segnato questo come la risposta, ma è un po 'fuori, quindi potresti voler modificare. Per qualche ragione, l'impostazione del tipo di contenuto all'interno di createTextOutput, anche con l'impostazione su JavaScript, non risolve il problema. Tuttavia, utilizzare la funzione setContentType e impostarlo su JavaScript non funziona. Inoltre, sto usando un POST e non una richiesta GET in questo caso d'uso. –

+1

Ah, JSONP non funzionerà con Post. Tutto ciò che hai descritto sembra corretto. Esegui l'app come "io" autorizza l'accesso a "anonymous". Assicurati di effettuare la chiamata all'indirizzo pubblicato e non all'indirizzo dello sviluppatore. Se è stato impostato tutto ciò dovresti avere: Access-Control-Allow-Origin: * Ho testato un piccolo script con hurl.it. Vedo tutte le intestazioni corrette che tornano da lì. –

4

solo per rendere più semplice per coloro che sono interessati solo a una richiesta POST come me:

function doPost(e){ 

//do stuff ... 

var MyResponse = "It Works!"; 

return ContentService.createTextOutput(MyResponse).setMimeType(ContentService.MimeType.JAVASCRIPT); 

} 
+1

Questo non sembra funzionare per me nel 2018. Ricevo ancora l'errore CORS. –