2014-09-17 14 views
13

Tôi xấu hổ vì tôi đơn giản thất bại với một đoạn mã ví dụ, nhưng tôi sẽ đổ lỗi cho thực tế là đã trễ ...GmailApiQuickstart -

Tôi đã sao chép và dán: https://developers.google.com/gmail/api/quickstart/quickstart-java và tải các thư viện client: https://code.google.com/p/google-api-java-client/https://developers.google.com/api-client-library/java/apis/gmail/v1

Khi tôi chạy mẫu, tôi nhận được ngoại lệ sau đây:

Exception in thread "main" java.lang.IllegalArgumentException 
    at com.google.api.client.repackaged.com.google.common.base.Preconditions.checkArgument(Preconditions.java:76) 
    at com.google.api.client.util.Preconditions.checkArgument(Preconditions.java:37) 
    at com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets.getDetails(GoogleClientSecrets.java:82) 
    at com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow$Builder.<init>(GoogleAuthorizationCodeFlow.java:195) 
    at com.emailreply.musterion.GmailApiQuickstart.main(GmailApiQuickstart.java:40) 

Googling, tôi không thể tìm thấy một câu trả lời đơn giản, do đó, một m giả định ngu dốt hoặc một thư viện bị thiếu/không chính xác.

Các thư viện như tôi có họ là:

/libs/commons-logging-1.1.1.jar 
/libs/google-api-client-1.19.0.jar 
/libs/google-api-client-android-1.19.0.jar 
/libs/google-api-client-appengine-1.19.0.jar 
/libs/google-api-client-gson-1.19.0.jar 
/libs/google-api-client-jackson2-1.19.0.jar 
/libs/google-api-client-java6-1.19.0.jar 
/libs/google-api-client-servlet-1.19.0.jar 
/libs/google-http-client-1.19.0.jar 
/libs/google-http-client-android-1.19.0.jar 
/libs/google-http-client-appengine-1.19.0.jar 
/libs/google-http-client-gson-1.19.0.jar 
/libs/google-http-client-jackson2-1.19.0.jar 
/libs/google-http-client-jdo-1.19.0.jar 
/libs/google-oauth-client-1.19.0.jar 
/libs/google-oauth-client-appengine-1.19.0.jar 
/libs/google-oauth-client-java6-1.19.0.jar 
/libs/google-oauth-client-jetty-1.19.0.jar 
/libs/google-oauth-client-servlet-1.19.0.jar 
/libs/gson-2.1.jar 
/libs/httpclient-4.0.1.jar 
/libs/httpcore-4.0.1.jar 
/libs/jackson-core-2.1.3.jar 
/libs/jdo2-api-2.3-eb.jar 
/libs/jetty-6.1.26.jar 
/libs/jetty-util-6.1.26.jar 
/libs/jsr305-1.3.9.jar 
/libs/transaction-api-1.1.jar 
google-api-services-gmail-v1-rev10-1.19.0.jar 

Ví dụ nêu trên:

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.util.Arrays; 
import java.util.List; 

import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow; 
import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets; 
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; 
import com.google.api.client.googleapis.auth.oauth2.GoogleOAuthConstants; 
import com.google.api.client.googleapis.auth.oauth2.GoogleTokenResponse; 
import com.google.api.client.http.HttpTransport; 
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.gmail.Gmail; 
import com.google.api.services.gmail.model.ListThreadsResponse; 
import com.google.api.services.gmail.model.Thread; 


public class GmailApiQuickstart { 

    // Check https://developers.google.ciom/gmail/api/auth/scopes for all available scopes 
    private static final String SCOPE = "https://www.googleapis.com/auth/gmail.readonly"; 
    private static final String APP_NAME = "Gmail API Quickstart"; 
    // Email address of the user, or "me" can be used to represent the currently authorized user. 
    private static final String USER = "me"; 
    // Path to the client_secret.json file downloaded from the Developer Console 
    private static final String CLIENT_SECRET_PATH = "./client_secret.json"; 


    public static void main (String [] args) throws IOException { 
    HttpTransport httpTransport = new NetHttpTransport(); 
    JsonFactory jsonFactory = new JacksonFactory(); 

    GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(jsonFactory, new BufferedReader(new InputStreamReader(GmailApiQuickstart.class.getResourceAsStream(CLIENT_SECRET_PATH)))); 

    // Allow user to authorize via url. 
    GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
     httpTransport, jsonFactory, clientSecrets, Arrays.asList(SCOPE)) 
     .setAccessType("online") 
     .setApprovalPrompt("auto").build(); 

    String url = flow.newAuthorizationUrl().setRedirectUri(GoogleOAuthConstants.OOB_REDIRECT_URI).build(); 


    System.out.println("Please open the following URL in your browser then type the authorization code:\n" + url); 

    // Read code entered by user. 
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
    String code = br.readLine(); 

    // Generate Credential using retrieved code. 
    GoogleTokenResponse response = flow.newTokenRequest(code) 
     .setRedirectUri(GoogleOAuthConstants.OOB_REDIRECT_URI).execute(); 
    GoogleCredential credential = new GoogleCredential() 
     .setFromTokenResponse(response); 

    // Create a new authorized Gmail API client 
    Gmail service = new Gmail.Builder(httpTransport, jsonFactory, credential) 
     .setApplicationName(APP_NAME).build(); 

    // Retrieve a page of Threads; max of 100 by default. 
    ListThreadsResponse threadsResponse = service.users().threads().list(USER).execute(); 
    List<Thread> threads = threadsResponse.getThreads(); 

    // Print ID of each Thread. 
    for (Thread thread : threads) { 
     System.out.println("Thread ID: " + thread.getId()); 
    } 
    } 

} 

Tôi thay thế các tài liệu tham khảo để CLIENT_SECRET_PATH với:

new BufferedReader(new InputStreamReader(GmailApiQuickstart.class.getResourceAsStream(CLIENT_SECRET_PATH))) 

không có lý do khác hơn là thử một cái gì đó khác. Nó hoạt động và đọc tệp một cách chính xác.

Bất kỳ ý tưởng nào?

Trả lời

45

Phải, sau một số nghiên cứu khác (hỏi đồng nghiệp/thiên tài), tôi đã tìm thấy sự cố. Về cơ bản, đối tượng GoogleClientSecrets không bị ràng buộc đúng với thông tin từ tệp client_secrets.json của tôi. Điều này có nghĩa rằng trong quá trình xác thực, các đối tượng là null dẫn đến IllegalArgumentException.

Vì vậy, các tập tin ban đầu trông như thế này:

{ 
     "private_key_id": "zzz", 
     "private_key": "-----BEGIN PRIVATE KEY-----\nxyz\n-----END PRIVATE KEY-----\n", 
     "client_email": "[email protected]", 
     "client_id": "1wdfghyjmp.apps.googleusercontent.com", 
     "type": "service_account" 
} 

đã được chỉnh sửa để trông như thế này:

{ 
    "web" : { 
     "private_key_id": "zzz", 
     "private_key": "-----BEGIN PRIVATE KEY-----\nxyz\n-----END PRIVATE KEY-----\n", 
     "client_email": "[email protected]", 
     "client_id": "1wdfghyjmp.apps.googleusercontent.com", 
     "type": "service_account" 
    } 
} 

này cho phép tôi tiến bộ thông qua các mã với xác thực.

Hy vọng điều này sẽ hữu ích.

+0

Có, cực kỳ hữu ích. Cảm ơn! –

+2

Exxxxtremelyyy helpul ... cảm ơn! làm thế nào bạn phát hiện ra điều đó? Ý tôi là, tại sao lại đặt giải "web" này. –

+2

Vấn đề tương tự. Tệp gốc đã được tạo trên Google Console với "tài khoản dịch vụ". Tệp json không có phần tử "web" và xây dựng các luồng dữ liệu. Tạo lại thông tin đăng nhập bằng cách sử dụng "web" thay vì "tài khoản dịch vụ" cung cấp cấu trúc bao gồm "web" và "luồng" được tạo. – Glenn

2

đây là một ví dụ làm việc của auth không tương tác với Google Non-interactive authorization with Google OAuth2 vấn đề không phải là ở "web" tag trong json khách hàng, mà đúng hơn là trong thực tế là tấm gương của họ là để xác thực web trong khi cách đề nghị của họ về tạo thông tin đăng nhập dành cho tài khoản dịch vụ "không tương tác". họ có nhiều vấn đề với tài liệu của họ.