Java:如何发布此XML请求?

时间:2011-05-13 11:05:00

标签: java web-services web-applications

我正在使用WebServices处理SOA。 所以我需要发送一个XML请求来接收带有响应的另一个XML。

我创建了这个类:

package com.ws.test;

import java.net.*;
import java.io.*;

public class SendXML {

    public static void main(String[] args) {

        try {
            String strSOAP = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";

            strSOAP += "<SOAP-ENV:Envelope ";

            strSOAP += " xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/";

            strSOAP += " xmlns:SOAP-ENC=\"http://schemas.xmlsoap.org/soap/encoding/";

            strSOAP += " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance";

            strSOAP += " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema";

            strSOAP += " xmlns:ns=\"urn:bacnet_ws\">";

            strSOAP += " <SOAP-ENV:Body SOAP-ENV:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">";

            strSOAP += " <ns:getValue>";

            strSOAP += " <ns:options></ns:options>";

            strSOAP += " <ns:path>/.sysinfo/.vendor-name</ns:path>";

            strSOAP += " </ns:getValue>";

            strSOAP += " </SOAP-ENV:Body>";

            strSOAP += "</SOAP-ENV:Envelope>";


            //Create socket
            String hostname = "192.168.1.2";
            int port = 8080;
            InetAddress addr = InetAddress.getByName(hostname);
            Socket sock = new Socket(addr, port);

            //Send header
            String path = "/rcx-ws/rcx";
            BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream(), "UTF-8"));
            // You can use "UTF8" for compatibility with the Microsoft virtual machine.
            wr.write("POST " + path + " HTTP/1.0\r\n");
            wr.write("Host: 192.168.1.2\r\n");
            wr.write("Content-Length: " + strSOAP.length() + "\r\n");
            wr.write("Content-Type: text/xml; charset=\"utf-8\"\r\n");
            wr.write("\r\n");

            //Send data
            wr.write(strSOAP);
            wr.flush();

            // Response
            BufferedReader rd = new BufferedReader(new InputStreamReader(sock.getInputStream()));
            String line;
            while ((line = rd.readLine()) != null) {

                System.out.println(line);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

但这不对,因为我收到此消息错误:

  

HTTP / 1.1 500内部服务器错误   服务器:gSOAP / 2.7内容类型:   文/ XML;字符集= utf-8的   内容长度:570连接:关闭

     

  SOAP-ENV:VersionMismatchSOAP   版本不匹配或无效的SOAP   消息

我需要将此参数发送到另一个系统:

strSOAP += " <ns:getValue>";

strSOAP += " <ns:options></ns:options>";

strSOAP += " <ns:path>/.sysinfo/.vendor-name</ns:path>";

strSOAP += " </ns:getValue>";

我如何用Java做到这一点?

祝你好运, Valter Henrique。

2 个答案:

答案 0 :(得分:1)

好主人。不要过于讽刺,但你没有听说过JAX-WS吗? JAX-RS?甚至是卑微但可靠的JAX-RPC?如果你真的试图用这种旧石器时代的方式手工建立一个Web服务请求,你怎么能在基于Web服务的SOA上工作呢。

我的意思是,来吧,我知道我们不应该告诉别人'google it',但是说真的,在尝试编码疯狂之前,你曾经在'网络服务电话示例'做谷歌吗?这是2011年,而不是1994-95,当时大多数人都不知道网络搜索是什么。

我建议你从Java EE 5 JAX-WS tutorial开始,因为你需要学习很多东西。祝你好运。

答案 1 :(得分:1)

如果您坚持使用套接字传输数据,则必须查看SOAP specifications。例如,SOAP 1.1需要SOAPAction HTTP header。在开始编写代码之前,请使用soapUI之类的工具检查请求的有效性。

通常,您最好使用现有的客户端API(其中有几个可供选择)。例如,您可以轻松使用hand-crafted soap requests with JAX-WS

一些注意事项:


代码泄漏资源。 Close你的溪流。请参阅try/finally pattern


BufferedWriter wr = new BufferedWriter(
                     new OutputStreamWriter(sock.getOutputStream(), "UTF-8"));
//...
wr.write("Content-Length: " + strSOAP.length() + "\r\n");

对于U + 007F以上的代码点,这是不安全的,因为String.length()返回UTF-16中的代码单元数。 Content-Length应包含byte s中的长度;不是Java char s。