示例代码在哪里显示了如何使用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<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());
}
// …
}
这里的另一类:
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");
}
}
// ...
}
您可以在这里找到一个循序渐进的解释和示例。因此,您的代码可能如下所示:
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是上一代谷歌API。虽然不是所有的GData API都被弃用,但所有现代谷歌API都不使用谷歌数据协议;2)谷歌于2016年发布了新的谷歌表单API v4(非GData)。为了使用新的API,您需要获得Google API Client Library for Java,并使用最新的Sheets API,它比以前的API更强大、更灵活。
下面是我们的Java Quickstart代码示例,可以帮助您继续使用API——其中还有OAuth2代码。此外,这里还有Sheetsneneneba API的JavaDocs参考,它概述了您可以使用的所有类。如果你对Python不"过敏",我还制作了一个视频,介绍了OAuth授权代码,并使用Sheets API:制作了另一对视频,其中包含更多"真实世界"的示例
- 访问Google API:常见代码演练(代码深度挖掘文章)
- 将SQL数据迁移到工作表(代码深度挖掘文章)
- 使用Sheetsneneneba API设置文本格式(代码深潜文章)
最新的API提供了旧版本中不可用的功能,即允许开发人员像使用用户界面一样对工作表进行编程访问(创建冻结行、执行单元格格式设置、调整行/列大小、添加数据透视表、创建图表等)。此外,请注意,此API主要用于编程电子表格操作&如上所述的功能。
为了执行文件级访问,例如上传&下载,导入&导出(与上传和下载相同,但转换为各种格式),您将使用Google Drive API代替,下面是我创建的两个示例(也是Python):
- (简单)将Google工作表导出为CSV(博客文章)
- (中间)"穷人的纯文本到PDF"转换器(博客文章)(*)
(*)-TL;DR:将纯文本文件上传到Drive,导入/转换为谷歌文档格式,然后将该文档导出为PDF。以上帖子使用驱动器API v2;这篇后续文章描述了将其迁移到Drive API v3,下面是一个结合了这两篇文章的开发人员视频。
要了解更多关于如何使用Google API(主要是Python或JavaScript)的信息,请查看我正在制作的各种Google开发人员视频(系列1和系列2)。