好的,周末就是这个 - 这是我最后一个星期天晚上的求助电话。
必须使用2 Legged OAUTH aproach的Google Marketplace应用需要将50K记录写入Google Doc电子表格。我能够创建,调整大小,重命名和将记录写入电子表格。单独写100行需要一分钟,所以我必须使用批量更新。无法进行批量更新。下面的代码是我最好的尝试 - 我一直得到"令牌无效 - 令牌401和#34;无效。所有示例代码都是针对三条腿的oauth - 但我不能提示用户批准应用程序,因为它是一个市场应用程序
使用openid和2LO
查找批量电子表格更新的示例会很棒 final String SCOPE = "https://spreadsheets.google.com/feeds/spreadsheets/private/full";
SpreadsheetService spreadsheetService;
String consumerKey = getInitParameter("consumer_key");
String consumerSecret = getInitParameter("consumer_secret");
GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters();
oauthParameters.setOAuthConsumerKey(consumerKey);
oauthParameters.setOAuthConsumerSecret(consumerSecret);
oauthParameters.setOAuthType(OAuthParameters.OAuthType.TWO_LEGGED_OAUTH);
oauthParameters.setScope(SCOPE);
OAuthSigner signer = new OAuthHmacSha1Signer();
spreadsheetService = new SpreadsheetService("nimbits-com");
String title = entity.getName().getValue();
try {
spreadsheetService.setOAuthCredentials(oauthParameters, signer);
spreadsheetService.setProtocolVersion(SpreadsheetService.Versions.V3);
SpreadsheetQuery query = new SpreadsheetQuery(new URL(SCOPE));
query.addCustomParameter(new Query.CustomParameter("xoauth_requestor_id", user.getEmail().getValue()));
query.setTitleQuery(title);
SpreadsheetFeed feed = spreadsheetService.query(query, SpreadsheetFeed.class);
//works fine up to this point, I get the feed and spreadsheet.
if (feed != null && ! feed.getEntries().isEmpty()) {
com.google.gdata.data.spreadsheet.SpreadsheetEntry wsEntry = feed.getEntries().get(0);
WorksheetEntry sheet = wsEntry.getWorksheets().get(0);
CellFeed batchRequest = new CellFeed();
String batchId = "R" + 2 + "C" + 1;
URL entryUrl = new URL(sheet.getCellFeedUrl().toString() + "/" + batchId);
//Invalid TOKEN error here, trying to get the entry.
CellEntry batchOperation = spreadsheetService.getEntry(entryUrl, CellEntry.class);
batchOperation.setService(spreadsheetService);
batchOperation.changeInputValueLocal("test");
BatchUtils.setBatchId(batchOperation, batchId);
BatchUtils.setBatchOperationType(batchOperation, BatchOperationType.UPDATE);
batchRequest.getEntries().add(batchOperation);
CellFeed cellFeed = spreadsheetService.getFeed(sheet.getCellFeedUrl(), CellFeed.class);
Link batchLink = cellFeed.getLink(Link.Rel.FEED_BATCH, Link.Type.ATOM);
URL batchUrl = new URL(batchLink.getHref());
spreadsheetService.batch(batchUrl, batchRequest);
}
} catch (MalformedURLException e) {
LogHelper.logException(this.getClass(), e);
throw new NimbitsException(e);
} catch (ServiceException e) {
LogHelper.logException(this.getClass(), e);
throw new NimbitsException(e);
} catch (IOException e) {
LogHelper.logException(this.getClass(), e);
throw new NimbitsException(e);
} catch (OAuthException e) {
LogHelper.logException(this.getClass(), e);
throw new NimbitsException(e);
}
此示例只是尝试批量写入一条记录。我已经调整了电子表格的大小,看起来也不错。我不知道如何设置令牌,或者使用2LO完成此请求。我已经尝试将xoauth_requestor_id添加到网址中。
编辑,因为我开始了赏金:
这段代码完美无缺,并且通过我拥有的2LO身份验证为现有电子表格添加了1行。我需要将其修改为快速进入50,000行。
@Override
public void addSpreadsheetHeader(Entity entity) throws NimbitsException {
final User user = UserServiceFactory.getServerInstance().getHttpRequestUser(
this.getThreadLocalRequest());
SpreadsheetService spreadsheetService;
String consumerKey = getInitParameter("consumer_key");
String consumerSecret = getInitParameter("consumer_secret");
GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters();
oauthParameters.setOAuthConsumerKey(consumerKey);
oauthParameters.setOAuthConsumerSecret(consumerSecret);
spreadsheetService = new SpreadsheetService("nimbits-com");
// SpreadsheetEntry entry = new SpreadsheetEntry();
String title = entity.getName().getValue();
// entry.setTitle(TextConstruct.plainText(title));
try {
spreadsheetService.setOAuthCredentials(oauthParameters, new OAuthHmacSha1Signer());
SpreadsheetQuery query = new SpreadsheetQuery(new URL("https://spreadsheets.google.com/feeds/spreadsheets/private/full"));
query.addCustomParameter(new Query.CustomParameter("xoauth_requestor_id", user.getEmail().getValue()));
query.setTitleQuery(title);
SpreadsheetFeed feed = spreadsheetService.query(query, SpreadsheetFeed.class);
if (feed != null && ! feed.getEntries().isEmpty()) {
com.google.gdata.data.spreadsheet.SpreadsheetEntry wsEntry = feed.getEntries().get(0);
WorksheetEntry sheet = wsEntry.getWorksheets().get(0);
URL cellFeedUrl= sheet.getCellFeedUrl ();
CellFeed cellFeed= spreadsheetService.getFeed (cellFeedUrl, CellFeed.class);
CellEntry cellEntry;
cellEntry= new CellEntry (1, 1, "Timestamp");
cellFeed.insert (cellEntry);
cellEntry= new CellEntry (1, 2, "Value");
cellFeed.insert (cellEntry);
cellEntry= new CellEntry (1, 3, "Latitude");
cellFeed.insert (cellEntry);
cellEntry= new CellEntry (1, 4, "Longitude");
cellFeed.insert (cellEntry);
cellEntry= new CellEntry (1, 5, "Annotation");
cellFeed.insert (cellEntry);
cellEntry= new CellEntry (1, 6, "Data");
cellFeed.insert (cellEntry);
}
} catch (MalformedURLException e) {
LogHelper.logException(this.getClass(), e);
throw new NimbitsException(e);
} catch (ServiceException e) {
LogHelper.logException(this.getClass(), e);
throw new NimbitsException(e);
} catch (IOException e) {
LogHelper.logException(this.getClass(), e);
throw new NimbitsException(e);
} catch (OAuthException e) {
LogHelper.logException(this.getClass(), e);
throw new NimbitsException(e);
}
}
答案 0 :(得分:5)
在这里,很多小事没有记录 - 但是两条腿的auth转储到电子表格中:
从各种来源拉出一些示例代码将它们组合在一起。创建新文档时,文档键来自返回的对象.getId。
@Override
public void dumpValues(final Entity entity, int count) throws NimbitsException {
String[][] values = { {"1", "2", "3", "4", "5"},
{"a", "b", "c", "d", "e"},
{"dummy", "foo", "bar", "x", "y"}};
final User user = //where you store your user
SpreadsheetService spreadsheetService;
String consumerKey = getInitParameter("consumer_key");
String consumerSecret = getInitParameter("consumer_secret");
GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters();
oauthParameters.setOAuthConsumerKey(consumerKey);
oauthParameters.setOAuthConsumerSecret(consumerSecret);
spreadsheetService = new SpreadsheetService("nimbits-com");
spreadsheetService.setProtocolVersion(SpreadsheetService.Versions.V1);
try {
spreadsheetService.setOAuthCredentials(oauthParameters, new OAuthHmacSha1Signer());
String key = String.valueOf(this.getThreadLocalRequest().getSession().getAttribute("docId"));
FeedURLFactory urlFactory = FeedURLFactory.getDefault();
URL cellFeedUrl = urlFactory.getCellFeedUrl(key, "od6", "private", "full");
CellQuery q = new CellQuery(cellFeedUrl);
//CellQuery q = new CellQuery(worksheet.getCellFeedUrl());
q.setMinimumRow(1);
q.setMaximumRow(1 + values.length);
q.setMinimumCol(1);
q.setMaximumCol(values[0].length);
q.setReturnEmpty(true);
q.addCustomParameter(new Query.CustomParameter("xoauth_requestor_id", user.getEmail().getValue()));
CellFeed cellFeed = spreadsheetService.query(q, CellFeed.class);
CellFeed batchRequestFeed = new CellFeed();
// set values for each cell
int currentCellEntry=0;
for (int i=0; i < values.length; i++) {
for (int j=0; j < values[i].length; j++) {
CellEntry entry = new CellEntry(cellFeed.getEntries().get(currentCellEntry));
entry.changeInputValueLocal(values[i][j]);
BatchUtils.setBatchId(entry, (new Integer(currentCellEntry)).toString());
BatchUtils.setBatchOperationType(entry, BatchOperationType.UPDATE);
batchRequestFeed.getEntries().add(entry);
currentCellEntry++;
}
}
// upload cells
Link batchLink = cellFeed.getLink(Link.Rel.FEED_BATCH, Link.Type.ATOM);
spreadsheetService.setHeader("If-Match", "*");
CellFeed batchResponse = spreadsheetService.batch(new URL(batchLink.getHref() ), batchRequestFeed);
spreadsheetService.setHeader("If-Match", null);
for (CellEntry entry : batchResponse.getEntries()) {
if (!BatchUtils.isSuccess(entry)) {
BatchStatus status = BatchUtils.getBatchStatus(entry);
throw new NimbitsException(BatchUtils.getBatchId(entry) + " " + status.getReason() + " " + status.getContent());
}
}
} catch (IOException e) {
LogHelper.logException(this.getClass(), e);
throw new NimbitsException(e);
} catch (ServiceException e) {
LogHelper.logException(this.getClass(), e);
throw new NimbitsException(e);
} catch (OAuthException e) {
LogHelper.logException(this.getClass(), e);
throw new NimbitsException(e);
}