如何用Java发送原始SOAP请求?

我需要向服务器发送原始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)          ?         ?                  ?                    ?                        ?                  ?                       e  gero      

它是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(); 

我得到HTTP状态500和SOAP消息,处理时出现Fault。 谢谢。

我找到了答案。 这段代码对我有用

  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("1.9f910338bf0cac0e783bfdec7e53be9237684caa8f8f4e6d@apache.org"); message.addAttachmentPart(attachment); SOAPMessage response = connection.call(message, endpoint); ByteArrayOutputStream out = new ByteArrayOutputStream(); response.writeTo(out); String strMsg = new String(out.toByteArray()); return strMsg; 

你能尝试这样:你需要用你的xmldata替换:

  try { String xmldata = " your reuest"; 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(); } 

您可以使用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();