2017-01-09 1 views
0

Ich versuche Push-Benachrichtigungen von einer Ressource auf Google Drive an meinen Server zu senden. Ich habe in diesem Beispiel gesucht:Autorisierung für Google Drive Push-Benachrichtigungen für Java

https://developers.google.com/drive/v3/web/push 

Und ich habe versucht, das zu Java in etwa wie folgt übersetzen:

RestTemplate restTemplate = new RestTemplate(); 

    HttpHeaders headers = new HttpHeaders(); 
    headers.setContentType(MediaType.APPLICATION_JSON); 
    MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>(); 
    map.add("id", "36d00d08-000d-4723-91bc-a1a6ec302e59"); 
    map.add("type", "web_hook"); 
    map.add("address", "https://mydomain.appspot.com/rest/drive"); 
    HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(map, headers); 
    ResponseEntity<String> response = restTemplate.postForEntity(uri, request, String.class); 

ich zuvor wurde für Drives mit Googles Libs Dateien zuzugreifen. In diesen Fällen musste ich die Anfrage nicht manuell erstellen. Ich habe die Klasse GoogleAuthorizationCodeFlow mit einem Token verwendet, um meine Anfragen zu autorisieren. Ich bin mir nicht sicher, wie ich das mit RestTemplate machen soll. Ich vermute, dass ich etwas tun muss wie:

headers.set("Authorization", X); 

Was sollte X hier sein? Ist das überhaupt der richtige Weg zur Autorisierung?

Edit:

Hier ist mein Versuch, ein Geheimnis zu lesen. Das Ergebnis ist HTTP 401:

@Override 
    public String startListening() throws IOException { 
     final String fileId = "omitted"; 
     String uri = "https://www.googleapis.com/drive/v3/files/" + fileId + "/watch"; 
     HttpHeaders headers = getHeaders(getSecret()); 
     HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(getProperties(), headers); 
     RestTemplate restTemplate = new RestTemplate(); 
     ResponseEntity<String> response = restTemplate.postForEntity(uri, request, String.class); 
     return response.getStatusCode() + " " + response.getBody() + " " + response.getHeaders(); 
    } 

    private static HttpHeaders getHeaders(String theString) { 
     HttpHeaders headers = new HttpHeaders(); 
     headers.setContentType(MediaType.APPLICATION_JSON); 
     headers.set("Authorization", "Bearer " + theString); 
     return headers; 
    } 

    private static MultiValueMap<String, String> getProperties() { 
     MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>(); 
     map.add("id", "some uid"); 
     map.add("type", "web_hook"); 
     map.add("address", "https://mydomain.appspot.com/rest/drive"); 
     return map; 
    } 

    private static String getSecret() throws IOException { 
     InputStream in = 
       ConcreteDriveListenerFactory.class.getResourceAsStream("/drive_secret.json"); 
     StringWriter writer = new StringWriter(); 
     IOUtils.copy(in, writer, "UTF-8"); 
     return writer.toString(); 
    } 
+0

das Zugriffstoken wahrscheinlich – DaImTo

+0

lese ich meine Zugriffstoken (ein Token, das funktioniert, wenn 3rd-Party-Client mit Google Drive, die leider nicht Push unterstützt) und in den Header setzen. Hat nicht geholfen. Könnte es etwas anderes sein? –

Antwort

1

Wie @Dalmto erwähnt hat, ist X für Token. Im Hinblick auf Beispiel-POST-Anfrage für Drive API versuchen Sie dieses Code-Snippet von diesem SO thread. Es verwendet auch eine POST-Methode.

public static void main(String argv[]) throws Exception { 
    DefaultHttpClient httpClient = new DefaultHttpClient(); 
    HttpPost post = new HttpPost(
      "https://www.googleapis.com/drive/v2/files"); 
    post.addHeader("Content-Type", "application/json"); 
    post.addHeader("Authorization", 
      "Bearer XXXXXXXXXXXXXXXXXXXXXXXXX"); 

    JsonObject jsonObject = new JsonObject(); 
    jsonObject.addProperty("title", "Test folder"); 
    jsonObject 
      .addProperty("mimeType", "application/vnd.google-apps.folder"); 

    post.setEntity(new StringEntity(jsonObject.toString())); 
    httpClient.execute(post); 
} 
+0

Hatte kein Glück, wenn Sie das versuchen, vielleicht, weil dies sich auf v2 der API oder etwas anderes bezieht? –

Verwandte Themen