将OAuth 2.0和Google Spreadsheet API与Jav​​a结合使用的示例是什么?

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

答案从原始问题移至匹配网站“Q和A”格式。

Google Data Java Client Library支持OAuth 2.0 。 不幸的是,图书馆中没有完整的示例显示如何将其与Google Spreadsheet API

这是一个对我有用的例子。 我希望有人觉得有帮助。

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

这里是其他类:

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

您可以在此处找到带有示例的分步说明。 因此,您的代码可能如下所示:

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

(2016年12月)这里的大部分问题和大多数答案都已经过时了:1) GData API是上一代Google API。 虽然并非所有GData API都已被弃用,但所有现代 Google API 都不使用Google数据协议 。 2)Google在2016年发布了新的Google表格API v4 (而不是GData)。为了使用新的API,您需要获取适用于Java的Google API客户端库,并使用最新的Sheets API ,它更强大,比任何以前的API都灵活。

这是我们的Java Quickstart代码示例 ,可帮助您继续使用API​​ – 其中也包含OAuth2代码。 此外,这里是Sheets API的JavaDocs参考,它概述了您可以使用的所有类。 如果您对Python不“过敏”,我还使用Sheets API制作了一段video,其中介绍了OAuth授权代码以及另一对包含更多“真实世界”示例的video:

  • 访问Google API:常见代码演练 (代码深度post )
  • 将SQL数据迁移到工作表 (代码深度post )
  • 使用Sheets API格式化文本 (代码深潜post )

最新的API提供旧版本中不可用的function,即为开发人员提供对Sheet的编程访问,就像使用用户界面一样(创建冻结行,执行单元格格式化,调整行/列大小,添加数据透视表,创建图表等)。 )另请注意,此API主要用于如上所述的编程电子表格操作和function。

要执行文件级访问,例如上传和下载,导入和导出(与上传和下载相同,但转换为各种格式),您可以使用Google Drive API ,这里是我创建的一对示例(也是Python):

  • (简单)将Google表格导出为CSV( blogpost )
  • (中级)“穷人的纯文本到PDF”转换器( blogpost )(*)

(*) – TL; DR:将纯文本文件上传到云端硬盘,导入/转换为Google文档格式,然后将该文档导出为PDF格式。 上面的post使用Drive API v2; 这篇后续文章描述了将其迁移到Drive API v3,这是一个结合两个post的开发者video 。

要了解有关如何使用Google API(主要是Python或JavaScript)的更多信息,请查看我正在制作的各种Google开发人员video( 系列1和系列2 )。