Google 的授权推动 Java 的推送通知

Authorization for Google Drive Push Notifications for 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);

我之前一直在使用 Googles Drive 库来访问文件。在那些情况下,我不需要以 "manual" 的方式创建请求。我已经使用 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();
    }

正如@DalmTo 提到的,X 代表代币。关于示例 POST 对驱动器 API 的请求,请尝试此 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);
}