我有一个Java Web服务器,它使用的是Google Calendar。我正在尝试开发一个包含N个日历的网络应用程序,其中网络应用程序可以创建自己的日历,在那里它可以编辑它并与应用程序的用户共享。
我怀疑的是,Google Web API是否可以拥有自己的Google资源(Calendars,Docs,Spread ...),或者只能处理用户的资源。
如果答案是肯定的¿如何创造它?按照Google日历API和Google API网络应用凭据,我尝试获取日历列表并创建一个日历,但OAuth服务器响应包含401未经授权的错误。
我举了一个代码示例:
public class CalendarQuickstart {
private static final String APPLICATION_NAME = "Apps Script";
private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
private static final String TOKENS_DIRECTORY_PATH = "tokens";
/**
* Global instance of the scopes required by this quickstart. If modifying these
* scopes, delete your previously saved tokens/ folder.
*/
private static final List<String> SCOPES = Collections.singletonList(CalendarScopes.CALENDAR);
private static final String CREDENTIALS_FILE_PATH = "/ReservaSalaKeys.json";
/**
* Creates an authorized Credential object.
*
* @param HTTP_TRANSPORT
* The network HTTP Transport.
* @return An authorized Credential object.
* @throws IOException
* If the credentials.json file cannot be found.
*/
private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException {
// Load client secrets.
InputStream in = CalendarQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH);
GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));
// Build flow and trigger user authorization request.
GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, JSON_FACTORY,
clientSecrets, SCOPES)
.setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH)))
.setAccessType("offline").build();
return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user");
}
public static void main(String... args) throws IOException, GeneralSecurityException {
// Build a new authorized API client service.
final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
Calendar service = new Calendar.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT))
.setApplicationName(APPLICATION_NAME).build();
Iterator<CalendarListEntry> it = service.calendarList().list().execute().getItems().iterator();
while(it.hasNext()) {
System.out.println(it.next().getSummary());
}
int numberOfCalendars = service.calendarList().list().size();
service.calendars().insert(
new com.google.api.services.calendar.model.Calendar().setSummary("Calendario " + numberOfCalendars + 1))
.execute();
}
谢谢!!
您的错误与凭据有关。 401 error表示您使用的访问令牌已过期或无效。主要检查建议的操作:
- 使用长期刷新令牌获取新的访问令牌。
- 如果失败,请引导用户完成OAuth流程,如Authorizing requests with OAuth 2.0中所述。
- 如果您在服务帐户中看到此信息,请检查您是否已成功完成service account page中的所有步骤。