我正在使用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。
答案 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。