2015-04-08 17 views
10

Mam zgłoszenie błędu, które utworzyłem przy użyciu skryptu Google Apps. Zostało ono opublikowane, aby działało jak ja i było dostępne dla "każdego, nawet anonimowego", co oznacza, że ​​powinno oznaczać Żądania X-domain do GAS są dozwolone.Prośby o międzydomenowe domeny w usłudze Google Apps przestały działać.

Jednak moje przeglądarki wskazują teraz, że nie ma nagłówka Access-Control-Allow-Origin w odpowiedzi po wpisaniu kodu do radiolatarni.

Czy tu czegoś brakuje? To działało tak niedawno, jak dwa miesiące temu. Tak długo jak GAS był publikowany dla publicznego dostępu, wtedy był ustawiając nagłówek Access-Control-Allow-Origin.

W Google Apps Script:

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

Side Klient:

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

Odpowiedz

13

przy wykonywaniu połączeń do skryptu contentService zawsze Wysłano wywołania zwrotnego dla JSONP. Ponieważ GAS nie obsługuje CORS, jest to jedyny niezawodny sposób, aby upewnić się, że twoja aplikacja nie zostanie zerwana, gdy pojawią się problemy z domeną x.

Wywołanie połączenia w jQuery wystarczy dodać "& callback =?". Pokaże wszystko inne.

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

Po stronie serwera

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

zaznaczyłem to jako odpowiedź, lecz jest trochę wyłączony, więc możesz chcieć edytować. Z jakiegoś powodu ustawienie typu zawartości wewnątrz metody createTextOutput, nawet przy ustawieniu jej w JavaScript, nie rozwiązuje problemu. Jednak korzystanie z funkcji setContentType i ustawienie jej na JavaScript działa. Używam również żądania POST, a nie żądania GET w tym przypadku użycia. –

+1

Ach tak, JSONP nie będzie działać z Post. Wszystko, co opisałeś, brzmi poprawnie. Uruchom aplikację jako "ja", aby umożliwić dostęp do "anonimowy". Upewnij się, że dzwonisz na opublikowany adres, a nie na adres programisty. Jeśli wszystko, co jest ustawione, powinieneś mieć: Kontrola dostępu-Pozwól-Origin: * Przetestowałem mały skrypt z hurl.it. Widzę stamtąd wszystkie właściwe nagłówki. –

4

Wystarczy zrobić to prostsze dla tych, którzy są zainteresowani tylko żądania POST jak ja:

function doPost(e){ 

//do stuff ... 

var MyResponse = "It Works!"; 

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

} 
+1

Wydaje mi się, że to nie działa w 2018 roku. Nadal otrzymuję błąd CORS. –