kingxip 2009-07-11 18:44
浏览 797
已采纳

java 发送post请求,内容为xml

一个web service 提供了post请求方式,用户发送一个xml请求文档比如:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>


name

zhangsan




info


服务端会返回zhangsan的信息。上面的xml文档在浏览器中通过post表单方式正常执行。
但是在java中就不行了java种代码如下:
[code="java"]
package common.post;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

public class PostTest {
void testPost(String urlStr) {
try {
URL url=new URL(urlStr);
URLConnection con=url.openConnection();
con.setDoOutput(true);
OutputStreamWriter out=new OutputStreamWriter(con.getOutputStream());
String request=readFile();
System.out.println("Exedata satart\n"+request+"\nExe end");
out.write(new String(request.getBytes("ISO-8859-1")));

        out.flush();
        out.close();
        BufferedReader br=new BufferedReader(new InputStreamReader(con.getInputStream()));
        String line="";
        for(line=br.readLine();line!=null;line=br.readLine()) {
            System.out.println(line);
        }
    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
private String readFile() {
    StringBuilder sb=new StringBuilder();
    try {
        BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream("E:/raw.xml")));
                      //这里的raw.file内容就是 上面那个xml片段,就是读取内容,将请求的xml保存成字符串 进行post发送
        String line="";
        for(line=br.readLine();line!=null;line=br.readLine()) {
            sb.append(line+"\n");
        }

    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return sb.toString();
}
public static void main(String[] args) {
    String url="http://localhost:9000/WebService";
    new PostTest().testPost(url);
}

}

[/code]

结果一直是
There went something wrong with parsing the POST data: Premature end of file.
这是什么原因

[b]问题补充:[/b]
好像发现问题了:
我在webservice中有这个代码,是用来截取请求的字段的:
[code="java"]
InputStream is=......;

DocumentBuilderFactory fac = DocumentBuilderFactory.newInstance();
fac.setNamespaceAware(true);
//BufferedReader br=new BufferedReader(new InputStreamReader(is));
//FileOutputStream fos=new FileOutputStream("E:/is.xml");
//for(String line=br.readLine();line!=null;line=br.readLine()) {
// fos.write((line+"\n").getBytes());
//}
//fos.close();
//br.close();
// parse the InputStream to create a Document
doc = fac.newDocumentBuilder().parse(is);
[/code]

后来我把中间那个网文件写入的代码注释后 就没问题了 是不是一个InputStream只能用一次啊?
如果我想实现如上功能,就是先写入到文件中,然后解析,这个InputStream该怎么搞?复制一个?
[b]问题补充:[/b]
[quote]你都已经先写到文件中了,再解析就应该是对文件的内容进行解析了,而不是再去得到原来的InputStream输入流再进行操作 [/quote]

写到文件只是为了测试用的,这么说InputStream写入到文件后,就不能继续用了么?
[b]问题补充:[/b]
[quote]不是,看错了你的代码,

你只用了一次,程序看来是没什么问题[/quote]

现在问题已经解决了
[code="java"] 1. InputStream is=......;

  1. DocumentBuilderFactory fac = DocumentBuilderFactory.newInstance();
  2. fac.setNamespaceAware(true);
  3. //BufferedReader br=new BufferedReader(new InputStreamReader(is));
  4. //FileOutputStream fos=new FileOutputStream("E:/is.xml");
  5. //for(String line=br.readLine();line!=null;line=br.readLine()) {
  6. // fos.write((line+"\n").getBytes());
  7. //}
  8. //fos.close();
    1. //br.close();
    2. // parse the InputStream to create a Document
    3. doc = fac.newDocumentBuilder().parse(is); [/code] 还是这个代码 如果注释部分去掉注释 也就是执行的话 就会出错 如果注释掉就没问题. 我现在的疑问是如果注释代码执行,InputStream就用了2次,是不是因为这个原因,第一次是写入文件,第二次是parse,第二次这个流是不是已经空了,所以异常发生? [quote]web service的调用,我怀疑是不能以out.write(new String(request.getBytes("ISO-8859-1")));把请求内容写进去就当是post [/quote] 我觉得可能不是这个问题 因为con.setDoOutput(true); 就意味着post了
  • 写回答

6条回答 默认 最新

  • wanghaolovezlq 2009-07-12 12:33
    关注

    不是,看错了你的代码,

    你只用了一次,程序看来是没什么问题,

    web service的调用,我怀疑是不能以out.write(new String(request.getBytes("ISO-8859-1")));把请求内容写进去就当是post

    URL url=new URL(urlStr);
    HttpURLConnection con=(HttpURLConnection) url.openConnection();
    con.setRequestMethod("POST");

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

悬赏问题

  • ¥15 初学者用plt报错,求解答
  • ¥18 深度学习tensorflow1,ssdv1,coco数据集训练一个模型
  • ¥100 关于注册表摄像头和麦克风的问题
  • ¥30 代码本地运行正常,但是TOMCAT部署时闪退
  • ¥15 关于#python#的问题
  • ¥15 主机可以ping通路由器但是连不上网怎么办
  • ¥15 数据库一张以时间排好序的表中,找出多次相邻的那些行
  • ¥50 关于DynamoRIO处理多线程程序时候的问题
  • ¥15 kubeadm部署k8s出错
  • ¥15 Abaqus打不开cae文件怎么办?