在Google App Engine上使用Google API,以Google Sheets API為例
2019/06/08 22:43:29
0
2137
1.前言
Google提供許多API給開發人員使用,但使用這些Google API都需要用到憑證才可以使用。這次筆者以Google Sheet API 為例子,從申請憑證到實際操作,以step by step方式讓開發經驗不足的讀者入門。
2.在Google App Engine專案新增resource
a.在專案上按右鍵,選擇「Properties」。
b.「Java Build Path」==>「Add Folder...」。
c.新增一個目錄為「resource」。
3.在Google Cloud Platform開啟API
a.進入 Google Cloud https://cloud.google.com/,進入「控制台」。
b.點選左上角的icon,進入「API和服務」==>「API和服務主頁」。
c.進入「啟用API和服務」。
d.搜尋 sheet 。找到「Google Sheets API」後進入。
4.在Google Cloud Platform取得憑證
a.選擇所屬專案以筆者為例是「LINENotify」,然後進入「API和服務」==>「憑證」。
b.點選「建立憑證」==>「服務帳號金鑰」。
c.建立完成後會自動下載一個json檔案。
d.將上一步驟所下載的json檔案放進resource目錄。
e.在pom.xml新增下面設定。
<dependency>
<groupId>com.google.apis</groupId>
<artifactId>google-api-services-sheets</artifactId>
<version>v4-rev553-1.25.0</version>
</dependency>
5.設定Google Sheet權限
a.Google 雲端硬碟內,在要讀取「Google試算表」檔案上按右鍵選擇「共用」。
b.設定為「開啟」。
6.範例程式
讀取Google 雲端硬碟內的「Google試算表」檔案內容。
package tw.com.min;
import java.io.IOException;
import java.io.InputStream;
import java.security.GeneralSecurityException;
import java.text.SimpleDateFormat;
import java.util.Collections;
import java.util.GregorianCalendar;
import java.util.List;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.sheets.v4.Sheets;
import com.google.api.services.sheets.v4.SheetsScopes;
import com.google.api.services.sheets.v4.model.ValueRange;
@WebServlet(name = "HelloAppEngine", urlPatterns = { "/hello" })
public class HelloAppEngine extends HttpServlet {
private static final String APPLICATION_NAME = "Google Sheets API Sample Code";
private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
private static final List<String> SCOPES = Collections.singletonList(SheetsScopes.DRIVE);
private static final String CREDENTIALS_FILE_PATH = "/credentials.json";
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response0) throws IOException {
response0.setContentType("text/plain");
response0.setCharacterEncoding("UTF-8");
try {
NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
// sheet檔案的Id;
final String spreadsheetId = "1ydddNnVSsjCqG-ICP783jgHlL-dDp0Up14dW9jENEjA";
final String range = "A:E";
Sheets service = new Sheets.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)).setApplicationName(APPLICATION_NAME).build();
ValueRange response = service.spreadsheets().values().get(spreadsheetId, range).execute();
List<List<Object>> values = response.getValues();
if (values == null || values.isEmpty()) {
System.out.println("No data found.");
} else {
System.out.println("Name, Major");
for (List row : values) {
// 列印出欄位A與E.
System.out.printf("%s, %s\n", row.get(0), row.get(4));
response0.getWriter().print(row.get(0).toString() + " " + row.get(4).toString() + "\r\n");
}
}
} catch (GeneralSecurityException e) {
e.printStackTrace();
}
}
private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException {
// 載入resource目錄下的「憑證」檔案。
InputStream in = HelloAppEngine.class.getResourceAsStream(CREDENTIALS_FILE_PATH);
GoogleCredential credential = GoogleCredential.fromStream(in).createScoped(SCOPES);
String serviceAccountId=credential.getServiceAccountId();
return credential;
}