有没有办法通过使用 java 来使用 SOAP Web 服务:
- 所需的 SOAPaction(例如名为“find”的方法名)
- Web 服务的 URL
- 标头身份验证(用户名和密码)
- 最后输出结果
我通过 php 成功使用了一个示例请求 xml 文件,但我找不到在 java 上执行此操作的正确方法。
[更新:Web 服务的 WSDL 样式是 RPC/编码的]
[更新 #2:您可以在下面找到我是如何解决问题的(通过使用 IDE 生成的 java 存根)]
有没有办法通过使用 java 来使用 SOAP Web 服务:
我通过 php 成功使用了一个示例请求 xml 文件,但我找不到在 java 上执行此操作的正确方法。
[更新:Web 服务的 WSDL 样式是 RPC/编码的]
[更新 #2:您可以在下面找到我是如何解决问题的(通过使用 IDE 生成的 java 存根)]
您可以使用java.net.HttpURLConnection
SOAP 消息来发送。例如:
public static void main(String[] args) throws Exception {
String xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n" +
"<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\r\n" +
" <soap:Body>\r\n" +
" <ConversionRate xmlns=\"http://www.webserviceX.NET/\">\r\n" +
" <FromCurrency>USD</FromCurrency>\r\n" +
" <ToCurrency>CNY</ToCurrency>\r\n" +
" </ConversionRate>\r\n" +
" </soap:Body>\r\n" +
"</soap:Envelope>";
Authenticator.setDefault(new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("username", "password".toCharArray());
}
});
URL url = new URL("http://www.webservicex.net/CurrencyConvertor.asmx");
URLConnection conn = url.openConnection();
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
conn.setRequestProperty("SOAPAction", "http://www.webserviceX.NET/ConversionRate");
// Send the request XML
OutputStream outputStream = conn.getOutputStream();
outputStream.write(xml.getBytes());
outputStream.close();
// Read the response XML
InputStream inputStream = conn.getInputStream();
Scanner sc = new Scanner(inputStream, "UTF-8");
sc.useDelimiter("\\A");
if (sc.hasNext()) {
System.out.print(sc.next());
}
sc.close();
inputStream.close();
}
经过长时间的搜索,我终于找到了一种使用 rpc/encoded SOAP
web 服务的方法。我决定从 wsdl url 生成客户端存根。
一个成功的方法是通过这个链接(来源:从 RPC 编码的 WSDL 生成 Java 客户端的最简单方法是什么)
在通过 eclipse/netbeans 调整生成的代码(java 存根)之后,您可以简单地构建您的客户端。通过使用您生成的类,您可以使用您喜欢的soap api。
例如
Auth auth = new Auth("username", "password");
SearchQuery fsq = new SearchQuery ("param1","param2","param3");
Model_SearchService service = new Model_SearchServiceLoc();
SearchRequest freq = new SearchRequest(auth, fsq);
Result r[] = service.getSearchPort().method(freq);
for(int i=0; i<r.length; i++){
System.out.println(i+" "+r[i].getInfo()[0].toString());
}