c++编写web服务

您可能知道,我们可以使用四种主要的Web服务样式。 它们如下:

  • 文件/文学
  • 包装的文件/文学
  • RPC /编码
  • RPC /文字

当然,现在不建议使用RPC /编码样式。 如果您有兴趣,可以在此处找到这篇非常全面的文章,以了解不同的Web服务样式及其优点。

今天,我们将看到如何编写一种Web服务的Document / Literal包装器。 该职位的议程如下:

  • 根据包装的文档/文字编写一个简单的Web服务
  • 如何在tomcat Web容器上托管简单的Web服务
  • 一个简单的测试客户即可测试我们的服务

因此,让我们开始旅程:

  • 根据包装的文档/文字编写一个简单的Web服务
package com.wsbindings;import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.ParameterStyle;
import javax.jws.soap.SOAPBinding.Style;
import javax.jws.soap.SOAPBinding.Use;@WebService
@SOAPBinding(style = Style.DOCUMENT, use = Use.LITERAL, parameterStyle = ParameterStyle.WRAPPED)
public interface AddService {@WebMethodpublic int addIntegers(@WebParam(name = "intOne") int paramOne,@WebParam(name = "intTwo") int paramTwo);
}

这是我们的基本Web服务。 这是我们服务的基本接口。 如您所见,我们首先使用@ javax.jws.WebService对其进行注释,以指示其将要编写的Web服务。 接下来是我们定义SOAPBinding的有趣部分。 在这里,我们声明我们要编写一个DOCUMENT风格的Web服务,该服务是LITERAL风格,并且是WRAPPED风格。 这里要注意的一件事是,Soap Binding批注中指定的所有三个属性值都是默认值,因此您可以不必在此处明确声明而无需使用它们。 我这样做是为了使本文清晰。

继续,让我们看看该特定接口的实现如何:

package com.wsbindings;import javax.jws.WebService;@WebService(endpointInterface="com.wsbindings.AddService")
public class AddServiceImpl implements AddService{public int addIntegers(int paramOne, int paramTwo) {return paramOne+paramTwo;}}

同样,此服务的功能也没有什么特别之处。 只需将传入的两个数字相加,然后发回相加结果。 请注意,在这里我们再次必须使用@WebService批注对实现类进行批注。 现在,我们已经完成了编写Web服务合同和实现的初始部分,让我们看看如何将其托管在tomcat Web容器上。

  • 如何在tomcat Web容器上托管简单的Web服务

如您所知,默认情况下,tomcat不带有JAX-WS实现,这与典型的应用程序服务器(例如JBoss,Glassfish)不同。 因此,要使其正常工作,您需要获得JAX-WS规范的实现。 在这种情况下,我们将使用Metro 。 您可以将jar文件从下载文件复制到WEB-INF / lib目录,也可以使用Maven为您完成,这就是我将在本文中做的。 因此,为了获得与Metro实施相关的require jar文件,我将以下依赖项添加到pom中:

<dependency><groupId>com.sun.xml.ws</groupId><artifactId>jaxws-rt</artifactId><version>2.1.3</version><exclusions><exclusion><groupId>com.sun.xml.stream</groupId><artifactId>sjsxp</artifactId></exclusion></exclusions></dependency>

请注意,我在这里为sjsxp工件添加了一个排除项,因为我需要的是比从传递依赖中绘制的版本更高的版本。 否则,您将获得以下异常。

无法初始化类javax.xml.stream.XMLStreamException:编码UTF-8的底层流和writeStartDocument()方法utf-8的输入参数不匹配。

为了解决此问题,我需要向pom添加以下依赖项:

<dependency><groupId>com.sun.xml.stream</groupId><artifactId>sjsxp</artifactId><version>1.0.1</version></dependency>

多亏了该线程,我才能够找到此解决方案。

继续,我们需要定义一个特定的xml文件,该文件应位于名为sun-jaxws.xml的WEB-INF目录 。 该XML指定我们如何访问我们的Web服务以及在何处找到实现类。 让我们看一下该文件的内容:

<?xml version="1.0" encoding="UTF-8"?>
<endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime" version="2.0"><endpointname="AddWS"implementation="com.wsbindings.AddServiceImpl"url-pattern="/addws"/>
</endpoints>

在这里,我们提供了Web服务实现类所驻留的包以及有关如何访问特定Web服务的URL模式。 我们要做的最后一件事是将以下内容添加到web.xml中,以便成功托管我们的Web服务:

<listener><listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class></listener><servlet><servlet-name>AddWS</servlet-name><servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class></servlet><servlet-mapping><servlet-name>AddWS</servlet-name><url-pattern>/addws</url-pattern></servlet-mapping>

注意,我们必须定义一个上下文侦听器和一个Servlet类,它们将处理我们的Web服务调用。 如果查看WSServletContextListner的源代码,则会看到它从WEB-INF目录读取sun-jaxws.xml文件,并相应地为Web服务上下文创建类加载器。 关于文档样式Web服务的一件事是,您需要为请求和响应生成一些代码。 如果不这样做,则会出现以下错误并显示以下消息:

您是否运行过APT来生成它们?

您可以使用JDK安装随附的wsgen工具生成所需的类。 您还可以使用Apache-CXF为您生成这些类。 我们将通过提供给我们的apache-cxf maven插件来使用后一种方法。 将以下内容添加到您的pom和您的物品中;

<plugin><groupId>org.apache.cxf</groupId><artifactId>cxf-codegen-plugin</artifactId><version>2.0.9</version><dependencies><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-frontend-jaxws</artifactId><version>2.0.9</version></dependency></dependencies><executions><execution><id>generate-wsdl</id><phase>process-classes</phase><configuration><className>com.wsbindings.AddServiceImpl</className><argline>-classdir ${project.build.directory}/classes</argline></configuration><goals><goal>java2wsdl</goal></goals></execution></executions></plugin>

在这里,我们使用java2wsdl命令为我们的Web服务生成所需的请求和响应对象。 如您所见,我已经使用<argline>属性指定我希望生成的类进入的位置。 由于在构建war文件时运行的常规maven编译任务将在classes目录中查找,因此我也将我们的类指定为包含在同一路径中,以便在war时将它们与我们的Web服务类捆绑在一起被建造。 通过浏览此处指定的参数,您可以看到所有可能发出的命令。

当我包含我的apache-cxf maven插件时,我的pom指示错误:
生命周期配置未涵盖插件执行
经过对该问题的研究后,我偶然发现了此处所述的解决方案。因此,要克服此问题,您必须在pom的<build>标记下包含以下代码段:

<pluginManagement><plugins><!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself. --><plugin><groupId>org.eclipse.m2e</groupId><artifactId>lifecycle-mapping</artifactId><version>1.0.0</version><configuration><lifecycleMappingMetadata><pluginExecutions><pluginExecution><pluginExecutionFilter><groupId>org.apache.cxf</groupId><artifactId>cxf-codegen-plugin</artifactId><version>2.0.9</version><goals><goal>test-compile</goal><goal>compile</goal></goals></pluginExecutionFilter><action><execute /></action></pluginExecution></pluginExecutions></lifecycleMappingMetadata></configuration></plugin></plugins></pluginManagement>

尽管我不能给您确切的原因来说明为什么出现该警告,但是应该为您消除该错误。 如果您知道确切的原因,请您为我们所有人的利益发表评论。 之后,您只需生成war文件并将其复制到tomcat的webapps目录即可。 然后,您将可以通过以下路径访问Web服务:
http:// localhost:8080 / ws-bindings / addws
我将tomcat托管在其上的端口是8080,而ws-bindings是我的war文件的名称。

最后,让我们看看如何生成服务所需的客户端存根,然后编写一个小型客户端来测试我们的Web服务。

  • 一个简单的测试客户即可测试我们的服务

我们将再次使用apache-cxf maven插件通过wsdl2java命令生成客户端存根。 请注意,首先我们需要从托管我们的Web服务的路径获取wsdl。 它将位于;

http://localhost:8080/ws-bindings/addws?wsdl

然后,我将内容复制到单独的xml文件中,并将其保存在我创建的用于生成客户端存根的单独的maven项目的资源目录下。 然后,您所需要做的就是添加生成pom中的存根所需的配置,如下所示;

<plugin><groupId>org.apache.cxf</groupId><artifactId>cxf-codegen-plugin</artifactId><version>2.0.9</version><executions><execution><id>generate-sources</id><phase>generate-sources</phase><configuration><wsdlOptions><wsdlOption><wsdl>${project.basedir}/src/main/resources/AddService.wsdl</wsdl></wsdlOption></wsdlOptions></configuration><goals><goal>wsdl2java</goal></goals></execution></executions></plugin>

这将为您生成测试Web服务所需的存根。 最后,让我们编写一个客户端以使用生成的存根访问我们的Web服务。

import java.net.MalformedURLException;
import java.net.URL;import javax.xml.namespace.QName;
import javax.xml.ws.Service;import com.wsbindings.AddService;public class DocWrapperClient {public static void main(String[] args) throws MalformedURLException {URL wsdlLocation = new URL("http://localhost:8080/ws-bindings/addws?wsdl");  QName qName = new QName("http://wsbindings.com/", "AddServiceImplService");  Service service = null;  service = Service.create(wsdlLocation, qName);  AddService ser = service.getPort(AddService.class);System.out.println(ser.addIntegers(1, 1));}
}

就是这样,我希望您觉得内容有用。 您可以通过从此处下载与服务器相关的maven项目和从此处下载客户端存根生成maven项目来查看示例。

参考: 让我们从JCG合作伙伴 Dinuka Arseculeratne的My Journey Through IT博客上编写文档样式的Web服务 。

翻译自: https://www.javacodegeeks.com/2013/04/let-us-write-a-document-style-web-service.html

c++编写web服务

c++编写web服务_让我们编写一个文档样式的Web服务相关推荐

  1. 让我们编写一个文档样式的Web服务

    您可能知道,我们可以使用四种主要的Web服务样式. 它们如下: 文件/文学 包装的文件/文学 RPC /编码 RPC /文字 当然,现在不建议使用RPC /编码样式. 如果您有兴趣,可以在此处找到这篇 ...

  2. 批量调取接口_批量请求接口-API文档-开发指南-Web服务 API | 高德地图API

    产品介绍 特别说明:受产品策略调整影响,自2020年11月起,建议您不再使用此批量接口.后续平台会逐步废弃并下线此服务. 批量接口通过用户传入合并后的请求,同时返回多个请求的顺序集合,目前最多支持20 ...

  3. 编辑器未包含main类型_利用 ONLYOFFICE 将在线文档编辑器集成到 Python Web 应用程序中...

    通过 API,开发人员可以将 ONLYOFFICE 编辑器集成到网站和利用程序设计语言编写的应用程序中,并能配置和管理编辑器. 来源:https://linux.cn/article-13037-1. ...

  4. TML 文档不包含 Web 服务发现信息。

    TML 文档不包含 Web 服务发现信息. 元数据包含无法解析的引用:"http://localhost:6158/WCF-Service/Service.svc". 服务 htt ...

  5. 十三种技术文档模板_帮助企业制作帮助文档的6大“黑科技”工具!

    在日常产品使用的过程中,经常会遇到一些操作上的问题而这时我们通常会翻阅产品的使用说明书,而对于线上的产品来说通常都会有帮助文档,帮助文档的作用就是对用户操作过程中遇到的种种问题做详细的解答,同时也是对 ...

  6. java计算机毕业设计web家庭财务管理系统MyBatis+系统+LW文档+源码+调试部署

    java计算机毕业设计web家庭财务管理系统MyBatis+系统+LW文档+源码+调试部署 java计算机毕业设计web家庭财务管理系统MyBatis+系统+LW文档+源码+调试部署 本源码技术栈: ...

  7. 基于Java毕业设计校园外卖系统Web端源码+系统+mysql+lw文档+部署软件

    基于Java毕业设计校园外卖系统Web端源码+系统+mysql+lw文档+部署软件 基于Java毕业设计校园外卖系统Web端源码+系统+mysql+lw文档+部署软件 本源码技术栈: 项目架构:B/S ...

  8. java计算机毕业设计旅游服务平台源代码+数据库+系统+lw文档

    java计算机毕业设计旅游服务平台源代码+数据库+系统+lw文档 java计算机毕业设计旅游服务平台源代码+数据库+系统+lw文档 本源码技术栈: 项目架构:B/S架构 开发语言:Java语言 开发软 ...

  9. 微服务11_ES:DSL/RestClient查询文档

    微服务11_ES:DSL/RestClient查询文档 一.DSL查询文档 1.DSL Query的分类 1.全文检索查询 match查询示例: multi_match查询示例: 2.精准查询 ter ...

最新文章

  1. js委托事件-addEventListeners(冒泡方向)
  2. 谷歌Gboard输入法新增“无痕模式”:仅在Chrome隐身窗口中适用
  3. 弹性法计算方法的mck法_粘弹性自由阻尼加筋板的随机响应分析和试验研究
  4. jQuery的实现原理
  5. 一、Linear Regression
  6. 5个提高效率的编程工作环境
  7. PKM2 - PKManager 基于内容的个人知识管理工具 5M 绿色免费
  8. 如何选择频谱监测的天线?
  9. somachine3.1安装包和安装方法
  10. 2012-2013QS计算机专业世界大学排名
  11. 2019年房价调整是大概率事件,如果房价下跌,会出现什么问题?
  12. grpc-go源码剖析二十之grpc客户端帧接收器是如何处理不同的帧的?
  13. android版本8.1.0和9的区别,安卓8.1和9.0的区别是什么
  14. mysql字段的区分度_详解MySQL索引长度和区分度之间的平衡,值得收藏
  15. Qt(C++)入门学习
  16. 什么错误是计算机检查不出来的,电脑开机检测不到硬盘,提示3F0,求助大神如何检测硬盘的问题. 求大佬指点...
  17. Error creating bean with name ‘sqlSessionFactory‘ defined in class path reso
  18. 大数据Impala系列之初识Impala
  19. wiki php markdown,一款支持Markdown语法的Wiki知识管理系统:Wikitten搭建教程
  20. EEG巨型分析I:跨研究的频谱和振幅特征

热门文章

  1. mybatis更新Blob类型字段要用updateByPrimaryKeyWithBLOBs
  2. MySQL sysdate()函数
  3. 关联分析:FP-Growth算法
  4. Oracle入门(十四.9)之迭代控制:WHILE和FOR循环
  5. 【Android布局】控件布置
  6. idea中pom.xml文件横线解决办法
  7. 2020蓝桥杯省赛---java---C---1(约数个数)
  8. SpringBoot+MyBatis搭建迷你小程序
  9. ubuntu 13.04 mysql_Ubuntu13.04 下MySQL5.6安装过程
  10. hbase 单机连接hadoop_Hadoop、Hbase单机环境安装