java - 访问网络服务

标签 java web-services

我已经创建并注册了一个网络服务。现在我希望制作一个简单的网络应用程序来访问网络服务。我使用 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,然后 PC2 中的 jsp 将调用 PC1 中的 Web 服务。

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

最佳答案

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

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

关于如何使用代理...

恕我直言,从 jsp 直接调用是不行的。最好让 JSP 收集数据并将其 POST 到 servlet,然后在 servlet 内执行 WebService 调用、管理响应(如果使用 Axis2 框架,这将是一个纯 java 对象)、处理错误,然后转发到另一个 JSP 给出结果。

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

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

<!-- 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);

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

关于java - 访问网络服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11221301/

相关文章:

javascript - 在 ASP.NET : Is there a security issue with my implementation? 中用 JavaScript 调用 Web 服务 有没有更好的方法?

php - 如何使用 AES 128 保护 HLS 视频

java - 如何使用 java 将语言设置为 PhantomJs Ghostdriver?

java - Android:如何使用 KSOAP2 从 header 和正文获取数据

java - org.springframework.web.client.HttpClientErrorException 400 RestTemplate.postForEntity

java - 我能不能把 'bounce'一个文件上传到一台服务器直接发到另一台服务器?

java - Jersey REST 客户端 : How to add XML file to the body of POST request?

java - 在基于 Java 的 Web 服务中使用代理获取网页

java - Spring Webflow - 决策状态与 Action 状态

java - JHipster 后端 - 社交登录