Я пытаюсь загрузить файл с помощью Java, используя PUT, сервер выполняет аутентификацию дайджеста. Я хочу, чтобы он был худым, поэтому я пытаюсь использовать HttpURLConnection.Java HTTP PUT с аутентификацией дайджеста в Java
public void putData(String path, byte [] data) throws IOException, MalformedURLException {
Authenticator.setDefault(new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(user,password.toCharArray());
}});
debug("Default authenticator set");
//Safeguard against double slashes
if (path.startsWith("/")) {
path = path.replaceFirst("/","");
}
debug(hostname + path);
URL url = new URL(hostname + path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
debug("HttpURLConnection acquired");
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setRequestMethod("PUT");
conn.setRequestProperty("Content-Length",String.valueOf(data.length));
conn.setRequestProperty("Content-type","application/binary");
conn.setFixedLengthStreamingMode(data.length);
conn.connect();
debug("Properties set");
OutputStream out = conn.getOutputStream();
debug("Outputstrem acquired");
out.write(data,0,data.length);
out.flush();
out.close();
debug("Data written, stream closed.");
}
По какой-то причине это не удается безнадежно: Я вижу 401 возвращается, а затем это делается. Если я отключу авторизацию, работает тот же код. Загрузка файла с похожим кодом с использованием дайджест-аутентификации «просто работает». Есть идеи? Я бы предпочел не использовать следующие так много библиотек, как htclient из Apache или так (... это 2010 ... вы ожидаете, что HTTP-запросы с дайджестом authN будут работать в любой стандартной библиотеке).
Да, это делает трюк, и O необходимо удалить строку conn.setFixedLengthStreamingMode (data.length); – Maarten
Хм, слишком скоро .... Что происходит, так это то, что теперь клиент аутентифицируется правильно, но данные никогда не отправляются из основного выходного потока (я скрываю после записи). В принципе, я просто хочу установить Authenticator, подключиться, получить выходной поток и написать свои данные. Поэтому мне нужно получить ссылку на входной поток (почему это не связано с настройкой соединения ...), но что еще. Это должно быть несколько строк - в чем заключается использование стандартной библиотеки классов в противном случае (извините за пронзание ...) – Maarten
В частности: мне нужно вызвать conn.getInputStream() для правильной проверки подлинности (я вижу это на ожидающий сервер, для загруженных данных). Это выглядит так, как будто вызов никогда не возвращается, даже println после получения входного потока не достигнут – Maarten