具有GWT身份验证问题的Dropbox Java API

Joe*_*Joe 2 java gwt dropbox dropbox-api

我在这里使用Dropbox API for Java的1.6版本:https://www.dropbox.com/developers/core/sdks/java

我也在Eclipse 3.7中使用GWT 2.5.1

我有以下代码作为Java Applcation运行时有效:

    DbxRequestConfig requestConfig = new DbxRequestConfig(type, locale);
    DbxAppInfo appInfo = new DbxAppInfo(APP_ID, APP_SECRET);
    DbxWebAuthNoRedirect webauth = new DbxWebAuthNoRedirect(requestConfig, appInfo);
    String result = webauth.start();
    System.out.println(result);
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    String code = reader.readLine();

    webauth = new DbxWebAuthNoRedirect(requestConfig, appInfo);
    DbxAuthFinish finish = webauth.finish(code);

    DbxClient client = new DbxClient(requestConfig, finish.accessToken);
    DbxAccountInfo info = client.getAccountInfo();
    long total = info.quota.total;
    long used = info.quota.normal;

    System.out.println("total: " + total);
    System.out.println("used: " + used);
Run Code Online (Sandbox Code Playgroud)

当我将它作为Java应用程序运行时,这只会工作.但是,当我尝试在RemoteServiceServlet中使用GWT做类似的事情时.我尝试做的时候会遇到异常

webauth = new DbxWebAuthNoRedirect(requestConfig, appInfo);
Run Code Online (Sandbox Code Playgroud)

我得到的例外情况如下:

Caused by: java.lang.ClassCastException: com.google.apphosting.utils.security.urlfetch.URLFetchServiceStreamHandler$Connection cannot be cast to javax.net.ssl.HttpsURLConnection
at com.dropbox.core.http.StandardHttpRequestor.prepRequest(StandardHttpRequestor.java:160)
at com.dropbox.core.http.StandardHttpRequestor.startPost(StandardHttpRequestor.java:87)
at com.dropbox.core.http.StandardHttpRequestor.startPost(StandardHttpRequestor.java:21)
at com.dropbox.core.DbxRequestUtil.startPostNoAuth(DbxRequestUtil.java:156)
at com.dropbox.core.DbxRequestUtil.doPostNoAuth(DbxRequestUtil.java:289)
at com.dropbox.core.DbxWebAuthHelper.finish(DbxWebAuthHelper.java:40)
at com.dropbox.core.DbxWebAuthNoRedirect.finish(DbxWebAuthNoRedirect.java:84)
at com.cloudshare.server.DropboxPlayground.getFinish(DropboxPlayground.java:21)
at com.cloudshare.server.DropboxServiceImpl.authenticate(DropboxServiceImpl.java:70)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.google.appengine.tools.development.agent.runtime.Runtime.invoke(Runtime.java:115)
at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:561)
... 40 more
Run Code Online (Sandbox Code Playgroud)

在过去的几个小时里,我一直在撞墙,试图弄清楚发生了什么.我最初想使用DbxWebAuth,但其API中的文档包含的指令包含不存在的类(我假设它们一次都这样做).

我觉得DbxWebAuthNoRedirect正在做一些事情,它根据可用的类动态加载连接.但我无法弄明白.

在此先感谢您的帮助!

EDITS:

好的,所以我查看了Dropbox API源代码,错误发生在这里:

    URL urlObject = new URL(url);
    HttpsURLConnection conn = (HttpsURLConnection) urlObject.openConnection(this.proxy);
Run Code Online (Sandbox Code Playgroud)

因为我使用的是Google App Engine,所以它使用的是自己的URL对象,而不是App Engine API导入的对象.关于解决方案的任何想法都不涉及为Dropbox API编写GWT包装器.

小智 8

最新的Dropbox SDK允许您选择HttpRequestor实现

new DbxRequestConfig(APP_NAME, userLocale, HttpRequestor);

所以你需要做的就是使com.dropbox.core.http.StandardHttpRequestor适应Appengine友好

要点:AppengineHttpRequestor.java