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); }
更多信息:
- 这是一个服务帐户。 它具有所有者权限
- 我在本地电脑上使用它
- drive.files()。list()工作正常
- 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 )中所述:
要使用推送通知,您需要做三件事:
注册接收URL的域名。 …
设置接收URL或“Webhook”回调接收器。
这是一个HTTPS服务器,用于处理资源更改时触发的API通知消息。
为要监视的每个资源端点设置通知通道。
通道指定通知消息的路由信息。 作为频道设置的一部分,您可以标识要接收通知的特定URL。 每当频道的资源发生变化时,Drive API会向该URL发送一条通知消息作为POST请求。
这意味着你应该有一个域名,你应该在google上确认它,然后才能使用watch API。
PS我仍然认为响应GoogleJsonResponseException: 401 Unauthorized
在这种情况下是荒谬的,但希望它能帮助其他面临同样问题的人。