将发布数据从一个java servlet写入另一个

时间:2008-09-18 20:06:31

标签: java servlets

我正在尝试编写一个servlet,它将通过POST将XML文件(xml格式化的字符串)发送到另一个servlet。 (非必要的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();

这导致服务器错误,并且永远不会调用第二个servlet。

4 个答案:

答案 0 :(得分:13)

使用像HttpClient这样的库,这样的事情要容易得多。甚至有post XML code example

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

答案 1 :(得分:8)

我建议使用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 :(得分:2)

不要忘记使用:

connection.setDoOutput( true)

如果您打算发送输出。

答案 3 :(得分:2)

HTTP帖子上传流的内容及其机制似乎并不像您期望的那样。您不能只将文件写为帖子内容,因为POST对于如何发送POST请求中包含的数据有非常具体的RFC标准。它不仅仅是内容本身的格式化,而且它也是如何“写入”输出流的机制。很多时候POST现在是用块写的。如果你看一下Apache的HTTPClient的源代码,你会看到它是如何编写块的。

结果有内容长度的怪癖,因为内容长度增加了一小部分来识别块,以及一个随机的小字符序列,它们在流写入时划分每个块。查看更新的Java版本的HTTPURLConnection中描述的其他一些方法。

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

如果您不知道自己在做什么并且不想学习它,那么处理添加像Apache HTTPClient这样的依赖关系确实会变得更容易,因为它抽象了所有的复杂性并且只是起作用。