2015-05-06 5 views
6

Hat jemand Erfolg mit der Google Cloud Print (speziell die/Suche) API von JavaScript gehabt?Rufen Sie Google Cloud Print/Suche API von Javascript

Ich habe eine beliebige Anzahl von Möglichkeiten versucht, aber immer den folgenden Fehler erhalten.

XMLHttpRequest kann https://www.google.com/cloudprint/search nicht geladen werden. Kein 'Access-Control-Allow-Origin'-Header ist auf der angeforderten Ressource vorhanden. Origin 'http://localhost:8080' ist daher nicht erlaubt.

Code-Snippet:

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(); 

Ich bin in der Lage, die Demo-Form-Post zu verwenden:

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

aus genau derselben Webseite und es erfolgreich ist; Ich habe einige Zeit damit verbracht, sicherzustellen, dass die beiden Anfragen identisch in Bezug auf die übermittelten Daten und Header aussehen, aber ohne Erfolg. Ich zögere, dies in Java schreiben zu müssen (als Versuch, Server-Backend-Beteiligung zu vermeiden) und würde jede Hilfe begrüßen.

+0

ich mit dem gleichen Problem zu kämpfen, ich tripple Check cors von meiner Seite erlaubt ist und noch immer 'Herkunft ist daher nicht erlaubt Zugang. vom Browser' Wer weiß, Lösung? – Sojtin

+0

Haben Sie das versucht [Antwort] (http://stackoverflow.com/questions/20333290/google-cloud-print-api-key)? –

Antwort

1

Auth.html:

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

Autorisieren.

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; 
} 

Erste OAuth-Token und rufen Sie 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

Es scheint mir, dass Ihre Antwort zeigt, wie Sie einen Cloud-Print-Button haben, aber die Frage bezieht sich auf die Such-API, die eine andere API ist. – Loren

+0

Ja! Ich habe es falsch verstanden ... schon korrigiert. –