Запись данных из одного сервлета Java в другой - PullRequest
9 голосов
/ 19 сентября 2008

Я пытаюсь написать сервлет, который будет отправлять файл XML (строку в формате xml) другому сервлету через POST. (Необязательный генерирующий код xml заменен на «Hello there»)

   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();

Это вызывает ошибку сервера, и второй сервлет никогда не вызывается.

Ответы [ 4 ]

13 голосов
/ 19 сентября 2008

Подобные вещи намного проще, если использовать такую ​​библиотеку, как HttpClient . Есть даже пример XML-кода для поста :

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);
8 голосов
/ 19 сентября 2008

Я рекомендую использовать Apache HTTPClient , потому что это более приятный API.

Но чтобы решить эту текущую проблему: попробуйте позвонить connection.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();
2 голосов
/ 20 сентября 2008

Содержимое HTTP-потока пост-загрузки и его механизм не соответствуют ожиданиям. Вы не можете просто записать файл в качестве содержимого публикации, потому что POST имеет очень специфические стандарты RFC о том, как данные, включенные в запрос POST, должны отправляться. Это не только форматирование самого контента, но и механизм его «записи» в выходной поток. Много времени POST теперь написано кусками. Если вы посмотрите на исходный код HTTPClient Apache, вы увидите, как он записывает куски.

Существуют причуды с длиной содержимого в результате, потому что длина содержимого увеличивается на небольшое число, идентифицирующее фрагмент, и случайную небольшую последовательность символов, которая разделяет каждый фрагмент по мере его записи в потоке. Посмотрите на некоторые другие методы, описанные в более новых версиях Java HTTPURLConnection.

http://java.sun.com/javase/6/docs/api/java/net/HttpURLConnection.html#setChunkedStreamingMode(int)

Если вы не знаете, что делаете, и не хотите изучать это, то работа с добавлением зависимости, такой как Apache HTTPClient, действительно оказывается намного проще, потому что она абстрагирует всю сложность и просто работает.

2 голосов
/ 19 сентября 2008

Не забудьте использовать:

connection.setDoOutput( true)

если вы намереваетесь отправить вывод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...