drive.changes()。watch返回GoogleJsonResponseException:401未经授权而没有任何消息

我正在尝试关注Google云端硬盘的变化,并获得401例外。 在这里搜索,我发现人们有详细的信息,为什么他们没有未经授权,尽管我什么都没有。

这里我使用的代码:

public static void main(String[] args) { try { httpTransport = GoogleNetHttpTransport.newTrustedTransport(); dataStoreFactory = new FileDataStoreFactory(DATA_STORE_DIR); // authorization GoogleCredential credential = GoogleCredential.getApplicationDefault() .createScoped(DriveScopes.all()); boolean refreshed = credential.refreshToken(); // set up the global Drive instance drive = new Drive.Builder(httpTransport, JSON_FACTORY, credential) .setApplicationName(APPLICATION_NAME) .build(); Channel channel = new Channel(); channel.setId(UUID.randomUUID().toString()); channel.setType("web_hook"); //my ip here channel.setAddress("https://com.example:"); StartPageToken pageToken = drive.changes().getStartPageToken().execute(); System.out.println(pageToken.getStartPageToken()); Channel changesChannel = drive.changes().watch(pageToken.getStartPageToken(), channel).execute(); System.out.println(changesChannel.getExpiration()); return; } catch (IOException e) { System.err.println(e.getMessage()); e.printStackTrace(); } catch (Throwable t) { t.printStackTrace(); } System.exit(1); } 

更多信息:

  1. 这是一个服务帐户。 它具有所有者权限
  2. 我在本地电脑上使用它
  3. drive.files()。list()工作正常
  4. drive.about()。get()工作正常

而我得到的例外:

com.google.api.client.googleapis.json.GoogleJsonResponseException:401在com.google.api.client.client.googleapis上的com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:145)未经授权。 services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113)位于com.google.api.client.client.googleapis的com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40)。 services.AbstractGoogleClientRequest $ 1.interceptResponse(AbstractGoogleClientRequest.java:321)at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1065)at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed (AbstractGoogleClientRequest.java:419)位于com.google.api.client.google上的com.google.api.client.google上有一个com.google.api.client.google上的com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352) 在main.lambda.GoogleDrive2.main上的ClientRequest.execute(AbstractGoogleClientRequest.java:469)(MyClass.java:142)

我的pom.xml依赖项:

  com.google.api-client google-api-client 1.20.0   com.google.oauth-client google-oauth-client 1.22.0    com.google.api-client google-api-client-extensions 1.6.0-beta   com.google.oauth-client google-oauth-client-jetty 1.22.0   com.google.apis google-api-services-drive v3-rev70-1.22.0  

花了几个小时后仔细阅读文档,我终于找到了问题所在。

如推送通知文档( https://developers.google.com/drive/v3/web/push )中所述:

要使用推送通知,您需要做三件事:

  1. 注册接收URL的域名。 …

  2. 设置接收URL或“Webhook”回调接收器。

    这是一个HTTPS服务器,用于处理资源更改时触发的API通知消息。

  3. 为要监视的每个资源端点设置通知通道。

    通道指定通知消息的路由信息​​。 作为频道设置的一部分,您可以标识要接收通知的特定URL。 每当频道的资源发生变化时,Drive API会向该URL发送一条通知消息作为POST请求。

这意味着你应该有一个域名,你应该在google上确认它,然后才能使用watch API。

PS我仍然认为响应GoogleJsonResponseException: 401 Unauthorized在这种情况下是荒谬的,但希望它能帮助其他面临同样问题的人。