java httpurlconnection ошибка ввода http 400

Я почти дословно взял код HTTP PUT из этот пример из stackoverflow -- Я пытаюсь поместить XML-файл в оставшийся интерфейс ExistDB, но получаю значения "400 Bad Request" от URLConnection getResponseCode() и не вижу вообще ничего, записанного удаленным сервером, как будто запрос никогда не был отправлен.

URL target = new URL( "http://domain.com:8080/exist/rest/db/collection/doc.xml" )
HttpURLConnection uc = (HttpURLConnection) target.openConnection();
uc.setDoOutput(true);
uc.setDoInput(true);
uc.setRequestMethod("PUT");

uc.setConnectTimeout(CONNECT_TIMEOUT); // timeouts are both 2000L
uc.setReadTimeout(READ_TIMEOUT); //ms
uc.setRequestProperty("Content-type", "text/xml");

// basic Auth s.getLogin() already recorded as username:pwd format
String auth = new String( Base64.encodeBase64String( s.getLogin().getBytes() ));
auth = auth.replaceAll("\n",""); // sun bug_id 6459815
uc.setRequestProperty("Authorization", "Basic " + auth ); 

uc.connect(); // tried moving this to after the body section below

PrintWriter body = new PrintWriter(uc.getOutputStream());
InputStream sml = smlStream(this.pathid);
StringBuilder xml = new StringBuilder( new Scanner(sml).useDelimiter("\\A").next());
body.print(xml);
body.close();
uc.disconnect(); // appears to make no difference

uc.getResponseCode() теперь имеет значение 400

Если я использую curl для того же URL-адреса и того же XML-файла в теле (curl -v -u uname:pw -T file.xml http://domain.com:8080/exist/rest/db/collection/doc.xml), отправив запрос под тот же с того же компьютера, документ проходит и возвращает ответ 201, как и ожидалось. С другой стороны, версия Java (с использованием openjdk7) ничего не делает.

У меня есть эти установленные вызовы в правильном порядке? есть ли способ получить больше информации о том, почему синтаксис запроса недействителен?


person MrG    schedule 15.05.2013    source источник
comment
Оказывается, это может немного ввести в заблуждение: если я закомментирую блок, устанавливающий базовую аутентификацию, код работает (или, по крайней мере, отправляет на сервер, хотя вместо этого получает 401 ошибку, но, по крайней мере, < i>что-то делает. Итак, мой вопрос изменен: что не так с моим кодом базовой аутентификации?   -  person MrG    schedule 16.05.2013


Ответы (1)


кажется, что последняя подсказка ведет к решению, хотя и не к объяснению: я заменил вызов кодировщика Apache Base64 эквивалентным вызовом sun.misc.BASE64Encoder, и код волшебным образом работает, как и ожидалось.

BASE64Encoder codex = new BASE64Encoder();
String auth = codex.encode( s.getLogin().getBytes() );
uc.setRequestProperty("Authorization", "Basic " + auth ); 

и все хорошо. org.apache.commons.codec.binary.Base64 явно не работает.

person MrG    schedule 16.05.2013