Запись данных сообщения из одного сервлета Java в другой

Я пытаюсь написать сервлет, который отправит файл XML (строка в формате xml) другому сервлету через POST. (Необязательный код генерации xml заменен на "Привет!")

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

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


person denny    schedule 18.09.2008    source источник


Ответы (4)



Вместо этого я рекомендую использовать 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();
person Sietse    schedule 18.09.2008

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

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

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

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

person Josh    schedule 19.09.2008

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

connection.setDoOutput( true)

если вы собираетесь отправлять выходные данные.

person Craig B.    schedule 18.09.2008