0

私は今どこにも行きません。「Google App Engine から Google スプレッドシートにデータをエクスポートする」のサンプルを探して Google で検索すると、Google Conversion API、Google Conversion API、Google Spreadsheet API、Google Docs API のチュートリアルがたくさん表示されます。しかし、Googleサイトで確認すると、それらはすべてGoogleから廃止されましたか??? それで、私がそれを利用できるように、現在最も更新されているものは何ですか?

=====

さて、OAuth2 経由で Google Drive SDK を使用してテキスト ファイルを作成します。しかし、私はこれに問題があります:

これはエラーです:


java.net.URI$Parser.parse(URI.java:3004)
でのjava.lang.NullPointerException。com.google.api.client.http.GenericUrl
.(
com.google.api.services.drive.Drive
$Files$Insert.executeUnparsed(Drive . java:309)
com.google.api.services.drive.Drive$Files$Insert.execute(Drive.java:331)
で com.company.dashboard.service.DriveService.initDoc(DriveService.java:84) で

これはコードです:

private GoogleCredential buildGoogleCredential(Credential credential) {
    try {
        logger.warning(oauth2Service.getClientCredential().toString());
        GoogleCredential googleCredential = new GoogleCredential.Builder()
                                                .setClientSecrets(oauth2Service.getClientCredential())
                                                .setTransport(new NetHttpTransport())
                                                .setJsonFactory(new JacksonFactory()).build();

        googleCredential.setAccessToken(credential.getAccessToken());
        googleCredential.setRefreshToken(credential.getRefreshToken());

        return googleCredential;

    } catch (IOException e) {
        e.printStackTrace();
    }

    return null;
}

private Drive buildService(GoogleCredential credential) {

    return new Drive.Builder(new NetHttpTransport(), new JacksonFactory(), credential).build();
}

public void initDoc(HttpServletRequest req) 
        throws Exception {
    User user = UserServiceFactory.getUserService().getCurrentUser();

    Credential credential = oauth2Service.getStoredCredential(
            user.getUserId(), 
            (CredentialStore)req.getSession().getServletContext().getAttribute(OAuth2Constant.GOOG_CREDENTIAL_STORE));

    if (credential != null) {
        logger.warning("Using access token: " + credential.getAccessToken());

        try {
            GoogleCredential googleCredential = buildGoogleCredential(credential);

            Drive service = buildService(googleCredential);

            if (service == null) {
                logger.warning("very bad!");
            }

            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");
            FileContent mediaContent = new FileContent("text/plain", fileContent);

            service.files().insert(body, mediaContent).execute();
            //File file = service.files().insert(body, mediaContent).execute();
            //System.out.println("File ID: " + file.getId());

        } catch (HttpResponseException e) {
          if (e.getStatusCode() == 401) {
              logger.warning(e.getMessage());
            // Credentials have been revoked.
            // TODO: Redirect the user to the authorization URL.
            throw new UnsupportedOperationException();
          }
        } catch (IOException e) {
          System.out.println("An error occurred: " + e);
        }
    }

oauth2Service.getClientCredential() が返す (xxx = クライアント ID とクライアント シークレット コード、ここには示されていません)

{"web":{"client_id":"xxx.apps.googleusercontent.com","client_secret":"xxx"}}

これは私の範囲です:

final static List<String> SCOPES = Arrays.asList("https://www.googleapis.com/auth/userinfo.profile", 
                                                 "https://www.googleapis.com/auth/userinfo.email",
                                                 "https://www.googleapis.com/auth/drive",
                                                 "https://www.googleapis.com/auth/docs",
                                                 "https://www.googleapis.com/auth/drive.file");
final static String AUTH_RESOURCE_LOC = "/client_secrets.json";
final static String OATH_CALLBACK = "http://localhost:8888/oauth2callback";

この行

service.files().insert(body, mediaContent).execute();

NullPointerException をスローします。何がうまくいかなかったのか?

P/S: Credential = com.google.api.client.auth.oauth2.Credential. 私はOAuth2を持っていますが、すべてうまくいきます。問題なくユーザー情報を取得できますが、Drive API は取得できません。ご覧のとおり、サービスはnullではありません。ログに「非常に悪い」と入れて表示されていません。401 例外がスローされないということは、私の Oauth2 がスコープに適していることを意味します。

=======

ダーン!!!! ついに問題が解決しました!!! 私のコードは完全に正しかったです!間違った API を有効にしただけです。Drive SDK API ではなく Drive API である必要があります:/

4

1 に答える 1