如何在 Java 中发送原始 SOAP 请求?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/31286722/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to send raw SOAP request in Java?
提问by Bogdan Timofeev
I need to send a raw SOAP request to server. My request looks like
我需要向服务器发送原始 SOAP 请求。我的请求看起来像
POST http://10.76.243.43:8080/registry/services/xds-iti18 HTTP/1.1
Accept-Encoding: gzip,deflate
Content-Type: application/soap+xml;charset=UTF-8
Content-Length: 6383
Host: 10.76.243.43:8080
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:urn="urn:oasis:names:tc:ebxml-regrep:xsd:query:3.0" xmlns:urn1="urn:oasis:names:tc:ebxml-regrep:xsd:rs:3.0" xmlns:urn2="urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0">
<soap:Header/>
<soap:Body>
<urn:AdhocQueryRequest id="?" comment="?" federated="false" federation="?" startIndex="0" maxResults="-1">
<!--Optional:-->
<urn1:RequestSlotList>
<!--Zero or more repetitions:-->
<urn2:Slot name="?" slotType="?">
<urn2:ValueList>
<urn2:Value>?</urn2:Value>
</urn2:ValueList>
</urn2:Slot>
</urn1:RequestSlotList>
<urn:ResponseOption returnType="RegistryObject" returnComposedObjects="false"/>
<urn2:AdhocQuery id="?" home="?" lid="?" objectType="?" status="?">
<!--Zero or more repetitions:-->
<urn2:Slot name="?" slotType="?">
<urn2:ValueList>
<urn2:Value>?</urn2:Value>
</urn2:ValueList>
</urn2:Slot>
<!--Optional:-->
<urn2:Name>
<urn2:LocalizedString xml:lang="en-US" charset="UTF-8" value="?"/>
</urn2:Name>
<!--Optional:-->
<urn2:Description>
<urn2:LocalizedString xml:lang="en-US" charset="UTF-8" value="?"/>
</urn2:Description>
<!--Optional:-->
<urn2:VersionInfo versionName="1.1" comment="?"/>
<!--Zero or more repetitions:-->
<urn2:Classification id="?" home="?" lid="?" objectType="?" status="?" classificationScheme="?" classifiedObject="?" classificationNode="?" nodeRepresentation="?">
<!--Zero or more repetitions:-->
<urn2:Slot name="?" slotType="?">
<urn2:ValueList>
<urn2:Value>?</urn2:Value>
</urn2:ValueList>
</urn2:Slot>
<!--Optional:-->
<urn2:Name>
<urn2:LocalizedString xml:lang="en-US" charset="UTF-8" value="?"/>
</urn2:Name>
<!--Optional:-->
<urn2:Description>
<urn2:LocalizedString xml:lang="en-US" charset="UTF-8" value="?"/>
</urn2:Description>
<!--Optional:-->
<urn2:VersionInfo versionName="1.1" comment="?"/>
<!--Zero or more repetitions:-->
<urn2:Classification/>
<!--Zero or more repetitions:-->
<urn2:ExternalIdentifier id="?" home="?" lid="?" objectType="?" status="?" registryObject="?" identificationScheme="?" value="?">
<!--Zero or more repetitions:-->
<urn2:Slot name="?" slotType="?">
<urn2:ValueList>
<urn2:Value>?</urn2:Value>
</urn2:ValueList>
</urn2:Slot>
<!--Optional:-->
<urn2:Name>
<urn2:LocalizedString xml:lang="en-US" charset="UTF-8" value="?"/>
</urn2:Name>
<!--Optional:-->
<urn2:Description>
<urn2:LocalizedString xml:lang="en-US" charset="UTF-8" value="?"/>
</urn2:Description>
<!--Optional:-->
<urn2:VersionInfo versionName="1.1" comment="?"/>
<!--Zero or more repetitions:-->
<urn2:Classification/>
<!--Zero or more repetitions:-->
<urn2:ExternalIdentifier/>
</urn2:ExternalIdentifier>
</urn2:Classification>
<!--Zero or more repetitions:-->
<urn2:ExternalIdentifier id="?" home="?" lid="?" objectType="?" status="?" registryObject="?" identificationScheme="?" value="?">
<!--Zero or more repetitions:-->
<urn2:Slot name="?" slotType="?">
<urn2:ValueList>
<urn2:Value>?</urn2:Value>
</urn2:ValueList>
</urn2:Slot>
<!--Optional:-->
<urn2:Name>
<urn2:LocalizedString xml:lang="en-US" charset="UTF-8" value="?"/>
</urn2:Name>
<!--Optional:-->
<urn2:Description>
<urn2:LocalizedString xml:lang="en-US" charset="UTF-8" value="?"/>
</urn2:Description>
<!--Optional:-->
<urn2:VersionInfo versionName="1.1" comment="?"/>
<!--Zero or more repetitions:-->
<urn2:Classification id="?" home="?" lid="?" objectType="?" status="?" classificationScheme="?" classifiedObject="?" classificationNode="?" nodeRepresentation="?">
<!--Zero or more repetitions:-->
<urn2:Slot name="?" slotType="?">
<urn2:ValueList>
<urn2:Value>?</urn2:Value>
</urn2:ValueList>
</urn2:Slot>
<!--Optional:-->
<urn2:Name>
<urn2:LocalizedString xml:lang="en-US" charset="UTF-8" value="?"/>
</urn2:Name>
<!--Optional:-->
<urn2:Description>
<urn2:LocalizedString xml:lang="en-US" charset="UTF-8" value="?"/>
</urn2:Description>
<!--Optional:-->
<urn2:VersionInfo versionName="1.1" comment="?"/>
<!--Zero or more repetitions:-->
<urn2:Classification/>
<!--Zero or more repetitions:-->
<urn2:ExternalIdentifier/>
</urn2:Classification>
<!--Zero or more repetitions:-->
<urn2:ExternalIdentifier/>
</urn2:ExternalIdentifier>
<!--Optional:-->
<urn2:QueryExpression queryLanguage="?">
e
<!--You may enter ANY elements at this point-->
gero
</urn2:QueryExpression>
</urn2:AdhocQuery>
</urn:AdhocQueryRequest>
</soap:Body>
</soap:Envelope>
It is standard raw request generated by SOAP UI (using wsdl of web service), so if I send it there I get HTTP code 200 and some normal response. I want to send it using Java, so I do the following
它是由 SOAP UI(使用 Web 服务的 wsdl)生成的标准原始请求,所以如果我将它发送到那里,我会得到 HTTP 代码 200 和一些正常响应。我想使用 Java 发送它,所以我执行以下操作
byte[] encoded = Files.readAllBytes(Paths.get("C:\Users\timofb\Documents\testtest.txt"));//file with my raw request
String soapXml = new String(encoded, StandardCharsets.UTF_8);
Socket socket = new Socket("10.76.243.43", 8080);
BufferedWriter out = new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream(), "UTF8"));
BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
out.write(soapXml);
out.flush();
System.out.println("\n * Response");
String line;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
in.close();
I get HTTP status 500 and SOAP message that Fault occurred while processing. Thanks.
我收到 HTTP 状态 500 和处理时发生错误的 SOAP 消息。谢谢。
采纳答案by Bogdan Timofeev
I've found an answer. This code worked for me
我找到了答案。这段代码对我有用
byte[] encoded = Files.readAllBytes(Paths.get("C:\Users\timofb\Documents\test.txt"));
String soapXml = new String(encoded, StandardCharsets.UTF_8);
SOAPConnectionFactory soapConnectionFactory =
SOAPConnectionFactory.newInstance();
java.net.URL endpoint = new URL("http://" + ip + "/cs-repository/services/xds-iti41");
SOAPConnection connection = soapConnectionFactory.createConnection();
MessageFactory factory = MessageFactory.newInstance();
SOAPMessage message = factory.createMessage(new MimeHeaders(), new ByteArrayInputStream(encoded));
AttachmentPart attachment = message.createAttachmentPart();
attachment.setContent("sm_content", "text/plain");
attachment.setContentId("[email protected]");
message.addAttachmentPart(attachment);
SOAPMessage response = connection.call(message, endpoint);
ByteArrayOutputStream out = new ByteArrayOutputStream();
response.writeTo(out);
String strMsg = new String(out.toByteArray());
return strMsg;
回答by Garry
Can you try like this: you need to replace the xmldata with yours:
您可以这样尝试吗:您需要将 xmldata 替换为您的:
try {
String xmldata = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><soapenv:Envelopey> your reuest</soapenv:Envelope>";
String hostname = "10.76.243.43";
int port = 8080;
InetAddress addr = InetAddress.getByName(hostname);
Socket sock = new Socket(addr, port);
//Send header
String path = "registry/services/xds-iti18";
BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream(), "UTF-8"));
wr.write("POST "+path + " HTTP/1.1\r\n");
wr.write("Host: "+hostname+":"+port+"\r\n");
wr.write("Content-Length: "+ xmldata.length() + "\r\n");
wr.write("Content-Type: application/soap+xml; charset=\"utf-8\"\r\n");
wr.write("\r\n"); //Send data
wr.write(xmldata);
wr.flush();
// Response
BufferedReader rd = new BufferedReader(new InputStreamReader(sock.getInputStream()));
String line;
while ((line = rd.readLine()) != null) {
System.out.println("Response:"+line);
}
} catch (Exception e) {
e.printStackTrace();
}
回答by Naveen Ramawat
Instead of socket you can use java HttpURLConnection, Here you must have set SOAPAction header attribute properly in you case it is "AdhocQueryRequest" or you can cross check from your wsdl, below is tentative untested code.
您可以使用 java HttpURLConnection 代替套接字,在这里您必须正确设置 SOAPAction 标头属性,以防它是“AdhocQueryRequest”,或者您可以从您的 wsdl 进行交叉检查,以下是未经测试的暂定代码。
URL url = new URL(SOAPUrl);
URLConnection connection = url.openConnection();
HttpURLConnection httpConn = (HttpURLConnection) connection;
FileInputStream fin = new FileInputStream(xmlFile2Send);
ByteArrayOutputStream bout = new ByteArrayOutputStream();
// Copy the SOAP file to the open connection.
copy(fin,bout);
fin.close();
byte[] b = bout.toByteArray();
// Set the appropriate HTTP parameters.
httpConn.setRequestProperty( "Content-Length",
String.valueOf( b.length ) );
httpConn.setRequestProperty("Content-Type","text/xml; charset=utf-8");
httpConn.setRequestProperty("SOAPAction",SOAPAction);
httpConn.setRequestMethod( "POST" );
httpConn.setDoOutput(true);
httpConn.setDoInput(true);
// Everything's set up; send the XML that was read in to b.
OutputStream out = httpConn.getOutputStream();
out.write( b );
out.close();
// Read the response and write it to standard out.
InputStreamReader isr =
new InputStreamReader(httpConn.getInputStream());
BufferedReader in = new BufferedReader(isr);
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();