Как скачать файл с логином используя HttpURLConnection - PullRequest
1 голос
/ 22 июня 2011

Для моего приложения для Android мне нужно скачать файл с сайта, требующего входа в систему. Это не базовая аутентификация http, а эмуляция формы.

Будучи новичком в Android, я действительно не знаю, с чего начать, но в PHP это легко сделать с помощью cUrl:

// Set standard options
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7) Gecko/20040803 Firefox/0.9.3");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_COOKIEJAR, "somecookiejar");
curl_setopt($ch, CURLOPT_COOKIEFILE, "somecookiefile");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

// Login
curl_setopt($ch, CURLOPT_URL, "https://example.com" );
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
curl_setopt($ch, CURLOPT_POSTFIELDS, "username=myusername&password=mypassword");
curl_exec($ch);

// Get the file
curl_setopt($ch, CURLOPT_URL, "http://example.com/files/myfile.mp3");
curl_setopt($ch, CURLOPT_POST, 0 );
writefile(curl_exec($ch), "myfile.mp3");
curl_close($ch);

Буду признателен за любую помощь в выполнении этого в Android.

Примечание: я упоминаю HttpURLConnection в теме, но другие предложения, конечно, приветствуются:)

Редактировать: я думаю, что я должен немного уточнить. В первом запросе к форме входа задаются имя пользователя и пароль. Сервер возвращает набор файлов cookie, которые затем передаются во второй запрос, где происходит фактическая загрузка файла. Код на самом деле является рабочим примером из PHP (хотя и анонимным), и моя конкретная проблема заключается в обработке файлов cookie между запросами. В cUrl все эти файлы cookie происходят автоматически. Спасибо!

Ответы [ 2 ]

4 голосов
/ 23 июня 2011

Это то, что я придумал, мне помог ответ S201 плюс много гуглов.Код упрощен и не имеет конструкций try-catch.

HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost("https://example.com/login");
HttpResponse response = null;
List<NameValuePair> postFields = new ArrayList<NameValuePair>(2);

// Set the post fields
postFields.add(new BasicNameValuePair("username", "myusername"));
postFields.add(new BasicNameValuePair("password", "mypassword"));
post.setEntity(new UrlEncodedFormEntity(postFields, HTTP.UTF_8));

// Execute the POST request
response = client.execute(post);

// Now GET the file
HttpGet get = new HttpGet("http://example.com/files/myfile.mp3");
response = client.execute(get);

HttpEntity entity = response.getEntity();
InputStream in = entity.getContent();

// Save the file to SD
File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
path.mkdirs();
File file = new File(path, "myfile.mp3");
FileOutputStream fos = new FileOutputStream(file);

byte[] buffer = new byte[1024];
int len1 = 0;
while ((len1 = in.read(buffer)) > 0) {
        fos.write(buffer, 0, len1);
}

fos.close();
2 голосов
/ 23 июня 2011

Вы захотите использовать объект HttpClient в сочетании с объектами HttpPost, HttpGet и HttpResponse.Вероятно, проще взглянуть на пример.

HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost(context.getString(R.string.loginURL));
HttpResponse response = null;
List<NameValuePair> postFields = new ArrayList<NameValuePair>(2);  

// Set the post fields
postFields.add(new BasicNameValuePair("username", settings.getString("username", "null")));
postFields.add(new BasicNameValuePair("password", settings.getString("password", "null")));
post.setEntity(new UrlEncodedFormEntity(postFields, HTTP.UTF_8));

// Execute the POST request
response = client.execute(post);

Предполагая, что вход в систему прошел успешно, теперь вы можете выполнять запросы GET и POST от имени пользователя, прошедшего аутентификацию, до тех пор, пока вы выполняете их через исполняемый вами HttpClientлогин через.Именно этот объект управляет файлами cookie.Надеюсь, это поможет!

РЕДАКТИРОВАТЬ: забыл упомянуть, что вы, конечно, можете использовать объект HttpRespose для проверки ошибок.

...