Я пытаюсь написать сервлет, который отправляет XML-файл (XML отформатированная строка) к другому сервлету через пост. (Не важно генерации XML-кода заменяются на "Привет и quot;)
StringBuilder sb= new StringBuilder();
sb.append("Hello there");
URL url = new URL("theservlet's URL");
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Length", "" + sb.length());
OutputStreamWriter outputWriter = new OutputStreamWriter(connection.getOutputStream());
outputWriter.write(sb.toString());
outputWriter.flush();
outputWriter.close();
Это вызывает ошибку сервера, а второй сервлет никогда не вызывается.
Такого рода вещи гораздо проще, используя библиотеку как с помощью HttpClient. Там'ы даже сообщение пример кода XML]2:
PostMethod post = new PostMethod(url);
RequestEntity entity = new FileRequestEntity(inputFile, "text/xml; charset=ISO-8859-1");
post.setRequestEntity(entity);
HttpClient httpclient = new HttpClient();
int result = httpclient.executeMethod(post);
Я рекомендую использовать Apache класс HttpClient вместо этого, потому что это'ы лучше по API.
Но чтобы решить данную проблему: попробовать позвонить в связи.setDoOutput(true); в` после открытия подключения.
StringBuilder sb= new StringBuilder();
sb.append("Hello there");
URL url = new URL("theservlet's URL");
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.setDoOutput(true);
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Length", "" + sb.length());
OutputStreamWriter outputWriter = new OutputStreamWriter(connection.getOutputStream());
outputWriter.write(sb.toString());
outputWriter.flush();
outputWriter.close();
Дон'т забудьте использовать:
connection.setDoOutput( true)
если вы собираетесь отправить вывод.
Содержимое HTTP-запрос POST потока загрузки и его механике Дон'т, кажется, чтобы быть, что вы ожидаете, чтобы они. Вы не можете просто записать файл в содержимое поста, ведь пост имеет весьма специфические стандарты RFC на том, как данные, включенные в POST-запрос должен быть отправлен. Это не просто отформатирован самого контента, но и механика как она есть "написано, что" в OutputStream. Много времени сейчас пишут в куски. Если вы посмотрите на исходный код для Apache'ы с помощью HttpClient вы увидите, как он пишет кусками.
Есть закидоны с длиной содержимого в результате, потому что длина содержимого увеличивается на небольшое количество выявления кусок и случайных небольших последовательность символов, которая отделяет каждого блока, как написано над ручьем. Посмотрите на некоторые из других методов, описанных в более новых версиях Java для HTTPURLConnection.
http://java.sun.com/javase/6/docs/api/java/net/HttpURLConnection.html#setChunkedStreamingMode(инт)
Если вы Don'т знаю, что вы делаете Дон'т хотите, чтобы узнать его, общаясь с добавлением зависимостей, таких как Apache HttpClient, который действительно оказаться гораздо легче, потому что он абстрагирует все сложности и просто работает.