文章目录
Web Service-基本构建以及Axis利用wsdd部署
1.什么是Web Service
Webservice是一种远程调用技术,也叫XML Web Service,是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,较轻量级的独立通讯技术。通过SOAP协议在Web上提供的软件服务,使用WSDL文件进行说明,并通过UDDI进行注册。
Web Service(WEB服务)能够快捷和方便地综合结合各种系统、商务和任何应用平台。利用最新的Web Service 标准能够使任何软件系统和系统之间的应用互通互联,方便,而且更加廉价。
在使用Web Service之前我们首先需要了解几个概念
- XML:(Extensible Markup Language)扩展型可标记语言
面向短期的临时数据处理、面向万维网络,是Soap的基础。- SOAP:(Simple ObjectAccess Protocol)简单对象存取协议
是XML Web Service的通信协议。当用户通过UDDI找到你的WSDL描述文档后,他通过可以SOAP调用你建立的Web服务中的一个或多个操作。SOAP是XML文档形式的调用方法的规范,它可以支持不同的底层接口,像HTTP(S)或者SMTP。- WSDL:(Web Services Description Language) 网络服务描述语言
是一门基于 XML 的语言,用于描述 Web Services 以及如何对它们进行访问。WSDL 文件是一个 XML 文档,用于说明一组SOAP 消息以及如何交换这些消息。大多数情况下由软件自动生成和使用。
2.Web Service基本使用
首先构建一个简单的java项目即可,编写服务接口类和服务接口实现类Web Service中成为SEI(WebService EndPoint Interface)即web service的终端接口。
WeatherService.java
package com.ithzk.service;
/** * 天气服务接口 * @author hzk * @date 2018/7/18 */
public interface WeatherService {
public String getWeather(String city);
}
WeatherServiceImple.java
package com.ithzk.service.impl;
import com.ithzk.service.WeatherService;
import javax.jws.WebService;
/** * @author hzk * @date 2018/7/18 */
@WebService
public class WeatherServiceImple implements WeatherService{
@Override
public String getWeather(String city) {
System.out.println("Request City:"+city);
String response = "Weather:"+Math.random()*3;
return response;
}
}
这里由于是WebService服务,服务提供端口上需要加上@WebService注解标明为Web Service服务,接下来只需要一个服务发布即可。
WeatherServer.java
package com.ithzk;
import com.ithzk.service.impl.WeatherServiceImple;
import javax.xml.ws.Endpoint;
/** * 服务发布 * @author hzk */
public class WeatherServer
{
public static void main( String[] args ){
//服务发布地址
String address = "http://127.0.0.1:12345/weather";
//服务提供实现
WeatherServiceImple weatherServiceImple = new WeatherServiceImple();
Endpoint.publish(address,weatherServiceImple);
System.out.println("Weather Service publish success!");
}
}
启动该发布程序即可将我们需要提供的服务以Web Service方式发布出去,此时我们可以通过WSDL查看我们提供的服务的一些相关信息
127.0.0.1:12345/weather?wsdl
。
到这里的话我们一个简单的Web Service就发布成功了,那么我们如何去调用?首先我们需要利用wsimport通过Web Service生成的wsdl去生成客户端调用的一些工具代码,通过CMD命令行(Win+R)跳转至项目目录,执行wsimport -s . http://127.0.0.1:12345/weather?wsdl
,或者将.改为项目目录是一样的效果。
当这里执行成功之后,我们更新我们的项目目录发现多了一些wsimport生成的代码。
我们再快速构建一个项目,用来作为Web Service的客户端,然后将这些生成的代码放至其目录下,构建一个客户端调用类。
WeatherClient.java
package com.ithzk;
import com.ithzk.service.impl.WeatherServiceImple;
import com.ithzk.service.impl.WeatherServiceImpleService;
/** * 天气服务客户端 * @author hzk */
public class WeatherClient
{
public static void main( String[] args )
{
//构建服务视图
WeatherServiceImpleService weatherServiceImpleService = new WeatherServiceImpleService();
//获取portType对象
WeatherServiceImple weatherServiceImplePort = weatherServiceImpleService.getWeatherServiceImplePort();
//调用服务端
String response = weatherServiceImplePort.getWeather("BeiJing");
System.out.println("Client To Server Response:"+response);
}
}
服务端控制台和客户端控制台都如期打印出了我们想要的结果,整个流程下来就完成了简单的Web Service的发布和调用
这里推荐几篇比较详细个人觉得写的比较好的博客分享给大家参考
WebService(2)—WebService的相关概念(WSDL、SOAP、SEI、CXF)
http webservice socket的区别
3.Axis部署Web Service
通过Apache下的Axis也可以实现Web Service服务发布,这里先介绍Axis1不是Axis2,有机会后面补充,首先我构建了一个Maven web项目,添加我们Axis所需要用到的依赖。
pom.xml
<dependency>
<groupId>axis</groupId>
<artifactId>axis</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>axis</groupId>
<artifactId>axis-wsdl4j</artifactId>
<version>1.5.1</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
然后在web.xml中配置Axis发布Web Service的配置
web.xml
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>AdminServlet</servlet-name>
<display-name>Axis Admin Servlet</display-name>
<servlet-class>org.apache.axis.transport.http.AdminServlet</servlet-class>
<load-on-startup>100</load-on-startup>
</servlet>
<servlet>
<servlet-name>AxisServlet</servlet-name>
<display-name>Apache-Axis Servlet</display-name>
<servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/servlet/AxisServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>*.jws</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AdminServlet</servlet-name>
<url-pattern>/servlet/AdminServlet</url-pattern>
</servlet-mapping>
</web-app>
然后我们去编写一个服务类
CityService.java
package com.ithzk;
/** * @author hzk * @date 2018/7/18 */
public class CityService {
public String getCity(String msg){
System.out.println("Request :" + msg);
return msg+Math.random()*3;
}
}
接下来是关键一步,我们需要建一个server-config.wsdd文件,这个文件可以通过某些方式自动生成,后面介绍,这里我们先简单配置一下,大家也可以去了解一下属性含义和文件结构自己配置,待会贴两篇博友的文章。
server-config.wsdd
<deployment name="defaultClientConfig"
xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"
>
<globalConfiguration>
<parameter name="disablePrettyXML" value="true"/>
<parameter name="dotNetSoapEncFix" value="true"/>
<parameter name="enableNamespacePrefixOptimization" value="false"/>
<requestFlow>
<handler type="java:org.apache.axis.handlers.JWSHandler">
<parameter name="scope" value="session"/>
</handler>
<handler type="java:org.apache.axis.handlers.JWSHandler">
<parameter name="scope" value="request"/>
<parameter name="extension" value=".jwr"/>
</handler>
<!-- uncomment this if you want the SOAP monitor -->
<!--
<handler type="java:org.apache.axis.handlers.SOAPMonitorHandler"/>
-->
</requestFlow>
<!-- uncomment this if you want the SOAP monitor -->
<!--
<responseFlow>
<handler type="java:org.apache.axis.handlers.SOAPMonitorHandler"/>
</responseFlow>
-->
</globalConfiguration>
<handler type="java:org.apache.axis.handlers.http.URLMapper" name="URLMapper"/>
<handler type="java:org.apache.axis.transport.local.LocalResponder" name="LocalResponder"/>
<handler type="java:org.apache.axis.handlers.SimpleAuthenticationHandler" name="Authenticate"/>
<service name="AdminService" provider="java:MSG">
<namespace>http://xml.apache.org/axis/wsdd/</namespace>
<parameter name="allowedMethods" value="AdminService"/>
<parameter name="enableRemoteAdmin" value="false"/>
<parameter name="className" value="org.apache.axis.utils.Admin"/>
</service>
<service name="Version" provider="java:RPC">
<parameter name="allowedMethods" value="getVersion"/>
<parameter name="className" value="org.apache.axis.Version"/>
</service>
<!-- ======================以上内容一般不需要修改===========================-->
<!-- ======================================================================
Services:Demo,此段包含Sevice配置实例
=======================-->
<!--
示例1: 简单 Service
情境: 包含下例代码中基本属性.所有参数传递均为元数据,即int、float、double、String、boolean等非对象数据;
可以访问此Service中所有的方法
引用: 在C#中借助于IDE引用。
-->
<service name="cityService" provider="java:RPC"> <!-- name: 此WebService的名称;provider:工作模式 -->>
<parameter name="className" value="com.ithzk.CityService"/><!-- 此Service对应的实现类 -->
<parameter name="allowedMethods" value="*"/><!-- 可以访问这个Service中所有的方法 -->
</service>
<!-- ======================以下内容一般不需要修改===========================-->
<transport name="http">
<parameter name="qs:list"
value="org.apache.axis.transport.http.QSListHandler"/>
<parameter name="qs:method"
value="org.apache.axis.transport.http.QSMethodHandler"/>
<parameter name="qs:wsdl"
value="org.apache.axis.transport.http.QSWSDLHandler"/>
<requestFlow>
<handler type="URLMapper"/>
<handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler">
</handler>
</requestFlow>
</transport>
<transport name="local">
<responseFlow>
<handler type="LocalResponder"/>
</responseFlow>
</transport>
</deployment>
这个时候我们将该项目利用tomcat启动,访问
http://localhost:port/webservice_axis/services
。
可以发现我们的Web Service已经发布成功了,这里可以先通过浏览器调用看下效果http://localhost:port/webservice_axis/services/cityService?method=getCity&args=ws
,第一个参数是需要调用的接口方法,第二个是传递的参数。
可以看到我们浏览器和服务端后台都给我们返回了我们想要的结果,接下来看一下如何去通过代码调用,首先导入相关依赖包。
pom.xml
<dependency>
<groupId>axis</groupId>
<artifactId>axis</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>axis</groupId>
<artifactId>axis-wsdl4j</artifactId>
<version>1.5.1</version>
</dependency>
CityClient.java
package com.ithzk;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import javax.xml.namespace.QName;
import java.net.URL;
/** * Axis客户端 * @author hzk * @date 2018/7/18 */
public class CityClient {
public static void main(String[] args){
Service service = new Service();
try {
Call call = (Call) service.createCall();
//设置wsdl地址
call.setTargetEndpointAddress(new URL("http://localhost:8088/webservice_axis/services/cityService?wsdl"));
//设置要执行的方法
call.setOperationName(new QName("http://com","getCity"));
//设置要传入参数,如果没有要传入的参数,则不要写这个
call.addParameter("msg", org.apache.axis.Constants.XSD_STRING,javax.xml.rpc.ParameterMode.IN);
//设置返回的类型
call.setReturnType(org.apache.axis.Constants.XSD_STRING);
String name = "从此过客";
//调用webservice
String result = (String) call.invoke(new Object[]{name});
System.out.println("Response:"+result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
可以看到通过Axis包提供的几个类和方法就能完成服务的调用,这里给大家介绍几篇博客,个人感觉写的还不错
利用Apache AXIS 1 发布WebService
最详细的WSDD配置文件注释
Apache Axis配置文件WSDD详解
4.WSDL使用实体类生成
我们发布了服务之后,通过webservice提供的wsdl文件利用wsimport生成客户端调用需要的实体类,但是有些编码格式wsimport方式是不支持编译的,对wsdl了解的同学可以自己根据wsdl手动编写使用类,当然也可以通过IDE工具辅助生成。
这里是一份自己写的服务提供出来的wsdl,下面通过工具生成出对应所需代码。
4.1 Eclipse
新建一个wsdl文件,然后将远程的copy到本地。
右键点击wsdl文件->Web Service->Generate Java Bean Skeleton。
接着就能发现我们已经拿到了需要使用的Java Bean了,然后倒入响应的包就可以使用了
4.2 Idea
通过这样几步也可以快速生成出对应的Java Bean代码
4.3 SOAP-UI
这里接触过这款软件的同学应该知道除了带有各种强大的模拟请求功能也带有生成Java Bean的功能,而且同样支持各种方式例:Axis1,Axis2,CXF…,具体方式看下面这篇博客,对SOAP-UI也作有简单的介绍SoapUI-一款强大的Rest和Soap测试工具