GmailApiQuickstart –

我很尴尬,我只是失败了一段示例代码,但我会责怪它已经晚了…

我已经复制并粘贴了以下内容: https : //developers.google.com/gmail/api/quickstart/quickstart-java并下载了客户端库: https : //code.google.com/p/google-api- java-client /和https://developers.google.com/api-client-library/java/apis/gmail/v1

当我运行示例时,我得到以下exception:

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.(GoogleAuthorizationCodeFlow.java:195) at com.emailreply.musterion.GmailApiQuickstart.main(GmailApiQuickstart.java:40) 

谷歌搜索,我找不到一个简单的答案,所以假设愚蠢或库缺失/不正确。

我拥有的图书馆是:

 /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 

上面提到的例子:

 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 threads = threadsResponse.getThreads(); // Print ID of each Thread. for (Thread thread : threads) { System.out.println("Thread ID: " + thread.getId()); } } } 

CLIENT_SECRET_PATH的引用替换为:

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

没有其他理由,只能尝试不同的东西。 它确实有效并正确读取文件。

有任何想法吗?

对,经过一些更多的研究(询问同事/天才)后,我发现了问题。 基本上, GoogleClientSecrets对象没有与client_secrets.json文件中的信息正确绑定。 这意味着在身份validation期间,对象为null从而导致IllegalArgumentException

所以原始文件看起来像这样:

 { "private_key_id": "zzz", "private_key": "-----BEGIN PRIVATE KEY-----\nxyz\n-----END PRIVATE KEY-----\n", "client_email": "1234@developer.gserviceaccount.com", "client_id": "1wdfghyjmp.apps.googleusercontent.com", "type": "service_account" } 

编辑后看起来像这样:

 { "web" : { "private_key_id": "zzz", "private_key": "-----BEGIN PRIVATE KEY-----\nxyz\n-----END PRIVATE KEY-----\n", "client_email": "1234@developer.gserviceaccount.com", "client_id": "1wdfghyjmp.apps.googleusercontent.com", "type": "service_account" } } 

这使我能够通过身份validation进行代码处理。

希望这可以帮助。

这是一个非交互式身份validation的工作示例,用于谷歌OAuth2的非交互式授权问题不在客户端json中的“web”标记中,而是因为他们的示例是用于Web身份validation,而他们的建议方式是生成凭证用于非交互式“服务帐户”。 他们的文档存在多个问题。