简体   繁体   English

Java的Google + Domains API快速入门无法正常工作

[英]Google + Domains API Quick start for java is not working

I am trying to use the domains API offered in Google +, I am trying to make work to Quick start for java using domain-wide delegation I have followed the steps, also I have asked my domain admin to grant access to the project I created in console, resuming I can compile the java file, but when I run, I get a 404 error, here is the code: 我正在尝试使用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);
  }
}

Obviusly the data like email and key file I have the correct in my code, this is the error I get: 显然,电子邮件和密钥文件之类的数据在我的代码中是正确的,这是我得到的错误:

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)

I am lost, please if somebody could help me I would be grateful. 我迷路了,请有人帮助我,我将不胜感激。

It appears that the line that contains PlusDomains.builder now requires that the setApplicationName be called: 似乎包含PlusDomains.builder的行现在要求调用setApplicationName:

PlusDomains service = new PlusDomains.Builder(httpTransport, jsonFactory, credential)
  .setApplicationName('MyDomainsDemo')
  .build();

I tested the Java sample today and it works. 我今天测试了Java示例,它可以工作。 The instructions need a few minor updates related to labels changing in the API console, but if you configure the application correctly, you will be able to get started. 这些说明需要一些与API控制台中的标签更改相关的较小更新,但是如果您正确配置了应用程序,就可以开始使用。

The 404 error is most likely caused by a misconfigured client and is not an issue in the sample. 404错误很可能是由错误配置的客户端引起的,而不是示例中的问题。 The following screenshot should be helpful in getting the correct credentials. 以下屏幕截图应有助于获得正确的凭据。 When you create the service account, you will get a new region highlighted below: 创建服务帐户时,将在下面突出显示一个新区域:

Java Quickstart凭证的来源

Make sure that the Client ID under Service Account is the same client ID added when you performed Domain-Wide delegation from the Admin console. 确保从管理控制台执行“域范围委派”时,“ 服务帐户”下的“客户端ID”与添加的客户端ID相同。 The following screenshot shows where the client ID (the first field in the previous screenshot) goes: 以下屏幕截图显示了客户端ID(上一个屏幕截图中的第一个字段)的位置:

在此处输入图片说明

Finally, make sure that the email address configured in src/com/google/plus/samples/quickstart/domains/DomainDelegation.java matches the email from your service account. 最后,请确保src/com/google/plus/samples/quickstart/domains/DomainDelegation.java中配置的电子邮件地址与您的服务帐户中的电子邮件src/com/google/plus/samples/quickstart/domains/DomainDelegation.java匹配。

If you are using the classic API console, you will need to add a service account to your project, Do this from API Access -> Create another client ID... -> Service account. 如果您使用的是经典API控制台,则需要向您的项目中添加服务帐户,请通过API Access->创建另一个客户端ID ...->服务帐户来执行此操作。 The values will then come from the added section: 这些值将来自添加的部分:

在此处输入图片说明

this works! 这可行!

with those jars 用那些罐子

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.RELEASE.jar hibernate-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 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邮件-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 .RELEASE.jar hibernate-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.jar 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();
    }

}
}

I ran into this problem recently. 我最近遇到了这个问题。 For me the solution was to update the library (the sample comes with a bunch of out-dated JARs in the lib/ folder). 对我来说,解决方案是更新库(该示例在lib /文件夹中附带了一堆过时的JAR)。

My maven dependencies: 我的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>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM