繁体   English   中英

从 App Engine Endpoints 访问 Google API (Java)

[英]Access Google API from App Engine Endpoints (Java)

我想调用 Google Calendar API App Engine Java Endpoints。 这是我用于调用 Google 日历的(不完整的)实用程序类。 我正在尝试从经过身份验证的端点检索或创建特定于我的应用程序“Zeppa”的用户 Google 日历。 我通过调用 zeppaCalendarEntry(User) 来做到这一点,其中 user 是来自经过身份验证的调用的用户实例。 API 控制台启用了日历 API,并且 client_secrets.json 文件用于 App Engine 和服务帐户。

获取客户端凭据时发生错误,返回空的 InputStream。 任何对标准程序或修复的引用都会很棒。

class ZeppaCalendarUtils {



private ZeppaCalendarUtils() {
    }

    /**
     * Global instance of the {@link DataStoreFactory}. The best practice is to
     * make it a single globally shared instance across your application.
     */
    private static final AppEngineDataStoreFactory DATA_STORE_FACTORY = AppEngineDataStoreFactory
            .getDefaultInstance();

    /** Global instance of the HTTP transport. */
    static final HttpTransport HTTP_TRANSPORT = new UrlFetchTransport();

    /** Global instance of the JSON factory. */
    static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();

    private static GoogleClientSecrets clientSecrets = null;

    /**
     * Creates a new Google Calendar for user
     * @param calendarClient
     * @return
     * @throws GeneralSecurityException
     * @throws IOException
     */
    private static CalendarListEntry createZeppaCalendarEntry(
            Calendar calendarClient) throws GeneralSecurityException,
            IOException {

        CalendarListEntry content = new CalendarListEntry();
        content.setAccessRole(Constants.CALENDAR_ACCESS_ROLE);
        content.setBackgroundColor(Constants.CALENDAR_COLOR_BACKGROUND);
        content.setForegroundColor(Constants.CALENDAR_COLOR_FOREGROUND);
        content.setDefaultReminders(Constants.CALENDAR_DEFAULT_REMINDERS);
        content.setSelected(Constants.CALENDAR_SELECTED);
        content.setSummary("Zeppa");
        content.setId(Constants.CALENDAR_ID);

        CalendarListEntry result = calendarClient.calendarList()
                .insert(content).execute();

        return result;

    }

    /**
     * Retrieve or create a Users calendar
     * @param user
     * @return
     * @throws GeneralSecurityException
     * @throws IOException
     */
    public static CalendarListEntry zeppaCalendarEntry(User user)
            throws GeneralSecurityException, IOException {

        Calendar calendarClient = loadCalendarClient(user.getUserId());
        CalendarListEntry result = calendarClient.calendarList()
                .get(Constants.CALENDAR_ID).execute();

        if (result == null) {
            result = createZeppaCalendarEntry(calendarClient);
        }

        return result;
    }

    /**
     * Retrieve a Client Secrets
     * @return
     * @throws IOException
     */
    static GoogleClientSecrets getClientCredential() throws IOException {
        if (clientSecrets == null) {

            InputStream stream = ZeppaCalendarUtils.class
                    .getResourceAsStream("client_secrets.json");

            Reader clientSecretReader = new InputStreamReader(stream);
            clientSecrets = GoogleClientSecrets.load(JSON_FACTORY,
                    clientSecretReader);
        }
        return clientSecrets;
    }

    /**
     * Generate the calendar client for calls to the API
     * @param userId
     * @return
     * @throws IOException
     */
    private static Calendar loadCalendarClient(String userId)
            throws IOException {
        Credential credential = newAuthFlow().loadCredential(userId);
        return new Calendar.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)
                .build();
    }


    /**
     * Create an auth flow
     * @return
     * @throws IOException
     */
    private static GoogleAuthorizationCodeFlow newAuthFlow() throws IOException {
        return new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT,
                JSON_FACTORY, getClientCredential(),
                Collections.singleton(CalendarScopes.CALENDAR))
                .setDataStoreFactory(DATA_STORE_FACTORY)
                .setAccessType("offline").build();
    }

}

如果您检查文档推荐的从 App Engine 连接到 Google API 的方法,您会发现它没有使用类加载器的getResourceAsStream ,而是在File对象上使用FileInputStream 尝试使用它,看看它是否停止返回 null。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM