java - 如何使用新的 Google Photos API 获取用户的相册列表
问题描述
我想从 Google 照片中获取我的相册列表。我正在使用新的 REST API。
我编写了执行 GET 请求的代码:
GET
https://photoslibrary.googleapis.com/v1/albums
根据官方指南:https
://developers.google.com/photos/library/guides/list
并且此代码仅返回状态为 200 的响应,但没有 json 正文:
清单:
public static void main(String[] args) throws IOException, GeneralSecurityException, ServiceException, ParseException {
GoogleCredential credential = createCredential();
if (!credential.refreshToken()) {
throw new RuntimeException("Failed OAuth to refresh the token");
}
System.out.println(credential.getAccessToken());
doGetRequest(credential.getAccessToken(), "https://photoslibrary.googleapis.com/v1/albums");
}
private static GoogleCredential createCredential() {
try {
return new GoogleCredential.Builder()
.setTransport(HTTP_TRANSPORT)
.setJsonFactory(JSON_FACTORY)
.setServiceAccountId(emailAccount)
.setServiceAccountPrivateKeyFromP12File(ENCRYPTED_FILE)
.setServiceAccountScopes(SCOPE)
.setServiceAccountUser(emailAccount)
.build();
} catch (Exception e) {
throw new RuntimeException("Error while creating Google credential");
}
}
private static void doGetRequest(String accessToken, String url) throws IOException, ParseException {
logger.debug("doGetRequest, with params: url: {}, access token: {}", accessToken, url);
HttpGet get = new HttpGet(url);
get.addHeader("Authorization",
"Bearer" + " " + accessToken);
HttpClient client = HttpClientBuilder.create().build();
HttpResponse response = client.execute(get);
String json = EntityUtils.toString(response.getEntity());
System.out.println(json);
}
我也尝试使用其他 REST 客户端(例如 Postman),我收到的相同结果是:
{}
解决方案
看起来您正在使用服务帐户来访问 API。Google Photos Library API 不支持服务帐户。
您需要为Web 应用程序设置 OAuth 2.0,如下所述:
- 转到Google Developers 控制台并打开您的项目
- 从菜单转到凭据页面
- 单击创建凭据> OAuth 客户端 ID
- 将应用程序类型设置为Web 应用程序并填写表单。还要为您的应用程序指定一个重定向 URI,以接收来自 OAuth 请求的回调和您的应用程序的 URI。
然后,您将在此页面上使用client Id
和client secret
返回作为您请求的一部分。如果您需要离线访问,即用户不在浏览器中时访问,您还可以请求一个offline
access_type
并使用refresh tokens
来保持访问。
看起来您正在使用 Google API Java 客户端,它也支持此流程。通过如下调用在构建器上设置客户端机密setClientSecrets(..)
:
return new GoogleCredential.Builder()
.setTransport(HTTP_TRANSPORT)
.setJsonFactory(JSON_FACTORY)
.setClientSecrets(CLIENT_ID, CLIENT_SECRET)
.build();
您还需要在应用程序中处理来自 OAuth 请求的回调,您将在开发者控制台中配置的回调 URL中接收访问令牌。
客户端库的文档中还有一个更完整的示例。
推荐阅读
- linux - 尝试使用自定义 DTB 构建 core-image-minimal 时出现 Makefile 错误
- html - sass 有没有办法根据其父级的背景色更改按钮的背景色?
- java - Java - 如何使 .jar 文件使用外部 .txt 文件?
- javascript - React-Native 文本无缘无故被垂直切断
- apache-kafka - 加入两个 Kafka 流
- java - Java 8、Drools 5.x 和 Drools 7.x
- jsf - 现在需要 faces-config.xml 和 web.xml 吗?
- javascript - 如何从组件循环向主父 Angular 5 发出事件
- reactjs - 从 Firestore 集合中读取太慢
- reporting-services - SSRS (Winforms - RDLC) 2016. 根据行数据控制页脚内容