2017-01-09 113 views
0

我試圖從Google雲端硬盤中的資源向我的服務器發送推送通知。我一直在尋找這個例子:針對Java的Google雲端硬盤推送通知授權

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

我試圖翻譯是對Java弄成這個樣子:

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

我以前一直在使用谷歌庫的驅動器來訪問文件。在這些情況下,我不需要以這種「手動」方式創建請求。我使用帶有令牌的類GoogleAuthorizationCodeFlow來授權我的請求。我不確定我應該如何使用RestTemplate來做到這一點。我猜我需要做類似的事情:

headers.set("Authorization", X); 

X應該在這裏?這是否是正確的方式來處理授權?

編輯:

這是我通過閱讀祕密的嘗試。結果是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

訪問令牌可能 – DaImTo

+0

我讀我的訪問令牌和投入的標題(即使用谷歌雲端硬盤的第三方客戶端,可悲的是不支持推送,當工作令牌)。沒有幫助。它可能是別的嗎? –

回答

1

正如@DalmTo所提到的,X代表令牌。關於Drive API的示例POST請求,請嘗試使用此SO thread的此代碼段。它也使用POST方法。

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

嘗試此操作時沒有任何運氣,可能是因爲這是指API的v2或其他內容? –

相關問題