来自appengine问题的Google电子表格

时间:2013-07-14 05:03:23

标签: java google-app-engine gdata gdata-api google-spreadsheet-api

我想从appengine中读取特定的Google云端硬盘电子表格。正在使用来自网络客户端的Google选择器挑选电子表格。我试图通过标题使用查询来访问电子表格。标题将传递给我的appengine servlet,然后使用Gdata Java Client Lib进行查询。

关于appengine我有这个代码:

public static FeedURLFactory factory = FeedURLFactory.getDefault();
public static SpreadsheetService spreadsheetService= new SpreadsheetService("evermedcpr");

List scopes = Arrays.asList("https://spreadsheets.google.com/feeds"); 
AppIdentityService appIdentity = AppIdentityServiceFactory.getAppIdentityService();
AppIdentityService.GetAccessTokenResult accessToken = appIdentity.getAccessToken(scopes);

Credential creds = new Credential(BearerToken.authorizationHeaderAccessMethod());         
creds.setAccessToken(accessToken.getAccessToken());

SpreadsheetService ss = new SpreadsheetService("DBM4G-demo"); 
ss.setOAuth2Credentials(creds);

getSpreadsheet(spreadsheetName);


public SpreadsheetEntry getSpreadsheet(String spreadsheet)
      throws Exception {

      SpreadsheetQuery spreadsheetQuery 
        = new SpreadsheetQuery(new URL("https://spreadsheets.google.com/feeds/"));
      spreadsheetQuery.setTitleQuery(spreadsheet);

      SpreadsheetFeed spreadsheetFeed = spreadsheetService.query(spreadsheetQuery, 
          SpreadsheetFeed.class);
      List<SpreadsheetEntry> spreadsheets = spreadsheetFeed.getEntries();
      if (spreadsheets.isEmpty()) {
        throw new Exception("No spreadsheets with that name");
      }

      return spreadsheets.get(0);
  }

}

我的日志总是得到404响应:

com.google.api.client.googleapis.services.AbstractGoogleClient <init>: Application name is not set. Call Builder#setApplicationName.
W 2013-07-15 14:50:31.665
[s~evermedcpr/1.368807282351251748].<stderr>: An error occurred: com.google.api.client.googleapis.json.GoogleJsonResponseException: 404 OK
{
  "code" : 404,
  "errors" : [ {
    "domain" : "global",
    "message" : "Not Found",
    "reason" : "notFound"
  } ],
  "message" : "Not Found"
}

如何访问所选的电子表格?

2 个答案:

答案 0 :(得分:2)

您定义SpreadsheetService两次。一次为spreadsheetService,一次为ss。您只需将OAuth2凭据设置为ss,但在spreadsheetService方法中使用getSpreadsheet

你应该替换它:

SpreadsheetService ss = new SpreadsheetService("DBM4G-demo"); 
ss.setOAuth2Credentials(creds);

用这个:

spreadsheetService.setOAuth2Credentials(creds);

您还使用两个不同的应用程序名称 - BM4G-demoevermedcpr。我不确定哪一个是正确的,但根据服务器日志,它可能是evermedcpr

另一个问题是SpreadsheetQuery构造函数中的供稿网址。它应该是https://spreadsheets.google.com/feeds/spreadsheets(如果您需要所有电子表格)或https://spreadsheets.google.com/feeds/spreadsheets/private/full(如果您只想要私人电子表格)。有关Feed网址的详细信息,请参阅Google Spreadsheets documentation

答案 1 :(得分:1)

App Engine + Google Spreadsheet API - 基本设置。

1) Google云端硬盘OAuth

使用DrEdit教程启动并运行OAuth。使用电子表格API需要OAuth。

注意您需要为其添加刷新令牌。但这可以像你期望的那样工作。

2)电子表格API

了解如何使用Google电子表格API。 看看CellDemo.java(电子表格样式访问) 和ListDemo.java(SQL数据库样式访问)

https://gdata-java-client.googlecode.com/svn-history/r51/trunk/java/sample/spreadsheet/cell/CellDemo.java

代码可以正常工作,并且不需要很长时间才能启动并运行。 还显示如何按名称选择电子表格:

3) SpreadsheetService oauth令牌

SpreadsheetService spreadsheetService = null;
spreadsheetService = new SpreadsheetService("mydomain.com.au-v0.2");
spreadsheetService.setHeader("Authorization", "Bearer " + accessToken);
spreadsheetService.setConnectTimeout(0); // optional