1

我尝试执行 SOAP 请求并通过 Java 获取 SOAP 响应,然后从 JSP 页面调用它。我研究了很多网站,尝试了很多方法,它似乎无法让它工作。

URL u = new URL("http://www.mysitename.com/mysoaprequest.wsdl");
URLConnection uc = u.openConnection();
HttpURLConnection connection = (HttpURLConnection) uc;

……

我可以在里面创建一个带有soap请求xml的wsdl文件吗?

我读了一些关于 Web 服务的东西,我是否必须让一些 Web 服务工作才能使它工作?

我使用一些 wsdl 来测试http://www.webservicex.net/AustralianPostCode.asmx?WSDL

我一直收到这个错误

java.io.IOException:服务器返回 HTTP 响应代码:500 用于 URL:http ://www.webservicex.net/AustralianPostCode.asmx?WSDL

如果有人能指出我正确的方向,将不胜感激。


这是我需要提出的实际肥皂请求

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://service.application.tvcc.dmv.ca.gov/">
    <soapenv:Header/>
    <soapenv:Body>
        <ser:getNewCourseCompletion>
            <arg0>
                <userDto>
                    <password>********</password>
                    <userId>anyone@somecourt.com</userId>
                </userDto>
            </arg0>
        </ser:getNewCourseCompletion>
    </soapenv:Body>
</soapenv:Envelope>
4

3 回答 3

1

我知道这有点晚了,但无论如何我都会在那里回答。

您要做的是为此 Web 服务自动生成 Java 代码。我将演示使用您引用的 WSDL:http ://www.webservicex.net/AustralianPostCode.asmx?WSDL

在 Java 中,自动生成代码的工具是wsimport. 你会想要使用这样的东西:

wsimport http://www.webservicex.net/AustralianPostCode.asmx?WSDL -p com.company.whateveruwant -d . -keep

这会将您想要的代码放入指定的包中(此处com.company.whateveruwant)。

从那里,您所要做的就是像普通的 Java 库一样调用 SOAP 方法:

package com.company.whateveruwant;

import org.junit.Test;

public class AustralianPostCodeTest {
  @Test
  public void test() {
    AustralianPostCodeSoap soap = new AustralianPostCode().getAustralianPostCodeSoap();
    String response = soap.getAustralianPostCodeByLocation("Collinswood");
    System.out.println(response);
  }
}

这打印出来:

<NewDataSet>
  <Table>
    <Location>Collinswood</Location>
    <PostCode> SA 5081</PostCode>
  </Table>
</NewDataSet>
于 2012-09-27T13:45:58.120 回答
1

WSDL 是一种菜单,它定义了它将接受什么 SOAP 请求,以及它将返回给您什么。您实际上并未将 WSDL 文档作为请求发送到该 URL。如果您想深入了解应该发送的 XML,我建议您下载soapUI:

http://sourceforge.net/projects/soapui/files/soapui/4.5.1/

创建一个新项目并添加您提供的链接:

http://www.webservicex.net/AustralianPostCode.asmx?WSDL

作为初始 WSDL(您应该在 SoapUI 中看到该框)。然后它将生成您可以发送该 Web 服务的各种请求,并让您填写空白并发送它。

如果您想从 Java 代码中执行此操作,则必须选择像 JAX-WS 这样的 Web 服务平台,并让它生成形成请求并发送请求的 Java 代码。查看一些 JAX-WS 教程。

于 2012-07-26T18:55:09.107 回答
0

SOAP 是一个非常古老且非常困难的协议(有很多博客告诉你为什么soap 一团糟),好吧,如果可以的话,试试 REST(比如 RESTeasy 框架)。但是如果你必须使用soap,你可以使用AXIS(我使用AXIS1,因为有许多使用该库的遗留应用程序),我对AXIS2没有任何经验,所以这里是制作客户端的提示:

1)您必须将轴库添加到您的类路径(在 linux 中,如下例所示):

env AXISCLASSPATH=~/axis-1_4/lib/axis.jar:~/axis-1_4/lib/commons-discovery-0.2.jar:~/axis-1_4/lib/commons-logging-1.0.4.jar:~/axis-1_4/lib/jaxrpc.jar:~/axis-1_4/lib/saaj.jar:~/axis-1_4/lib/log4j-1.2.8.jar:~/axis-1_4/lib/xml-apis.jar:~/axis-1_4/lib/xercesImpl.jar:~/wsdl4j-1_6_2/lib/wsdl4j.jar

2)然后您可以创建客户端/服务器,如:

java -classpath $AXISCLASSPATH org.apache.axis.wsdl.WSDL2Java --server-side example.wsdl

--server-side 使该轴创建用于部署和取消部署服务器层的 wsdl 文件,如果要创建客户端,请将其删除。

3) 现在您有一个文件夹,如 com/example/server/.java 4) 在 Impl 文件(如 ExampleImpl.java)中,您拥有必须实现的方法,以便对 WS 执行某些操作(在服务器端)。

5)如果你想消费 WS,你必须做一些类似的事情:

EngineConfiguration engine = EngineConfigurationFactoryFinder
.newFactory().getClientEngineConfig();
SimpleProvider provider = new SimpleProvider(engine);
provider.deployTransport("http", new CommonsHTTPSender());

ExampleLocator sendSmsLocator = new ExampleLocator(engine);
Example example = null;

try {
    example = (ExampleBindingStub) exampleLocator.getExample();
} catch (Exception e) {
    e.printStackTrace();
}

try {
    result = example.exampleMethod(params...);
} catch (Exception e) {
    e.printStackTrace();
}

那么轴站点中有很多文档:

http://axis.apache.org/axis/java/index.html

问候,

于 2012-07-26T18:44:14.517 回答