【问题标题】:accessing web service访问网络服务
【发布时间】:2012-06-28 14:17:23
【问题描述】:

我已经创建并注册了一个网络服务。现在我想制作一个简单的网络应用程序来访问网络服务。我使用axis2作为Web服务服务器。客户端以xml格式文件(data.xml)的形式提供要由Web服务处理的数据。我的 jsp 表单有一个文本框(用于提供 data.xml 的位置)和一个“调用”按钮,可以访问调用 Web 服务。我假设 jsp 将首先将请求发送到 servlet,然后 servlet 将负责调用 Web 服务。 Web 服务托管在 PC1 中,包含访问 Web 服务的 JSP 的 Web 应用程序位于 PC2 中,data.xml 位于 PC3 中。因此用户将在 PC3 上工作,在 PC3 中打开 Web 浏览器以访问 PC2 中的 jsp,然后调用 PC1 中的 Web 服务。

  1. 从 servlet 调用 Web 服务的语法是什么?我想知道axis2在客户端是否可用。
  2. 如何构造 SOAP 请求(我假设 SOAP 请求是在 servlet 中构造的)?希望我不需要逐个字符串构造 SOAP 请求字符串。
  3. 关于data.xml,我假设jsp会将文件上传到servlet,所以servlet会接收一个文件作为参数。这是正确的方法吗? 谢谢

【问题讨论】:

    标签: java web-services


    【解决方案1】:

    由于您使用的是 Axis2,因此使用它生成客户端代理(wsdl2java 是您最好的朋友),并将为您的 Web 服务创建一个标准的 java 代理。无需手动创建 SOAP 信封……(至少在 99% 的情况下)。

    只需生成一个 WSDL(编写它或使用 java2wsdl 生成它),然后使用它来生成一个 java 代理来调用您的 Web 服务。

    关于如何使用代理...

    恕我直言,来自 jsp 的直接调用是禁止的。最好让 JSP 收集数据并将它们发布到 servlet,然后在 servlet 中执行 WebService 调用,管理响应(如果使用 Axis2 框架,这将是一个纯 java 对象),处理错误,然后转发给另一个 JSP 给出结果.

    JSP 有点容易编写,但从长远来看,最好将它们用于计划中的内容并将业务逻辑保留在 servlet 中

    这里有两个用于执行 WSDL 和客户端生成的 ant 任务。

    <!-- create the wsdl file -->
    <target name="genwsdl">
        <echo message="Generate the WSDL file"/>
        <taskdef name="java2wsdl" classname="org.apache.ws.java2wsdl.Java2WSDLTask" classpathref="axis2.classpath"/>
        <java2wsdl className="org.stackoverflow.YourWebServiceClassName"
                   servicename="YourServiceName"
                   description="Whatever..."
                   outputLocation="./wsdl"
                   locationuri="http://localhost:8081/NameMe/CoolService">
                <classpath>
                    <pathelement path="${axis2.classpath}"/>
                    <pathelement location="./build/classes"/>
                </classpath>
        </java2wsdl>
        <echo message="Generation of the WSDL file complete"/>
    </target>
    
    
    <target name="genclient" depends="genwsdl">
        <taskdef name="axis2-wsdl2java" classname="org.apache.axis2.tool.ant.AntCodegenTask" classpathref="axis2.classpath"/>
        <axis2-wsdl2java wsdlfilename="./wsdl/YourWsdl.wsdl" output="./client overwrite="true"/>
    </target>
    

    生成客户端类(代理)后,您可以使用它们来调用 Web 服务。

    会是这样的:

    YourServiceStub stub = new YourServiceStub(wsEndPointUrl);
    

    然后在存根中,您将拥有每个远程发布方法的方法和包装请求/响应对象的静态类。但此时必须阅读 Axis2 客户端文档。

    【讨论】:

    • 是的,所以基本上jsp会将文件上传到位于PC2中的servlet。你能给我从 servlet 构造 SOAP 消息并在 te servlet 中调用 Web 服务的语法吗?谢谢
    • 有点难,我可以加个蚂蚁任务做的例子。
    【解决方案2】:

    除非您想手动完成,否则您应该使用 Web 服务堆栈。 Apache CXF 和 Metro 是不错的选择。

    也就是说,我不知道你想用你的那个 data.xml 做什么。

    1. 取决于框架
    2. 你没有。这就是框架的用途。
    3. 如果您需要多部分支持,您应该四处寻找现成的 servlet。或者更好的是,使用 Spring 框架:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-03
      • 2011-07-30
      • 2015-10-12
      相关资源
      最近更新 更多