2011-05-13 68 views
0

我正在使用WebServices使用SOA。 所以我需要发送一个XML请求来接收另一个XML与响应。Java:如何发布此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 Internal Server Error Server: gSOAP/2.7 Content-Type: text/xml; charset=utf-8 Content-Length: 570 Connection: close

SOAP-ENV:VersionMismatchSOAP version mismatch or invalid SOAP message

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

strSOAP += " <ns:getValue>"; 

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

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

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

我怎么能在Java中做到这一点?

此致敬礼, 瓦尔特恩里克。

+0

这是一种使用Web服务的疯狂方式。您确实需要使用适当的Web服务客户端框架,而不是张贴手工制作的XML字符串。 – skaffman 2011-05-13 11:06:17

回答

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。

+0

感谢您的帮助伙计 – 2011-05-13 23:03:09

1

好主人花花公子。不要过分讽刺,但你没有听说过JAX-WSJAX-RS?甚至不起眼,但可靠JAX-RPC?如果你真的想以这样的旧石器时代的方式手动构建Web服务请求,那么你如何才能开发基于Web服务的SOA?

我的意思是,来吧,我知道我们不应该告诉人们“谷歌它”,但严重的是,我们是否想到过你来尝试之前做的Web服务调用例如“一个谷歌是编码疯狂?这是2011年,而不是1994-95年,当时大多数人都不知道网络搜索是什么。

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

+1

感谢您的评论Luis,也没有人告诉JAX-WS或其他关于你的事情,所以我请求帮助。无论如何感谢 。 – 2011-05-13 23:02:44