简体   繁体   English

在Java中使用OAuth 2.0和Google Spreadsheet API的示例是什么?

[英]What is an example of using OAuth 2.0 and Google Spreadsheet API with Java?

示例代码在哪里显示如何使用Google Data Java Client Library及其对OAuth 2.0支持与Google Spreadsheet API (现在称为Google Sheets API )?

Answer moved from original question to match site "Q and A" format. 答案从原始问题移至匹配网站“Q和A”格式。

The Google Data Java Client Library supports OAuth 2.0 . Google Data Java Client Library支持OAuth 2.0 Unfortunately, there are no complete samples in the library showing how to use it with the Google Spreadsheet API . 不幸的是,图书馆中没有完整的示例显示如何将其与Google Spreadsheet API

Here is an example that has worked for me. 这是一个对我有用的例子。 I hope someone find it helpful. 我希望有人觉得有帮助。

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());
  }

  // …
}

Here the other Class: 这里是其他类:

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");
    }

  }

  // ...
}

You can find a step by step explanation with examples here . 您可以在此处找到带有示例的分步说明。 As a result, your code might look like this: 因此,您的代码可能如下所示:

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;
}

(Dec 2016) Much of this question and most answers here are now out-of-date as: 1) GData APIs are the previous generation of Google APIs. (2016年12月)这里的大部分问题和大多数答案都已经过时了:1) GData API是上一代Google API。 While not all GData APIs have been deprecated, all modern Google APIs do not use the Google Data protocol ; 虽然并非所有GData API都已弃用,但所有现代 Google API 都不使用Google数据协议 and 2) Google released a new Google Sheets API v4 (not GData) in 2016. In order to use the new API, you need to get the Google APIs Client Library for Java and use the latest Sheets API , which is much more powerful and flexible than any previous API. 2)Google于2016年发布了新的Google表格API v4 (而不是GData)。为了使用新的API,您需要获取适用于Java的Google API客户端库,并使用最新的Sheets API ,它更强大,比任何以前的API灵活。

Here's our Java Quickstart code sample to help you get going on using the API -- there's OAuth2 code in it too. 这是我们的Java Quickstart代码示例 ,可帮助您继续使用API​​ - 其中也包含OAuth2代码。 Also, here are the JavaDocs reference for the Sheets API which outlines all the classes at your disposal. 此外,这里是Sheets API的JavaDocs参考,它概述了您可以使用的所有类。 If you're not "allergic" to Python, I've also made a video walking through the OAuth authorization code and another pair of videos with more "real-world" examples using the Sheets API: 如果您对Python没有“过敏”,我还使用Sheets API制作了一段视频,其中介绍了OAuth授权代码以及另一对包含更多“真实世界”示例的视频:

The latest API provides features not available in older releases, namely giving developers programmatic access to a Sheet as if you were using the user interface (create frozen rows, perform cell formatting, resizing rows/columns, adding pivot tables, creating charts, etc.) Also note this API is primarily for programmatic spreadsheet operations & functionality as described above. 最新的API提供旧版本中不可用的功能,即为开发人员提供对Sheet的编程访问,就像您使用用户界面一样(创建冻结行,执行单元格格式化,调整行/列大小,添加数据透视表,创建图表等)。 )另请注意,此API主要用于如上所述的编程电子表格操作和功能。

To perform file-level access such as uploads & downloads, imports & exports (same as uploads & downloads but conversion to/from various formats), you would use the Google Drive API instead, and here are a pair of examples I've created (also Python): 要执行文件级访问,例如上传和下载,导入和导出(与上传和下载相同,但转换为各种格式),您可以使用Google Drive API ,这里是我创建的一对示例(也是Python):

  • (simple) Exporting a Google Sheet as CSV ( blogpost ) (简单)将Google表格导出为CSV( 博文
  • (intermediate) "Poor man's plain text to PDF" converter ( blogpost ) (*) (中级)“穷人的纯文本到PDF”转换器( blogpost )(*)

(*) - TL;DR: upload plain text file to Drive, import/convert to Google Docs format, then export that Doc as PDF. (*) - TL; DR:将纯文本文件上传到云端硬盘,导入/转换为Google文档格式,然后将该文档导出为PDF格式。 Post above uses Drive API v2; 上面的帖子使用Drive API v2; this follow-up post describes migrating it to Drive API v3, and here's a developer video combining both posts. 这篇后续帖子描述了将其迁移到Drive API v3,这是一个结合两个帖子的开发者视频

To learn more about how to use Google APIs (mostly Python or JavaScript), check out the variety of Google developer videos ( series 1 and series 2 ) I'm producing. 要了解有关如何使用Google API(主要是Python或JavaScript)的更多信息,请查看我正在制作的各种Google开发人员视频( 系列1系列2 )。

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

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