我使用Dropbox的API的Java的1.6版本在这里找到:https://www.dropbox.com/developers/core/sdks/java的Dropbox的Java API
我也使用GWT 2.5.1在Eclipse 3.7
我有以下代码作为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);
这只适用于当我运行它作为Java应用程序。但是,当我尝试在RemoteServiceServlet中使用GWT进行类似的操作时。我得到一个异常时,我尝试做
webauth = new DbxWebAuthNoRedirect(requestConfig, appInfo);
我得到例外的是以下内容:
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
我一直在敲打我的头靠在墙上的最后几个小时,试图找出到底是怎么回事。我原本想使用DbxWebAuth,但其API中的文档包含有不存在的类的指令(我假设他们曾经一次)。
我觉得DbxWebAuthNoRedirect正在根据可用的类动态加载连接。但我一直无法弄清楚。
在此先感谢您的帮助!
EDITS:
好了,我看着的Dropbox API源和错误发生在这里:
URL urlObject = new URL(url);
HttpsURLConnection conn = (HttpsURLConnection) urlObject.openConnection(this.proxy);
因为我使用谷歌应用程序引擎,它使用自己的URL对象,而比App Engine API导入的版本更高。任何关于不涉及为Dropbox API写入GWT包装的解决方案的想法。
您是在为Google应用引擎开发吗?如果是这样,在Dropbox API所使用的错误消息“HttpsURLConnection”中提到的类与应用程序引擎的工作方式不兼容。如果您没有开发应用程序引擎,则需要禁用应用程序引擎。 –
我正在使用GAE。任何关于解决问题的想法? – Joe
在你的编辑。 GAE根据传递的URL在内部创建一个连接器。但是,由于dropbox api是一个'https' url,因此dropbox api希望返回一个安全的连接类,并将它转换为该类。但GAE只支持'http',并且会返回一个不安全的http连接器,该连接器不能转换为安全连接类。由于dropbox api的源代码在github上,因此您可以尝试将代码更改为不安全的对象,但我不知道这是否可行。 (作为一个方面说明,这不是一个GWT问题,而是一个GAE问题) –