ฉันใช้ Dropbox API เวอร์ชัน 1.6 สำหรับ Java ที่นี่: https://www.dropbox.com/developers/core/sdks/java
ฉันยังใช้ 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 อย่างไรก็ตาม เมื่อฉันพยายามทำสิ่งที่คล้ายกับ GWT ภายใน RemoteServiceServlet ฉันได้รับข้อยกเว้นเมื่อฉันพยายามทำ
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 แนวคิดใดๆ เกี่ยวกับโซลูชันที่ไม่เกี่ยวข้องกับการเขียน GWT wrapper สำหรับ Dropbox API
HttpsURLConnection
ที่ใช้โดย dropbox api เข้ากันไม่ได้กับวิธีการทำงานของ App Engine หากคุณไม่ได้พัฒนาสำหรับ app engine คุณต้องปิดการใช้งาน app-engine - person Hilbrand Bouwkamp   schedule 25.07.2013https
url และด้วยเหตุนี้ dropbox api จึงคาดว่าคลาสการเชื่อมต่อที่ปลอดภัยจะถูกส่งกลับ จึงส่งไปที่คลาสนั้น อย่างไรก็ตาม GAE รองรับเฉพาะhttp
และจะส่งคืนตัวเชื่อมต่อ http ที่ไม่ปลอดภัย ซึ่งไม่สามารถส่งไปยังคลาสการเชื่อมต่อที่ปลอดภัยได้ เนื่องจากซอร์สโค้ดของ dropbox api อยู่บน github คุณจึงสามารถลองเปลี่ยนโค้ดเป็นวัตถุที่ไม่ปลอดภัยได้ แต่ฉันไม่รู้ว่าจะได้ผลหรือไม่ (ตามหมายเหตุด้านข้างนี่ไม่ใช่ปัญหา GWT แต่เป็นปัญหา GAE) - person Hilbrand Bouwkamp   schedule 26.07.2013