java - 使用 Java 中的 Cloud Storage JSON API 在 Google 云中恢复上传文本文件,面临 403 错误代码禁止访问的问题
问题描述
我正在使用 Cloud Storage JSON API 的可恢复上传 api,如下面的代码中所述。
我已经在 bash 文件 GOOGLE_APPLICATION_CREDENTIALS = {json path}
当我尝试访问 google API 时,我收到了带有 403 代码的访问禁止错误。
我需要在上传功能中传递签名的网址吗?
RetryHttpInitializerWrapper 类,我找不到所以我通过了 HttpRequestInitializer httpRequestInitializer = null;
由于我确定的请求 URL,我正面临一些问题。
InputStreamContent mediaContent = new InputStreamContent(contentType, stream);
mediaContent.setLength(mediaContent.getLength());
GoogleCredential credential = GoogleCredential.getApplicationDefault();
if (credential.createScopedRequired()) {
credential = credential.createScoped(StorageScopes.all());
}
Storage client = StorageOptions.getDefaultInstance().getService();
HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
// custom HttpRequestInitializer for automatic retry upon failures.
HttpRequestInitializer httpRequestInitializer = null;
//HttpRequestInitializer httpRequestInitializer = new RetryHttpInitializerWrapper(credential);
GenericUrl requestUrl = new GenericUrl("https://www.googleapis.com/upload/storage/v1/b/"+bucket+"/o?uploadType=resumable&name="+name);
MediaHttpUploader uploader = new MediaHttpUploader(mediaContent, httpTransport, httpRequestInitializer);
uploader.setProgressListener(new CustomProgressListener());
HttpResponse response = uploader.upload(requestUrl);
if (!response.isSuccessStatusCode()) {
throw GoogleJsonResponseException.from(JSON_FACTORY, response);
}
解决方案
我已经使用身份验证标头解决了这个问题。如代码中所述,我们可以在调用上传方法时设置 auth 标头。
Credentials credentials = GoogleCredentials.fromStream(new FileInputStream(CLIENTSECRETS_LOCATION));
InputStreamContent mediaContent = new InputStreamContent(contentType, stream);
HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
HttpRequestInitializer httpRequestInitializer = null;
GenericUrl genericUrl = new GenericUrl(
"https://www.googleapis.com/upload/storage/v1/b/" + bucket + "/o?uploadType=resumable&name=" + name);
MediaHttpUploader uploader = new MediaHttpUploader(mediaContent, httpTransport, httpRequestInitializer);
HttpHeaders requestHeaders = new HttpHeaders();
credentials = ((GoogleCredentials) credentials).createScoped(StorageScopes.all());
Map<String, List<String>> credentialHeaders = credentials.getRequestMetadata();
if (credentialHeaders == null) {
return;
}
for (Map.Entry<String, List<String>> entry : credentialHeaders.entrySet()) {
String headerName = entry.getKey();
List<String> requestValues = new ArrayList<>();
requestValues.addAll(entry.getValue());
requestHeaders.put(headerName, requestValues);
}
HttpResponse response = uploader.setInitiationHeaders(requestHeaders).setDisableGZipContent(true)
.upload(genericUrl);
推荐阅读
- forms - 使用电子表格中最后记录的响应中的数据预填充谷歌表单字段
- java - 如何使用 Wildfly 上的远程 EJB 将有关调用者/客户端的一些信息发送到服务器端?
- wordpress - Wordpress - WP Query:meta_query 关系被忽略
- haskell - `pure x :: IO a` 是纯值还是具有副作用的值?
- ios - 输入值后隐藏键盘?
- python - python安装中的文件模块失败
- python - 在不破坏现有回调的情况下将额外的可选参数传递给回调
- javascript - 为新的一年计算一个新的日期,同时保持一周中的适当日期(即:星期一)
- protractor - Protractor .npm-global 错误:指定了多个配置文件
- vb.net - 将 Curl 的 --key 和 --cert 翻译成 VB.NET