2 votes

Google Contacts API - Java : Impossible de mettre à jour les contacts

J'essaie de mettre à jour les contacts de mes utilisateurs Google Apps via l'API Google Contacts et une application Java.

Je suis capable d'obtenir les contacts de cet utilisateur particulier, mais si je veux mettre à jour un certain contact, la mise à jour échoue.

Mon code :

package com.haha;

import java.net.URL;

import com.google.gdata.client.*;
import com.google.gdata.client.Query.CustomParameter;
import com.google.gdata.client.authn.oauth.GoogleOAuthParameters;
import com.google.gdata.client.authn.oauth.OAuthHmacSha1Signer;
import com.google.gdata.client.authn.oauth.OAuthSigner;
import com.google.gdata.client.authn.oauth.OAuthParameters.OAuthType;
import com.google.gdata.client.contacts.*;
import com.google.gdata.data.contacts.ContactEntry;
import com.google.gdata.data.contacts.ContactFeed;

public class ContactsMain {

    private static final String APP_NAME = "haha.com";
    private static final String CONSUMER_KEY = "haha.com";
    private static final String CONSUMER_SECRET = "123456";
    private static final String SCOPE_CONTACTS = "https://www.google.com/m8/feeds/";
    private static final String FEED_URL_CONTACTS = "https://www.google.com/m8/feeds/contacts/default/base";
    private static final String MY_USER = "user@haha.com";
    private static final String MAX_RESULTS = "10000";

    public static void main(String[] args) {

        try {

            // Create the service
            ContactsService myService = new ContactsService(APP_NAME);

            // OAuth
            GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters();
            oauthParameters.setOAuthConsumerKey(CONSUMER_KEY);
            oauthParameters.setOAuthConsumerSecret(CONSUMER_SECRET);
            oauthParameters.setScope(SCOPE_CONTACTS);
            oauthParameters.setOAuthType(OAuthType.TWO_LEGGED_OAUTH);
            OAuthSigner signer = new OAuthHmacSha1Signer();

            // Authenticate the service
            myService.setOAuthCredentials(oauthParameters, signer);

            // Build the query
            Query myQuery = new Query(new URL(FEED_URL_CONTACTS));
            myQuery.addCustomParameter(new CustomParameter("xoauth_requestor_id", MY_USER));
            myQuery.addCustomParameter(new CustomParameter("max-results", MAX_RESULTS));

            // Get all contacts
            ContactFeed resultFeed = myService.query(myQuery, ContactFeed.class);

            for (ContactEntry entry : resultFeed.getEntries()) {

                if (entry.hasName() && entry.getName().hasFamilyName()) {

                    if ((entry.getName().getFamilyName().getValue()).equals("Lastname")) {

                        System.out.println("Contact 'Lastname' was found");

                        entry.getName().getFamilyName().setValue("Lastname-EDIT");
                        entry.update();
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

La sortie console d'Eclipse :

Contact 'Lastname' was found
java.lang.NullPointerException: No authentication header information
    at com.google.gdata.util.AuthenticationException.initFromAuthHeader(AuthenticationException.java:96)
    at com.google.gdata.util.AuthenticationException.<init>(AuthenticationException.java:67)
    at com.google.gdata.client.http.HttpGDataRequest.handleErrorResponse(HttpGDataRequest.java:608)
    at com.google.gdata.client.http.GoogleGDataRequest.handleErrorResponse(GoogleGDataRequest.java:564)
    at com.google.gdata.client.http.HttpGDataRequest.checkResponse(HttpGDataRequest.java:560)
    at com.google.gdata.client.http.HttpGDataRequest.execute(HttpGDataRequest.java:538)
    at com.google.gdata.client.http.GoogleGDataRequest.execute(GoogleGDataRequest.java:536)
    at com.google.gdata.client.Service.update(Service.java:1563)
    at com.google.gdata.client.Service.update(Service.java:1530)
    at com.google.gdata.client.GoogleService.update(GoogleService.java:597)
    at com.google.gdata.data.BaseEntry.update(BaseEntry.java:639)
    at com.haha.ContactsMain.main(ContactsMain.java:60)

La première ligne de la sortie console prouve que les contacts peuvent être lus. La ligne suivante apparaît dans ContactsMain.java:60 :

entry.update();

Quelqu'un sait-il ce que je fais de mal ici ? Dois-je ajouter des jetons à l'objet "entrée" avant de vouloir le mettre à jour ?

Toute aide est très appréciée. Merci beaucoup,

Marco

0voto

pgoldweic Points 177

J'imagine que seul l'accès en lecture est activé pour OAuth 2 pattes, mais pas l'accès en écriture (c'est ce qui se passe également avec l'api de provisionnement - nous essayons d'obtenir l'accès en écriture de Googe depuis longtemps, mais ils ne se sont jamais engagés à le faire). Si j'ai raison, c'est très probablement la raison pour laquelle la mise à jour échoue pour vous. (l'exception indique un manque d'authentification correcte).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X