[英]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):
(*) - 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.