2015-05-06 11 views
6

Qualcuno ha avuto successo utilizzando Google Cloud Print (in particolare l'API/search) da JavaScript?Chiamare l'API di Google cloud print/search da javascript

Ho provato un numero qualsiasi di modi, ma continuo a ricevere il seguente errore.

XMLHttpRequest non può caricare https://www.google.com/cloudprint/search. Nessuna intestazione 'Access-Control-Allow-Origin' è presente sulla risorsa richiesta. L'origine 'http://localhost:8080' non è quindi consentita l'accesso.

Snippet di codice:

var search = new XMLHttpRequest(); 

    search.open('POST', 'https://www.google.com/cloudprint/search', true); 
    search.withCredentials = true;   
    search.setRequestHeader("X-Cloud-Print", "Google-JS"); 

    search.onreadystatechange = function(response){ 
      console.log(response); 
    }; 

    search.send(); 

sono in grado di utilizzare il palo modulo demo:

<form action="https://www.google.com/cloudprint/search" method="post" enctype="multipart/form-data" id="submitForm"> 
     <input type="submit" value="Search"/> 
    </form>  

dal esattamente la stessa pagina web ed è successo; Ho passato parecchio tempo a fare in modo che le due richieste sembrassero identiche in termini di dati inviati e intestazioni, ma senza successo. Sono riluttante a dover scrivere questo in Java (cercando di evitare il coinvolgimento del backend del server) e accetterei qualsiasi aiuto.

+0

io alle prese con lo stesso problema, ho Tripple controllo è cors sono consentite modifiche da parte mia e di accesso ancora ricevendo 'origine non è pertanto consentita. dal browser Qualcuno sa la soluzione? – Sojtin

+0

Hai provato [risposta] (http://stackoverflow.com/questions/20333290/google-cloud-print-api-key)? –

risposta

1

Auth.html:

<a href='<?!= getAuthURL(); ?>' target='_blank'> 
<button>Authorize!</button> 
</a> 

Autorizza.

function test() { 
    var html = HtmlService.createTemplateFromFile("Auth").evaluate().setSandboxMode(HtmlService.SandboxMode.NATIVE).setTitle("Test"); 
    SpreadsheetApp.getUi().showModalDialog(html, "Test"); 
} 
function getAuthURL() { 
    var options= { 
    client_id : "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com", // your id 
    scope : "https://www.googleapis.com/auth/cloudprint", 
    redirect_uri : "https://script.google.com/macros/d/MDYeOxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/usercallback", // your uri 
    state : ScriptApp.newStateToken().withMethod("getAuthResponse").createToken() 
    }; 
    var url = "https://accounts.google.com/o/oauth2/auth?response_type=code&access_type=offline"; 
    for(var i in options) 
    url += "&"+i+"="+encodeURIComponent(options[i]); 
    return url; 
} 

Ottenere token OAuth e chiamare Google Cloud Print

function getAuthResponse(q) { 
    var options = { 
    method: "post", 
    muteHttpExceptions: true, 
    payload: { 
     code: q.parameter.code, 
     client_id : "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com", // your id 
     client_secret : "xxxxxxxxxxxxxxxxxxxxxxxx", // your secret 
     redirect_uri: "https://script.google.com/macros/d/MDYeOxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/usercallback", // your uri 
     grant_type: "authorization_code" 
    } 
    } 
    var response = JSON.parse(UrlFetchApp.fetch("https://accounts.google.com/o/oauth2/token", options)); 
    var auth_string = response.token_type+" "+response.access_token; 
    options.method = "get"; 
    options.payload = null; 
    options.headers = {Authorization: auth_string}; 
    response = UrlFetchApp.fetch("https://www.google.com/cloudprint/search",options); 
    return ContentService.createTextOutput(response.getContentText()); 
} 
+0

Mi sembra che la tua risposta mostri come avere un pulsante di stampa cloud, ma la domanda riguarda l'API di ricerca che è un'API diversa. – Loren

+0

Sì! Ho frainteso ... già corretto. –