Я планирую, чтобы серверная программа получала токен доступа к моей учетной записи Dropbox и перешла на
клиентская программа для загрузки в мою папку Dropbox. Клиенту не нужна учетная запись БД или логин, и он может отправлять файл в мою папку БД (таким образом, НЕ используя OAuth ...). Что-то похожее:
но без загрузки пользователя на сервер сначала, то есть, как только пользователь получает токен доступа, они загружаются непосредственно в БД.
Я попытался использовать Apache httpclient 4.3 для имитации браузера для выполнения получения токена запроса, отправки информации для входа в систему для получения токена доступа, но застрял при загрузке файла по почте в форму. Ошибка: неверный запрос HTTP 400 ...
executing request:GET https://www.dropbox.com/login HTTP/1.1
----------------------------------------
HTTP/1.1 200 OK
Request Token: moiejtzdLqTA_0sh3gQyNZAI
executing request:POST https://www.dropbox.com/login HTTP/1.1
----------------------------------------
HTTP/1.1 200 OK
Access Token: 5Ot52QKDbDPSsL1ApU4MIapJ
executing request:POST https://dl-web.dropbox.com/upload?
name=sample.jpg&dest=upload&cookie_t=5Ot52QKDbDP....SsJ&t=5Ot5...apJ HTTP/1.1
----------------------------------------
HTTP/1.1 400 Bad Request
Я использовал Firefox LiveHttpHeader для захвата заголовков при входе в систему и загрузке файла, и увидел, что сообщение для загрузки файла на самом деле делает это (и отражается в коде):
https://dl-web.dropbox.com/chunked_upload?
name=tmp1.jpg
&chunk=0
&chunks=1
&bjar=W3sic2Vzc1..............Q%253D%253D
&blid=AAAw4tn................2cDxA
&cookie_t=32yq........nw6c34o
&dest=
&t=32yqVof........c34o
&reported_total_size=5611
&upload_id=1BKGRRP5TpCEjcWSu5tmpQ
&offset=0
Итак, по-видимому, я пропустил какой-то параметр, но не могу понять, что. Маркер доступа кажется действительным, поскольку я могу видеть информацию о своей учетной записи в ответе из сообщения httpclinet на https://www.dropbox.com/home, но загрузка просто не работает. Кто-нибудь имеет аналогичный опыт и получает ошибку HTTP 400? .... Огромное спасибо !
Некоторый код, как показано ниже:
Конструктор и main ():
// constructor ...
public HttpClientExample() {
gcookies = new BasicCookieStore();
globalConfig = RequestConfig.custom()
.setCookieSpec(CookieSpecs.BEST_MATCH)
.build();
// Create local HTTP context
ghttpContext = HttpClientContext.create();
ghttpContext.setCookieStore(gcookies);
//
redirectStrategy = new LaxRedirectStrategy(); // for http redirect ...
httpclient = HttpClients.custom()
.setDefaultRequestConfig(this.globalConfig)
.setDefaultCookieStore(this.gcookies)
.setRedirectStrategy(redirectStrategy)
.build();
} // constructor ...
public static void main(String[] args) throws Exception {
HttpClientExample myhttp = new HttpClientExample();
try {
this.localConfig = RequestConfig.copy(this.globalConfig)
.setCookieSpec(CookieSpecs.BROWSER_COMPATIBILITY)
.build();
String requestToken = this.getRequestToken(httpclient, loginurl);
theAccessToken = this.postForAccessToken(requestToken, loginurl);
String localFileTopassIn = this.localPath ;
this.postToUpload(httpclient, this.theAccessToken, localFileTopassIn , this.dropboxFolderOnlyName);
}
}
Получите токен запроса:
private String getRequestToken(HttpClient client, String theURL) throws Exception {
HttpGet httpget = new HttpGet(theURL);
httpget.setConfig(localConfig);
httpget.setHeader("Connection", "keep-alive");
System.out.println("\nexecuting request:" + httpget.getRequestLine());
// Create a custom response handler
ResponseHandler responseHandler = new ResponseHandler() {
public String handleResponse(final HttpResponse response)
throws ClientProtocolException, IOException {
int status = response.getStatusLine().getStatusCode();
if (status >= 200 ) { // && status cookies = gcookies.getCookies();
for (Cookie aCookie: cookies) {
String cookieName = aCookie.getName();
if ( !(cookieName.lastIndexOf(gvcString) == -1) ) {
gvc = aCookie.getValue();
} else if ( !(cookieName.lastIndexOf(tString) == -1) ) {
requestToken = aCookie.getValue();
}
}
System.out.println("Request Token: " + requestToken );
return requestToken;
}
postForAccessToken:
private String postForAccessToken(HttpClient client, String requestToken, String theURL) throws Exception{
/*
* Send a post together with request token and my login to get accessToken ...
*/
HttpPost httppost = new HttpPost(theURL); // loginurl);
httppost.setConfig(localConfig);
ghttpContext.setCookieStore(gcookies);
List params = new LinkedList();
params.add(new BasicNameValuePair("login_email", myemail));
params.add(new BasicNameValuePair("login_password", mypasswd));
params.add(new BasicNameValuePair("t", requestToken));
HttpEntity postentity = new UrlEncodedFormEntity(params);
httppost.setEntity(postentity);
System.out.println("\nexecuting request:" + httppost.getRequestLine());
// Create a custom response handler
ResponseHandler responseHandler = new ResponseHandler() {
public String handleResponse(final HttpResponse response)
throws ClientProtocolException, IOException {
int status = response.getStatusLine().getStatusCode();
if (status >= 200 ) { // && status cookies = gcookies.getCookies();
for (Cookie aCookie: cookies) {
String cookieName = aCookie.getName();
if ( !(cookieName.lastIndexOf(tString) == -1) ) {
theAccessToken = aCookie.getValue();
}
}
System.out.println("Access Token: " + theAccessToken );
return theAccessToken;
}
postToUpload:
private String postToUpload(HttpClient client, String accessToken, String localFileInfo, String destPath) throws Exception{ String bjarString = "bjar"; String blidString = "blid"; String bjar=null; String blid=null; List cookies = gcookies.getCookies(); for (Cookie aCookie: cookies) { String cookieName = aCookie.getName(); if ( !(cookieName.lastIndexOf(bjarString) == -1) ) { bjar = aCookie.getValue(); } else if ( !(cookieName.lastIndexOf(blidString) == -1) ) { blid = aCookie.getValue(); } } String[] fileNameArry = localFileInfo.split("(\\\\|/)"); String filename = fileNameArry[fileNameArry.length - 1]; // get the last part ... URI uri = new URIBuilder() .setScheme("https") .setHost("dl-web.dropbox.com") .setPath("/upload") .setParameter("name", filename) .setParameter("dest", destPath) .setParameter("cookie_t", accessToken) .setParameter("t", accessToken) .build(); HttpPost httppost = new HttpPost(uri); httppost.setConfig(localConfig); ghttpContext.setCookieStore(gcookies); FileBody bin = new FileBody(new File(localFileInfo)); StringBody comment = new StringBody("A binary file of some kind", ContentType.DEFAULT_BINARY); HttpEntity reqEntity = MultipartEntityBuilder.create() .addPart("bin", bin) .addPart("comment", comment) .build(); httppost.setEntity(reqEntity); // add header httppost.setHeader("Host", "www.dropbox.com"); httppost.setHeader("User-Agent", USER_AGENT); httppost.setHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); httppost.setHeader("Connection", "keep-alive"); httppost.setHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); httppost.setHeader("Pragma", "no-cache"); httppost.setHeader("Cache-Control", "no-cache"); // add entity System.out.println("\nexecuting request:" + httppost.getRequestLine()); // Create a custom response handler ResponseHandler responseHandler = new ResponseHandler() { public String handleResponse(final HttpResponse response) throws ClientProtocolException, IOException { int status = response.getStatusLine().getStatusCode(); if (status >= 200 ) { // && status