gwt-google-apis调用导致“无法调用方法'newHttpRequest'未定义”

时间:2012-11-25 23:19:54

标签: java gwt google-plus

我正在使用gwt-plus-v1-0.2-alpha API:

  1. 允许Google登录
  2. 获取用户信息中的签名
  3. Google登录有效,但是用

    取消用户的信息失败
    Cannot call method 'newHttpRequest' of undefined
    

    错误。

    以下是我的GoogleApi助手类:

    public final class GoogleApi {
        private static final Plus plus = GWT.create(Plus.class);
    
        private final String clientId;
    
        private final ClientOAuth2Login oAuth2Login;
        private ClientGoogleApiRequestTransport requestTransport;
    
        /**
         * @param clientId
         *            This app's personal client ID assigned by the Google APIs
         *            Console (http://code.google.com/apis/console)
         */
        public GoogleApi(EventBus eventBus, String clientId) {
            this.clientId = clientId;
            requestTransport = new ClientGoogleApiRequestTransport();
            requestTransport.setApplicationName(MY_APP_NAME)
                    .setApiAccessKey(MY_API_KEY);
            plus.initialize(eventBus, requestTransport);
            oAuth2Login = new ClientOAuth2Login(clientId);
            oAuth2Login.withScopes(PlusAuthScope.PLUS_ME);
        }
    
        public void login(final Receiver<String> callback) {
            oAuth2Login.login(new Receiver<String>() {
                @Override
                public void onSuccess(String response) {
                    requestTransport.setAccessToken(response);
                    callback.onSuccess(response);
                }
    
                @Override
                public void onFailure(ServerFailure error) {
                    Window.alert(error.getMessage());
                }
            });
        }
    
        public void getUserInfo(Receiver<Person> receiver) {
            plus.people().get("me").to(receiver).fire();
        }
    }
    

    以下显示故障发生的位置:

    GoogleApi googleApi = new GoogleApi(eventBus, MY_CLIENT_ID);
    
    googleApi.login(new Receiver<String>() {
        @Override
        public void onSuccess(final String token) {
            // login is successful and access token is received
    
            // but the following call fails with "Cannot call method 'newHttpRequest'
            // of undefined" error
            googleApi.getUserInfo(new Receiver<Person>() {
                @Override
                public void onSuccess(Person person) {
                    // never gets here
                }
    
                @Override
                public void onFailure(ServerFailure error) {
                    // nor here
                }
            });
        }
    }
    

2 个答案:

答案 0 :(得分:3)

尝试更新您的gwt-google-apis库,6月份进行了一次更改,通过调用$wnd.googleapis.newHttpRequest()来取代对$wnd.gapi.client.rpcRequest()的来电:https://code.google.com/p/gwt-google-apis/source/detail?r=2041

认证的原因是它不使用相同的代码与服务器通信。

答案 1 :(得分:1)

我玩过代码(仍然使用版本1.0.2-alpha)并使其正常工作!以下是更新后的代码:

public final class GoogleApi {
    private static final Plus plus = GWT.create(Plus.class);

    private final String clientId;

    private EventBus eventBus;

    private final ClientOAuth2Login oAuth2Login;
    private ClientGoogleApiRequestTransport requestTransport;

    private String accessToken;

    /**
     * @param clientId
     *            This app's personal client ID assigned by the Google APIs
     *            Console (http://code.google.com/apis/console)
     */
    public GoogleApi(final EventBus eventBus, String clientId) {
        this.eventBus = eventBus;
        this.clientId = clientId;
        oAuth2Login = new ClientOAuth2Login(clientId);
        oAuth2Login.withScopes(PlusAuthScope.PLUS_ME);
    }

    public void login(final Receiver<String> callback) {
        oAuth2Login.login(new Receiver<String>() {
            @Override
            public void onSuccess(String response) {
                accessToken = response;
                callback.onSuccess(response);
            }

            @Override
            public void onFailure(ServerFailure error) {
                Window.alert(error.getMessage());
            }
        });
    }

    public void getUserInfo(final Receiver<Person> receiver) {
        requestTransport = new ClientGoogleApiRequestTransport();
        requestTransport.setApplicationName(ClientConstants.GOOGLE_APP_NAME)
                .setApiAccessKey(ClientConstants.GOOGLE_API_KEY)
                .setAccessToken(accessToken);
        requestTransport.create(new Receiver<GoogleApiRequestTransport>() {
            @Override
            public void onSuccess(GoogleApiRequestTransport transport) {
                plus.initialize(eventBus, transport);
                plus.people().get("me").to(receiver).fire();
            }
        });
    }
}
但是,我不知道这有多高效。每次调用getUserInfo()时都会调用Plus的initialize()方法。

对我来说,下一步是使用最新版本的API手动构建一个jar并相应地调整我的代码:/祝我好运!