webservice服务搭建与调用

什么是Web Services:

  • Web Services 是应用程序组件
  • Web Services 使用开放协议进行通信
  • Web Services 是独立的(self-contained)并可自我描述
  • Web Services 可通过使用UDDI来发现
  • Web Services 可被其他应用程序使用
  • XML 是 Web Services 的基础

它如何工作?

基础的 Web Services 平台是 XML + HTTP。

HTTP 协议是最常用的因特网协议。

XML 提供了一种可用于不同的平台和编程语言之间的语言。

Web services 平台的元素(三要素):

  • SOAP (简易对象访问协议)
  • UDDI (通用描述、发现及整合)
  • WSDL (Web services 描述语言)

一:搭建Web Service服务

使用的技术:Springboot1.5.17.RELEASE版本,无需创建Web项目简单的java项目就行。

在确保springboot项目正常运行的情况下需要额外导入如下jar:

1
2
3
4
5
6
7
8
9


<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-spring-boot-starter-jaxws</artifactId>
<version>3.1.12</version>
</dependency>


下面正式开始WebService的流程搭建:
1.创建一个接口类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19


package com.demo.freemarker.service;

import javax.jws.WebMethod;
import javax.jws.WebService;

//实现 Web Service 的 Java 类必须指定 @WebService 或 @WebServiceProvider 注释。不能同时提供这两种注
//释

@WebService
public interface HelloWorld {
//@WebMethod 注释表示作为一项 Web Service 操作的方法。 仅支持在使用 @WebService 注释来注释的类上使用 //@WebMethod 注释。
@WebMethod
String sayHi(String text, String text1);

}


2.创建接口类的实现类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16


package com.demo.freemarker.service;

import javax.jws.WebService;

@WebService(targetNamespace = "http://service.freemarker.demo.com/", endpointInterface = "com.demo.freemarker.service.HelloWorld")
public class HelloWorldImpl implements HelloWorld {
@Override
public String sayHi(String text, String text1) {
System.out.println("shyHi called text:" + text + " text1: " + text1);
return "Hello" + text;
}
}


注:endpointInterface为接口类,targetNamespace和wsdl文档中的targetNamespace一致(否则在接口调用的时候可能会报错,至于这个地址怎么写在启动服务后可以查看是否一致不一致则修改查看的方法后面会提到)。

3.创建webService实体配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47


package com.demo.freemarker.config;

import com.demo.freemarker.service.HelloWorld;
import com.demo.freemarker.service.HelloWorldImpl;
import lombok.extern.slf4j.Slf4j;
import org.apache.cxf.Bus;
import org.apache.cxf.bus.spring.SpringBus;
import org.apache.cxf.jaxws.EndpointImpl;
import org.apache.cxf.transport.servlet.CXFServlet;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.xml.ws.Endpoint;

@Configuration
@Slf4j
public class wsdlConfig {
@Bean
public ServletRegistrationBean dispatcherServlet() {
//发布服务名称
return new ServletRegistrationBean(new CXFServlet(), "/service/*");
}

@Bean
public HelloWorld helloWorld() {
return new HelloWorldImpl();
}

@Bean(name = Bus.DEFAULT_BUS_ID)
public SpringBus springBus() {
return new SpringBus();
}

@Bean
public Endpoint endpoint() {
EndpointImpl endpoint = new EndpointImpl(springBus(), helloWorld());
//wsdl文件名称
endpoint.publish("/user");
log.info("________success");
return endpoint;
}
}


5.启动App程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17


package com.demo.freemarker;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;



@SpringBootApplication
public class FreemarkerApp {
public static void main(String[] args) {
SpringApplication.run(FreemarkerApp.class, args);
}
}


6.启动成功后的步骤

1.在页面打开:http://localhost:8080/service/user?wsdl 会出现如视图:

注:其中targetNamespace的值应和上面实现类的targetNamespace值一致

至此简单WebService服务到此创建完成。

二:调用WebService服务上的接口

调用的方法有很多种这里说的是org.apache.axis.client中的Call方法

1.引入jar包:

1
2
3
4
5
6
7
8
9


<dependency>
<groupId>org.apache.axis</groupId>
<artifactId>axis</artifactId>
<version>1.4</version>
</dependency>


2.创建一个调用类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24


public static void main(String[] args) {
Service SERVICE = new Service()
//对应WebService服务地址
String url = "http://localhost:8080/service/user?wsdl";
Call call = (Call) SERVICE.createCall();
//超时时间
call.setTimeout(8000);
//当调用提示SOAPAcation不一致时需要加上如下代码:即 wsdl地址+接口方法名
//call.setSOAPActionURI("http://localhost:8080/service/user/sayHi");
call.setTargetEndpointAddress(new URL(url));
//QNmae即上面的targetNamespace值,sayHi即表示portType中operation的值
call.setOperationName(new QName("http://service.freemarker.demo.com/", "sayHi"));
//参数arg0即表示message Name属性下对应的elemen,elemen对应types下面的sayHi,sayHi对应arg0
//可自行更具上图wsdl理解,当wsdl中没有types这个属性时 arg0可直接改为 name值即sayHi
call.addParameter("arg0", org.apache.axis.encoding.XMLType.XSD_STRING, ParameterMode.IN);
call.addParameter("arg1", org.apache.axis.encoding.XMLType.XSD_STRING, ParameterMode.IN);
call.setReturnType(org.apache.axis.encoding.XMLType.SOAP_STRING);
String str = (String) call.invoke(new String[]{"1","2"});
System.out.println(str);
}