java - Java Servlet 中的 Google Docs API V1 访问文档
问题描述
我正在尝试使用 Google api 客户端库提供的 AbstractAuthorizationCodeServlet 访问 Java Servlet 中的 Google Docs API V1 文档,但代码给出错误,它无法构建 Doc Builder 的对象。我有 auth 2 creatential 并且从谷歌开发者控制台启用了谷歌文档 API。下面是我的代码。
@WebServlet("/GetGoogleDoc")
public class GetGoogleDoc extends AbstractAuthorizationCodeServlet {
private static final long serialVersionUID = 1L;
private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
private static final List<String> SCOPES = Collections.singletonList(DocsScopes.DOCUMENTS_READONLY);
private static final String DOCUMENT_ID = "";
private static final String CLIENT_ID="";
private static final String CLIENT_SECRET="";
public GetGoogleDoc() {
super();
// TODO Auto-generated constructor stub
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException {
final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
Docs service = new Docs.Builder(HTTP_TRANSPORT, JSON_FACTORY, initializeFlow())
.build();
}
@Override
protected String getRedirectUri(HttpServletRequest req) throws ServletException, IOException {
GenericUrl url = new GenericUrl(req.getRequestURL().toString());
url.setRawPath("/oauth2callback");
return url.build();
}
@Override
protected AuthorizationCodeFlow initializeFlow() throws IOException {
return new GoogleAuthorizationCodeFlow.Builder(
new NetHttpTransport(), JSON_FACTORY, CLIENT_ID,CLIENT_SECRET,SCOPES).build();
}
@Override
protected String getUserId(HttpServletRequest req) throws ServletException, IOException {
return null;
// return user ID
}
static void replaceNamedRange(Docs service, String documentId, String rangeName, String newText)
throws IOException {
Document document = service.documents().get(documentId).execute();
NamedRanges namedRangeList = document.getNamedRanges().get(rangeName);
if (namedRangeList == null) {
throw new IllegalArgumentException("The named range is no longer present in the document.");
}
List<Range> allRanges = new ArrayList<>();
Set<Integer> insertIndexes = new HashSet<>();
for (NamedRange namedRange : namedRangeList.getNamedRanges()) {
allRanges.addAll(namedRange.getRanges());
insertIndexes.add(namedRange.getRanges().get(0).getStartIndex());
}
// Sort the list of ranges by startIndex, in descending order.
allRanges.sort(Comparator.comparing(Range::getStartIndex).reversed());
// Create a sequence of requests for each range.
List<Request> requests = new ArrayList<>();
for (Range range : allRanges) {
// Delete all the content in the existing range.
requests.add(
new Request().setDeleteContentRange(new DeleteContentRangeRequest().setRange(range)));
if (insertIndexes.contains(range.getStartIndex())) {
// Insert the replacement text.
requests.add(
new Request()
.setInsertText(
new InsertTextRequest()
.setLocation(
new Location()
.setSegmentId(range.getSegmentId())
.setIndex(range.getStartIndex()))
.setText(newText)));
// Re-create the named range on the new text.
requests.add(
new Request()
.setCreateNamedRange(
new CreateNamedRangeRequest()
.setName(rangeName)
.setRange(
new Range()
.setSegmentId(range.getSegmentId())
.setStartIndex(range.getStartIndex())
.setEndIndex(range.getStartIndex() + newText.length()))));
}
}
BatchUpdateDocumentRequest batchUpdateRequest =
new BatchUpdateDocumentRequest()
.setRequests(requests)
.setWriteControl(new WriteControl().setRequiredRevisionId(document.getRevisionId()));
service.documents().batchUpdate(documentId, batchUpdateRequest).execute();
}
}
解决方案
推荐阅读
- angular - TypeError:在单元测试Angular 6时无法读取未定义的属性“查询”
- c - 将小数转换为二进制后,我的输出显示的小数位数不超过 6 位。我需要小数点后 12 位
- string - Lua:返回“{foo}{bar}”的内容
- javascript - Highcharts - 实时更新柱形图
- excel - 对应单元格中所有值的总和,针对特定日历月和公司
- node.js - 在 mongo 数据库中创建动态模式
- php - 未捕获的错误:找不到类“PhpAmqpLib\Connection\AMQPStreamConnection”
- html - 在我的 html 模板中以 Angular 6 显示而不是空格
- docker - Kubernetes 从单个节点引用 docker 映像并在任何节点中创建容器
- swift - 为什么我的 DateFormatter .date(from: String) 返回 nil