在Google App Engine上使用Google API,以Google Sheets API為例

姜志民 2019/06/08 22:43:29
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;
	}

 

 

 

 

 

姜志民