谷歌+域名API快速启动java无法正常工作
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了谷歌+域名API快速启动java无法正常工作相关的知识,希望对你有一定的参考价值。
我正在尝试使用Google +中提供的域API,我正在尝试使用域范围委派快速启动java我已按照步骤操作,我也请求我的域管理员授予对我创建的项目的访问权限在控制台中,恢复我可以编译java文件,但是当我运行时,我得到一个404错误,这里是代码:
/*
* Copyright 2013 Google Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.plus.samples.quickstart.domains;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
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.jackson.JacksonFactory;
import com.google.api.services.plusDomains.PlusDomains;
import com.google.api.services.plusDomains.model.Acl;
import com.google.api.services.plusDomains.model.Activity;
import com.google.api.services.plusDomains.model.PlusDomainsAclentryResource;
import com.google.api.services.plusDomains.model.Person;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* Simple program to demonstrate the Google+ Domains API.
*
* This program shows how to authenticate an app for domain-wide delegation and how
* to complete an activities.insert API call. For details on how to authenticate on
* a per-user basis using OAuth 2.0, or for examples of other API calls, please see
* the documentation at https://developers.google.com/+/domains/.
*
* @author joannasmith@google.com (Joanna Smith)
*/
public class DomainDelegation {
/**
* Update SERVICE_ACCOUNT_EMAIL with the email address of the service account for the client ID
* created in the developer console.
*/
private static final String SERVICE_ACCOUNT_EMAIL = "example@developer.gserviceaccount.com";
/**
* Update SERVICE_ACCOUNT_PKCS12_FILE_PATH with the file path to the private key file downloaded
* from the developer console.
*/
private static final String SERVICE_ACCOUNT_PKCS12_FILE_PATH =
"file-privatekey.p12";
/**
* Update USER_EMAIL with the email address of the user within your domain that you would like
* to act on behalf of.
*/
private static final String USER_EMAIL = "example@email.com";
/**
* plus.me and plus.stream.write are the scopes required to perform the tasks in this quickstart.
* For a full list of available scopes and their uses, please see the documentation.
*/
private static final List<String> SCOPE = Arrays.asList(
"https://www.googleapis.com/auth/plus.me",
"https://www.googleapis.com/auth/plus.stream.write",
"https://www.googleapis.com/auth/plus.circles.read",
"https://www.googleapis.com/auth/plus.profiles.read",
"https://www.googleapis.com/auth/plus.stream.read",
"https://www.googleapis.com/auth/userinfo.profile");
/**
* Builds and returns a Plus service object authorized with the service accounts
* that act on behalf of the given user.
*
* @return Plus service object that is ready to make requests.
* @throws GeneralSecurityException if authentication fails.
* @throws IOException if authentication fails.
*/
private static PlusDomains authenticate() throws GeneralSecurityException, IOException {
System.out.println(String.format("Authenticate the domain for %s", USER_EMAIL));
HttpTransport httpTransport = new NetHttpTransport();
JsonFactory jsonFactory = new JacksonFactory();
// Setting the sub field with USER_EMAIL allows you to make API calls using the special keyword
// 'me' in place of a user id for that user.
GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(httpTransport)
.setJsonFactory(jsonFactory)
.setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
.setServiceAccountScopes(SCOPE)
.setServiceAccountUser(USER_EMAIL)
.setServiceAccountPrivateKeyFromP12File(
new java.io.File(SERVICE_ACCOUNT_PKCS12_FILE_PATH))
.build();
System.out.println("credential " + credential);
// Create and return the Plus service object
PlusDomains service = new PlusDomains.Builder(httpTransport, jsonFactory, credential).build();
return service;
}
/**
* Create a new post on behalf of the user associated with the credential object of the service,
* restricted to the domain.
*
* @param service Plus service object that is ready to make requests.
* @throws IOException if the insert operation fails or if authentication fails.
* @throws GeneralSecurityException if authentication fails.
*/
public static void main(String[] args) throws Exception {
// Create an authorized API client
PlusDomains service = authenticate();
// Set the user's ID to 'me': requires the plus.me scope
String userId = "me";
String msg = "Happy Monday! #caseofthemondays";
System.out.println("Inserting activity " + service);
// Create the audience of the post
PlusDomainsAclentryResource res = new PlusDomainsAclentryResource();
// Share to the domain
res.setType("domain");
List<PlusDomainsAclentryResource> aclEntries = new ArrayList<PlusDomainsAclentryResource>();
aclEntries.add(res);
Acl acl = new Acl();
acl.setItems(aclEntries);
// Required, this does the domain restriction
acl.setDomainRestricted(true);
Activity activity = new Activity()
.setObject(new Activity.PlusDomainsObject().setOriginalContent(msg))
.setAccess(acl);
//System.out.println("ativity " + activity);
activity = service.activities().insert(userId, activity).execute();
System.out.println(activity);
}
}
显然,像我的代码中的电子邮件和密钥文件这样的数据是正确的,这是我得到的错误:
Authenticate the domain for example@email.com
credential com.google.api.client.googleapis.auth.oauth2.GoogleCredential@2b275d39
04-dic-2013 8:59:50 com.google.api.client.googleapis.services.AbstractGoogleClient <init>
ADVERTENCIA: Application name is not set. Call Builder#setApplicationName.
Inserting activity com.google.api.services.plusDomains.PlusDomains@46b8c8e6
Exception in thread "main" com.google.api.client.googleapis.json.GoogleJsonResponseException: 404 Not Found
Not Found
at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:145)
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113)
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest$1.interceptResponse(AbstractGoogleClientRequest.java:312)
at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1045)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:410)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:343)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:460)
at com.google.plus.samples.quickstart.domains.DomainDelegation.main(DomainDelegation.java:154)
我迷了,如果有人能帮助我,我会很感激。
看来包含PlusDomains.builder的行现在要求调用setApplicationName:
PlusDomains service = new PlusDomains.Builder(httpTransport, jsonFactory, credential)
.setApplicationName('MyDomainsDemo')
.build();
我今天测试了Java样本并且它可以工作。这些说明需要一些与API控制台中标签更改相关的次要更新,但如果正确配置应用程序,您将能够开始使用。
404错误很可能是由错误配置的客户端引起的,并且不是示例中的问题。以下屏幕截图应有助于获取正确的凭据。创建服务帐户时,您将在下面突出显示一个新区域:
确保服务帐户下的客户端ID与从管理控制台执行域范围委派时添加的客户端ID相同。以下屏幕截图显示了客户端ID(上一屏幕截图中的第一个字段)的位置:
最后,请确保src/com/google/plus/samples/quickstart/domains/DomainDelegation.java
中配置的电子邮件地址与您服务帐户中的电子邮件相匹配。
如果您使用的是经典API控制台,则需要在项目中添加服务帐户,从API Access - >创建另一个客户端ID ... - >服务帐户执行此操作。这些值将来自添加的部分:
这个有效!
与那些罐子
antlr-2.7.7.jar jackson-core-asl-1.9.11.jar aopalliance-1.0.jar javassist-3.15.0-GA.jar commons-email-1.3.2.jar jboss-logging-3.1.0.GA .jar commons-logging-1.1.1.jar jboss-transaction-api_1.1_spec-1.0.0.Final.jar dom4j-1.6.1.jar jsr305-1.3.9.jar google-api-client-1.17.0- rc.jar jstl-1.2.jar google-api-client-jackson2-1.17.0-rc-sources.jar mail-1.4.1.jar google-api-services-calendar-v3-rev87-1.19.0.jar mysql -connector-java-5.1.22.jar google-collections-1.0-rc2.jar spring-aop-3.2.2.RELEASE.jar google-http-client-1.17.0-rc.jar spring-beans-3.2.2 .RELEASE.jar google-http-client-jackson-1.17.0-rc.jar spring-context-3.2.2.RELEASE.jar google-oauth-client-1.17.0-rc.jar spring-core-3.2.2 .RELEASE.jar google-oauth-client-servlet-1.17.0-rc.jar spring-expression-3.2.2.RELEASE.jar hibernate-commons-annotations-4.0.1.Final.jar spring-jdbc-3.2.2 .rarEL-core-4.1.10.Final.jar spring-orm-3.2.2.RELEASE.jar hibernate-jpa-2.0-api-1.0.1.Final.jar spring-tx-3.2.2.RELEASE .jar hsqldb-2.2.9.jar sprin g-web-3.2.2.RELEASE.jar httpclient-4.0.1.jar spring-webmvc-3.2.2.RELEASE.jar httpcore-4.0.1.jar transaction-api-1.1.jar jackson-core-2.1.3 。罐
...
import java.io.File;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.TimeZone;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.jackson.JacksonFactory;
import com.google.api.client.util.DateTime;
import com.google.api.services.calendar.Calendar;
import com.google.api.services.calendar.model.Event;
import com.google.api.services.calendar.model.EventAttendee;
import com.google.api.services.calendar.model.EventDateTime;
..
public class GoogleCalNotificator {
public static void addEvent(TurnosRepository repo, String fecha,
String inicio, String fin, String paciente, String cliente) {
HttpTransport httpTransport = new NetHttpTransport();
JacksonFactory jsonFactory = new JacksonFactory();
String scope = "https://www.googleapis.com/auth/calendar";
GoogleCredential credential = null;
try {
credential = new GoogleCredential.Builder()
.setTransport(httpTransport)
.setJsonFactory(jsonFactory)
.setServiceAccountId(
"xxxxxxxxxxx@developer.gserviceaccount.com")
.setServiceAccountUser("xxxxxxxxx@gmail.com")
.setServiceAccountScopes(Arrays.asList(scope))
.setServiceAccountPrivateKeyFromP12File(
new File(repo.getParameter("P12_FILE"))) //p12 from gooleapiuser
.build();
} catch (GeneralSecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Calendar service = new Calendar.Builder(httpTransport, jsonFactory,
credential).setApplicationName("appname").build();
// -----------------
Event event = new Event();
event.setSummary("text " );
event.setLocation("loc ");
ArrayList<EventAttendee> attendees = new ArrayList<EventAttendee>();
attendees.add(new EventAttendee().setEmail("xxxxxx@gmail.com"));
// ...
event.setAttendees(attendees);
Date startDate = null;
Date endDate = null;
try {
startDate = new SimpleDateFormat("dd/MM/yyyy HH:mm").parse(fecha
+ " " + inicio);
endDate = new SimpleDateFormat("dd/MM/yyyy HH:mm").parse(fecha
+ " " + fin);
} catch (ParseException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
DateTime start = new DateTime(startDate, TimeZone.getTimeZone("America/Argentina/Buenos_Aires"));
event.setStart(new EventDateTime().setDateTime(start));
DateTime end = new DateTime(endDate, TimeZone.getTimeZone("America/Argentina/Buenos_Aires"));
event.setEnd(new EventDateTime().setDateTime(end));
// lo pongo en el calendario de julia
try {
Event createdEvent = service
.events()
.insert("xxxxxxxxidfromcalendar@group.calendar.google.com",
event).execute();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
我最近遇到了这个问题。对我来说,解决方案是更新库(示例附带了lib /文件夹中的一堆过时的JAR)。
我的maven依赖:
<dependencies>
<dependency>
<groupId>com.google.api-client</groupId>
<artifactId>google-api-client</artifactId>
<version>1.23.0</version>
</dependency>
<dependency>
<groupId>com.google.apis</groupId>
<artifactId>google-api-services-plusDomains</artifactId>
<version>v1-rev449-1.23.0</version>
</dependency>
<dependency>
<groupId>com.google.http-client</groupId>
<artifactId>google-http-client-jackson</artifactId>
<version>1.23.0</version>
</dependency>
</dependencies>
以上是关于谷歌+域名API快速启动java无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章