2

我正在使用 Dropbox API for Java 的 1.6 版,在这里可以找到:https ://www.dropbox.com/developers/core/sdks/java

我也在 E​​clipse 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);

当我将它作为 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 正在做一些事情,它根据可用的类动态加载连接。但我一直无法弄清楚。

在此先感谢您的帮助!

编辑:

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

    URL urlObject = new URL(url);
    HttpsURLConnection conn = (HttpsURLConnection) urlObject.openConnection(this.proxy);

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

4

5 回答 5

8

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

new DbxRequestConfig(APP_NAME, userLocale, HttpRequestor);

因此,您需要做的就是调整 com.dropbox.core.http.StandardHttpRequestor 使其对 Appengine 友好

要点:AppengineHttpRequestor.java

于 2013-09-19T21:50:24.257 回答
1
DbxAppInfo appInfo = new DbxAppInfo(APP_KEY, APP_SECRET);
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("107.108.85.10", 80));

StandardHttpRequestor requ = new StandardHttpRequestor(proxy);
DbxRequestConfig config = new DbxRequestConfig("JavaTutorial/1.0",
Locale.getDefault().toString(),requ);
DbxWebAuthNoRedirect webAuth = new DbxWebAuthNoRedirect(config, appInfo);

因此,通过使用Proxy(我的防火墙)StandardHttpRequestor并在其中使用此请求DbxRequestConfig器对我有用。

于 2013-10-31T06:44:19.487 回答
1

您是否使用安全https://URL 进行连接?我的猜测是,如果您使用 ahttp://您会得到无法转换为安全连接的不安全连接器。

- 编辑 -

看起来HttpsURLConnectionGAE 根本不支持该类,因此它不会像 GAE 文档所说的那样工作。使用 HttpsURLConnection(文档问题)。这意味着您可能无法直接使用它。

于 2013-07-25T20:07:06.767 回答
0

我也面临同样的问题。根据这篇文章,https://groups.google.com/forum/#!topic /google-appengine-java/V8pREOXPX24 ,

com.google.apphosting.utils.security.urlfetch.URLFetchServiceStreamHandler 
$Connection extends the class java.net.HttpURLConnection

因此我更换了班级

javax.net.ssl.HttpsURLConnection

经过

java.net.HttpURLConnection 

在 com.dropbox.core.http.StandardHttpRequestor 类中并重建 Dropbox Java SDK。它工作正常。示例工作应用程序可以在https://gwt-gae-testing.appspot.com/

于 2013-08-24T05:46:00.457 回答
0

这是检索 access_token 的唯一方法(但我不知道如何处理 Dropbox API 的其他方法)。

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {

    String code = req.getParameter("code");

    URL fetchurl = new URL(url);
    HTTPRequest request = new HTTPRequest(fetchurl, HTTPMethod.POST);
    String body = "code=" + code + "&grant_type=authorization_code" + "&client_id=" + dropboKey + "&client_secret=" + dropboxSecret + "&redirect_uri=" + redirectUri;
    request.setPayload(body.getBytes("UTF-8"));

    HTTPResponse response = URLFetchServiceFactory.getURLFetchService().fetch(request);

    String respInJson = new String(response.getContent());

    LOGGER.warning(respInJson);

    JSONObject jsonObj;
    try {
        jsonObj = new JSONObject(respInJson);
        String uid=jsonObj.getString("uid");
        String access_token=jsonObj.getString("access_token");

    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
}

我建议像@radu-c 所说的那样更改 HttpRequestor 。它工作正常。

于 2014-05-23T18:41:33.960 回答