Quel est un exemple d'utilisation de OAuth 2.0 et de Google Spreadsheet API avec Java?

Où est le code exemple montrant comment utiliser le Google Data Java Client Library et son soutien OAuth 2.0Google Spreadsheet API (maintenant appelé le Google Sheets API)?

16
demandé sur wescpy 2014-01-29 22:56:32

3 réponses

réponse déplacée de la question originale au format "Q and A" du site de correspondance.

Google Data Java Client LibraryOAuth 2.0. Malheureusement, il n'y a pas d'échantillons complets dans la bibliothèque montrant comment l'utiliser avec le Google Spreadsheet API.

Voici un exemple qui a fonctionné pour moi. J'espère que quelqu'un le trouverez utile.

import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeRequestUrl;
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeTokenRequest;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.auth.oauth2.GoogleTokenResponse;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.jackson.JacksonFactory;
import com.google.gdata.util.ServiceException;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.List;

public class NewClass {

  // Retrieve the CLIENT_ID and CLIENT_SECRET from an APIs Console project:
  //     https://code.google.com/apis/console
  static String CLIENT_ID = "your-client-id";
  static String CLIENT_SECRET = "your-client-secret";
  // Change the REDIRECT_URI value to your registered redirect URI for web
  // applications.
  static String REDIRECT_URI = "the-redirect-uri";
  // Add other requested scopes.
  static List<String> SCOPES = Arrays.asList("https://spreadsheets.google.com/feeds");


public static void main (String args[]) throws IOException, ServiceException, com.google.protobuf.ServiceException{
    Credential credencial = getCredentials();
    JavaApplication20.printDocuments(credencial);
}


  /**
   * Retrieve OAuth 2.0 credentials.
   * 
   * @return OAuth 2.0 Credential instance.
   */
  static Credential getCredentials() throws IOException {
    HttpTransport transport = new NetHttpTransport();
    JacksonFactory jsonFactory = new JacksonFactory();

    // Step 1: Authorize -->
    String authorizationUrl =
        new GoogleAuthorizationCodeRequestUrl(CLIENT_ID, REDIRECT_URI, SCOPES).build();

    // Point or redirect your user to the authorizationUrl.
    System.out.println("Go to the following link in your browser:");
    System.out.println(authorizationUrl);

    // Read the authorization code from the standard input stream.
    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    System.out.println("What is the authorization code?");
    String code = in.readLine();
    // End of Step 1 <--

    // Step 2: Exchange -->
    GoogleTokenResponse response =
        new GoogleAuthorizationCodeTokenRequest(transport, jsonFactory, CLIENT_ID, CLIENT_SECRET,
            code, REDIRECT_URI).execute();
    // End of Step 2 <--

    // Build a new GoogleCredential instance and return it.
    return new GoogleCredential.Builder().setClientSecrets(CLIENT_ID, CLIENT_SECRET)
        .setJsonFactory(jsonFactory).setTransport(transport).build()
     .setAccessToken(response.getAccessToken()).setRefreshToken(response.getRefreshToken());
  }

  // …
}

Voici l'autre classe:

import com.google.api.client.auth.oauth2.Credential;
import com.google.gdata.client.docs.DocsService;
import com.google.gdata.client.spreadsheet.SpreadsheetService;
import com.google.gdata.data.docs.DocumentListEntry;
import com.google.gdata.data.docs.DocumentListFeed;
import com.google.gdata.data.docs.SpreadsheetEntry;
import com.google.gdata.data.spreadsheet.CellEntry;
import com.google.gdata.data.spreadsheet.CellFeed;
import com.google.gdata.data.spreadsheet.SpreadsheetFeed;
import com.google.gdata.data.spreadsheet.WorksheetEntry;
import com.google.gdata.data.spreadsheet.WorksheetFeed;
import com.google.gdata.util.ServiceException;
// ...
import java.io.IOException;
import java.net.URL;
import java.util.List;
// ...

public class JavaApplication20 {
  // …

  static void printDocuments(Credential credential) throws IOException, ServiceException {
    // Instantiate and authorize a new SpreadsheetService object.

     SpreadsheetService service =
            new SpreadsheetService("Aplication-name");
     service.setOAuth2Credentials(credential);
    // Send a request to the Documents List API to retrieve document entries.
    URL SPREADSHEET_FEED_URL = new URL(
        "https://spreadsheets.google.com/feeds/spreadsheets/private/full");
    // Make a request to the API and get all spreadsheets.
    SpreadsheetFeed feed = service.getFeed(SPREADSHEET_FEED_URL,
        SpreadsheetFeed.class);
    List<com.google.gdata.data.spreadsheet.SpreadsheetEntry> spreadsheets = feed.getEntries();
     if (spreadsheets.isEmpty()) {
      // TODO: There were no spreadsheets, act accordingly.
    }
com.google.gdata.data.spreadsheet.SpreadsheetEntry spreadsheet = spreadsheets.get(0);
    System.out.println(spreadsheet.getTitle().getPlainText());
// Get the first worksheet of the first spreadsheet.
    // TODO: Choose a worksheet more intelligently based on your
    // app's needs.
    WorksheetFeed worksheetFeed = service.getFeed(
        spreadsheet.getWorksheetFeedUrl(), WorksheetFeed.class);
    List<WorksheetEntry> worksheets = worksheetFeed.getEntries();
    WorksheetEntry worksheet = worksheets.get(0);

    // Fetch the cell feed of the worksheet.
    URL cellFeedUrl = worksheet.getCellFeedUrl();
    CellFeed cellFeed = service.getFeed(cellFeedUrl, CellFeed.class);

    // Iterate through each cell, printing its value.
    for (CellEntry cell : cellFeed.getEntries()) {
      // Print the cell's address in A1 notation
      System.out.print(cell.getTitle().getPlainText() + "\t");
      // Print the cell's address in R1C1 notation
      System.out.print(cell.getId().substring(cell.getId().lastIndexOf('/') + 1) + "\t");
      // Print the cell's formula or text value
      System.out.print(cell.getCell().getInputValue() + "\t");
      // Print the cell's calculated value if the cell's value is numeric
      // Prints empty string if cell's value is not numeric
      System.out.print(cell.getCell().getNumericValue() + "\t");
      // Print the cell's displayed value (useful if the cell has a formula)
      System.out.println(cell.getCell().getValue() + "\t");
    }

  }

  // ...
}
7
répondu ErstwhileIII 2014-08-23 00:08:51

Vous pouvez trouver une explication étape par étape, avec des exemples ici. En conséquence, votre code pourrait ressembler à ceci:

SpreadsheetService service = new SpreadsheetService("MySpreadsheetIntegration-v1");
service.setProtocolVersion(SpreadsheetService.Versions.V1); // It's important to specify the version

service.setRequestFactory(makeAuthorization());

SpreadsheetQuery q = new SpreadsheetQuery(new URL(DEFAULT_SPREADSHEET_QUERY));

SpreadsheetFeed feed;
try {
  feed = service.query(q, SpreadsheetFeed.class);
}
catch (AuthenticationException e) {
  refreshAccessToken(service);

  feed = service.query(q, SpreadsheetFeed.class);
}

SpreadsheetEntry spreadsheet = findSpreadSheet(feed);

...

// do your stuff

...

// a couple of utility methods are used above:

private void refreshAccessToken(SpreadsheetService service) throws Exception {
  String accessToken = callGetAccessTokenApi();

  // save access token

  service.getRequestFactory().setAuthToken(new GoogleAuthTokenFactory.OAuth2Token(new GoogleCredential().setAccessToken(accessToken)));
}

//private static final String GOOGLE_API_HOST = "https://www.googleapis.com/";

private String callGetAccessTokenApi() throws Exception {
  HttpClient client = HttpClients.createDefault();

  String url = String.format(
    "%soauth2/v3/token?client_id=%s&client_secret=%s&refresh_token=%s&grant_type=refresh_token",
    GOOGLE_API_HOST,
    googleAuthorization.getClientId(),
    googleAuthorization.getClientSecret(),
    googleAuthorization.getRefreshToken()
  );
  HttpPost post = new HttpPost(url);
  post.addHeader(ACCEPT_HEADER_NAME, "application/x-www-form-urlencoded");

  try {
    HttpResponse response = client.execute(post);

    JSONObject object = readJson(response);

    return object.getString("access_token");
  }
  finally {
    post.releaseConnection();
  }
}

private Service.GDataRequestFactory makeAuthorization() {
  Service.GDataRequestFactory requestFactory = new HttpGDataRequest.Factory();

  // load access token

  requestFactory.setAuthToken(new GoogleAuthTokenFactory.OAuth2Token(new GoogleCredential().setAccessToken(accessToken)));

  return requestFactory;
}
1
répondu Alex 2015-10-07 06:59:52

(Dec 2016) une grande partie de cette question et la plupart des réponses ici sont maintenant périmées car: 1)GData APIs sont la génération précédente D'API Google. Bien que tous les API GData n'aient pas été dépréciés, moderne Google APIspas utiliser le protocole de données Google; et 2) Google a publié une nouvelle API Google Sheets API v4 (pas GData) en 2016. Pour utiliser la nouvelle API, vous devez obtenir la Google Api de la Bibliothèque du Client pour Java et utiliser la dernière Sheets API, qui est beaucoup plus puissant et flexible que n'importe quelle API précédente.

Ici notre exemple de code Java Quickstart pour vous aider à utiliser L'API -- il y a aussi du code OAuth2. Aussi, voici la référence JavaDocs pour L'API Sheets qui décrit toutes les classes à votre disposition. Si vous n'êtes pas "allergique" au Python, j'ai aussi fait une vidéo de marche a travers le code d'autorisation D'OAuth et une autre paire de vidéos avec plus d'exemples du "monde réel" en utilisant L'API Sheets:

le la dernière API fournit des fonctionnalités non disponibles dans les versions plus anciennes, à savoir donner aux développeurs un accès programmatique à une feuille comme si vous utilisiez l'interface utilisateur (créer des lignes gelées, effectuer le formatage de cellules, redimensionner des lignes/colonnes, ajouter des tables pivotantes, créer des graphiques, etc.) Notez également que cette API est principalement pour les opérations programmatiques de tableur et la fonctionnalité comme décrit ci-dessus.

pour effectuer l'accès au niveau du fichier tels que les téléchargements et les téléchargements, les importations et les exportations (même que les téléchargements & téléchargements mais conversion vers / à partir de différents formats), vous utiliseriez le API GoogleDrive au lieu de cela, et voici une paire d'exemples que j'ai créé (aussi Python):

  • (simple) exporter une feuille Google comme CSV (blog)
  • (intermédiaire) "Pauvre homme en texte brut au format PDF convertisseur (blog) (*)

(*) - TL;DR: charger le fichier de texte en clair pour le Lecteur, l'importation/convertir au format Google documents, puis à l'exportation ce Doc en format PDF. Post above utilise Drive API v2; ce post décrit sa migration vers API v3, et voici un développeur vidéo combinaison des deux poteaux.

pour en savoir plus sur la façon D'utiliser Google APIs (principalement Python ou JavaScript), consultez la variété de vidéos de développeurs Google ( série 1 et série 2) je produis.

0
répondu wescpy 2016-12-02 03:15:32