真的卡在这里。该代码由Google提供的示例构建:
public static void main(String[] args) {
try {
HttpTransport httpTransport = new NetHttpTransport();
JsonFactory jsonFactory = new JacksonFactory();
GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
httpTransport, jsonFactory, CLIENT_ID, CLIENT_SECRET, Arrays.asList(DriveScopes.DRIVE))
.setAccessType("online")
.setApprovalPrompt("auto")
.build();
String url = flow.newAuthorizationUrl().setRedirectUri(REDIRECT_URI).build();
System.out.println("Please open the following URL in your browser then type the authorization code:");
System.out.println(" " + url);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String code = br.readLine();
GoogleTokenResponse response = flow.newTokenRequest(code).setRedirectUri(REDIRECT_URI).execute();
GoogleCredential credential = new GoogleCredential().setFromTokenResponse(response);
//Create a new authorized API client
Drive service = new Drive.Builder(httpTransport, jsonFactory, credential).setApplicationName("Google Push").build();
//Insert a file
File body = new File();
body.setTitle("My document");
body.setDescription("A test document");
body.setMimeType("text/plain");
java.io.File fileContent = new java.io.File("document.txt");
BufferedWriter bw = new BufferedWriter(new FileWriter(fileContent));
bw.write("allo!!!!");
bw.close();
System.out.println("file created? -> " + fileContent.createNewFile());
FileContent mediaContent = new FileContent("text/plain", fileContent);
File file = service.files().insert(body, mediaContent).execute();
System.out.println("File ID: " + file.getId());
watchChange(service, "channelId", "web_hook", "https://clementlevallois.net/notifications"); // line 78
} catch (IOException ex) {
Logger.getLogger(DriveCommandLine.class.getName()).log(Level.SEVERE, null, ex);
}
}
private static Channel watchChange(Drive service, String channelId, String channelType, String channelAddress) {
Channel channel = new Channel();
channel.setId(channelId);
channel.setType(channelType);
channel.setAddress(channelAddress);
try {
return service.changes().watch(channel).execute(); //line 91
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
堆栈跟踪:
com.google.api.client.googleapis.json.GoogleJsonResponseException: 401 Unauthorized
at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:145)
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113)
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest$1.interceptResponse(AbstractGoogleClientRequest.java:312)
at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1049)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:410)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:343)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:460)
at Controller.DriveCommandLine.watchChange(DriveCommandLine.java:91)
at Controller.DriveCommandLine.main(DriveCommandLine.java:78)
答案 0 :(得分:1)
API在调用Drive API时返回HTTP 401或HTTP 403响应。这些错误可能表明以下任何一个:
令牌到期, 令牌撤销,(这会导致访问令牌和刷新令牌停止工作), 令牌未获得所需范围的授权, 使用OAuth 2.0协议未正确授权请求。
可以通过调用refreshToken()来处理令牌到期。如果该呼叫失败并且出现"无效凭证"
答案 1 :(得分:0)
以下是一些可帮助您解决问题的步骤:
- 访问您的Google Apps帐户可能会关闭您的文档API访问权限。
- 尝试验证您的令牌和密钥,然后重定向网址。
答案 2 :(得分:-1)
credential.getRequestInitializer()为null检查
阅读这篇文章101%帮助您