2015-05-06 15 views
6

Czy ktoś miał jakieś sukcesy za pomocą API Google Cloud Print (w szczególności/wyszukiwania) z JavaScript?Wywołanie Google Chmura drukowania/wyszukiwanie API z javascript

Próbowałem na wiele sposobów, ale nadal pojawia się następujący błąd.

XMLHttpRequest nie może załadować https://www.google.com/cloudprint/search. Na żądanym zasobie nie ma nagłówka "Access-Control-Allow-Origin". Pochodzenie "http://localhost:8080" jest zatem niedozwolone.

Fragment kodu:

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

jestem w stanie wykorzystać w słupek formularz Demo:

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

z dokładnie tej samej stronie i to jest sukces; Spędziłem sporo czasu upewniając się, że te dwie prośby wyglądają identycznie pod względem przesłanych danych i nagłówków, ale bez skutku. Jestem niechętny, aby napisać to w Javie (jako próba uniknięcia zaangażowania serwera) i chętnie przyjmiemy każdą pomoc.

+0

ja zmaga się z tym samym numerze, i Tripple wyboru jest Cors dozwolony z mojej strony i wciąż się 'Origin dlatego niedozwolone dostępu. od przeglądarki ' Ktoś wie, jakie rozwiązanie? – Sojtin

+0

Wypróbowałeś tę [odpowiedź] (http://stackoverflow.com/questions/20333290/google-cloud-print-api-key)? –

Odpowiedz

1

Auth.html:

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

autoryzacji.

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

Uzyskiwanie tokenu OAuth i nazywają 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

Wydaje mi się, że twoja odpowiedź pokazuje, jak mieć przycisk drukowania w chmurze, ale pytanie dotyczy interfejsu API wyszukiwania, który jest innym interfejsem API. – Loren

+0

Tak! Źle zrozumiałem ... już poprawiłem. –