【问题标题】:Beginner: Soap Request Response call from java初学者:来自 java 的 Soap 请求响应调用
【发布时间】:2012-07-26 18:27:29
【问题描述】:

我尝试做一个 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 Service 的内容,我是否必须让一些 Web Service 工作才能使其工作?

我用一些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>

【问题讨论】:

  • 您是否尝试过使用一些对您有用的库?至少你可以使用一些http库向服务器发送请求,因为soap请求是一个简单的http请求,根据soap协议,'body'包含xml
  • 我更新了我需要提出的实际肥皂请求。我以前从未做过肥皂请求,所以我尝试研究并找到可行的方法。我尝试 SOAPFactory soapFactory = SOAPFactory.newInstance();也,但对我不起作用。我知道有些事情我做的不对,但我不知道怎么做。谢谢
  • 你也可以使用SOAPui程序来测试你的WS(对开发非常有用)

标签: java web-services soap wsdl


【解决方案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 教程。

【讨论】:

【解决方案2】:

我知道这有点晚了,但我还是会在那里回答。

您要做的是为此 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>

【讨论】:

    【解决方案3】:

    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();
    }
    

    在axis网站上有很多文档:

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

    问候,

    【讨论】:

    • 我建议不要使用 AXIS 1,因为他们已经六年多没有发布了。它仍然有效,但有更新且更易于使用的库。
    • 好吧,axis1 对我们来说工作得很好,soap 协议自 10 年前以来没有任何更新。如果您可以选择其他协议,我说 REST 是最好的,因为 SOAP axis1 或 axis2 可以正常工作(但我不知道如何使用 AXIS2):)
    猜你喜欢
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    相关资源
    最近更新 更多