ToB企服应用市场:ToB评测及商务社交产业平台
标题:
WebService使用
[打印本页]
作者:
干翻全岛蛙蛙
时间:
2024-6-18 18:06
标题:
WebService使用
java发布WebService
普通maven项目,使用原生jdk发布webservice
1.pom
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.76</version>
</dependency>
</dependencies>
复制代码
2.接口
import javax.jws.WebService;
import javax.jws.WebParam;
/**
* 对外发布服务的接口
* */
@WebService//(targetNamespace = "http://wsImpl.com/")
public interface HelloWs {
public String sayHello(@WebParam(name="arg0")String name);
}
复制代码
3.实现类
import java.util.HashMap;
import com.alibaba.fastjson.JSONObject;
import com.ws.HelloWs;
public class HelloWsImpl implements HelloWs{
public String sayHello(String name) {
String jsonStr = json();
System.out.print(name);
return jsonStr;
}
//将map变成json并通过报文返回
public String mapJson(){
HashMap<String, Object> zhangsan = new HashMap<String, Object>();
zhangsan.put("name", "张三");
zhangsan.put("age", 18.4);
zhangsan.put("birthday", "1900-20-03");
zhangsan.put("majar", new String[] {"哈哈","嘿嘿"});
zhangsan.put("null", null);
zhangsan.put("house", false);
//System.out.println(new JSONObject(zhangsan).toString());
String jsonStr = new JSONObject(zhangsan).toString();
// TODO Auto-generated method stub
return jsonStr;
}
//原生json并通过报文返回
public String json(){
JSONObject zhangsan = new JSONObject();
zhangsan.put("name", "张三");
zhangsan.put("age", 18.4);
zhangsan.put("birthday", "1900-20-03");
zhangsan.put("majar", new String[] {"哈哈","嘿嘿"});
zhangsan.put("null", null);
zhangsan.put("house", false);
return zhangsan.toString();
}
}
复制代码
4.发布类
主方法运行后,直接在浏览器访问http://ip:8080/ws/hello?wsdl
import javax.xml.ws.Endpoint;
import com.wsImpl.HelloWsImpl;
public class Service {
public static void main(String[] args) {
//设置服务地址,换成你的ip
Endpoint.publish("http://10.10.150.20:8080/ws/hello",new HelloWsImpl());
System.out.println("发布WS服务成功");
}
}
复制代码
5.调用方法
import java.io.IOException;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import com.ws.HelloWs;
public class ProtoCall {
public static void main(String[] args) throws IOException {
//创建WSDL地址,不是服务地址
URL url = new URL("http://10.10.150.20:8080/ws/hello?wsdl");
/**
* QName是XML元素的限定名称,是组成XML的最基本的要素
* */
//创建服务名称
//1.namespaceURI - 命名空间地址
//2.localPart - 服务名称,wsdl中的name,不是@WebService注解中的name
QName qname = new QName("http://wsImpl.com/", "HelloWsImplService");
//Service创建视图
//参数:
//1.wsdlDocumentLocation - 使用说明书地址
//2.serviceName - 服务名称
Service service = Service.create(url, qname);
//获取实现类
HelloWs mobileCodeWSSoap = service.getPort(HelloWs.class);
//调用查询方法
String result = mobileCodeWSSoap.sayHello("188888888");
System.out.println(result);
}
}
复制代码
CXF发布WebService
普通maven项目,使用apache.cxf发布webservice
1.pom
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.4.3</version>
</dependency>
<dependency><!-- 内置jetty web服务器 -->
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>3.4.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.76</version>
</dependency>
</dependencies>
复制代码
2.接口
import javax.jws.WebService;
import javax.jws.WebParam;
/**
* 对外发布服务的接口
* */
@WebService//(targetNamespace = "http://wsImpl.com/")
public interface HelloWs {
public String sayHello(@WebParam(name="arg0")String name);
}
复制代码
3.实现类
import java.util.HashMap;
import com.alibaba.fastjson.JSONObject;
import com.ws.HelloWs;
public class HelloWsImpl implements HelloWs{
public String sayHello(String name) {
String jsonStr = json();
System.out.print(name);
return jsonStr;
}
//将map变成json并通过电文返回
public String mapJson(){
HashMap<String, Object> zhangsan = new HashMap<String, Object>();
zhangsan.put("name", "张三");
zhangsan.put("age", 18.4);
zhangsan.put("birthday", "1900-20-03");
zhangsan.put("majar", new String[] {"哈哈","嘿嘿"});
zhangsan.put("null", null);
zhangsan.put("house", false);
//System.out.println(new JSONObject(zhangsan).toString());
String jsonStr = new JSONObject(zhangsan).toString();
// TODO Auto-generated method stub
return jsonStr;
}
//原生json并通过电文返回
public String json(){
JSONObject zhangsan = new JSONObject();
zhangsan.put("name", "张三");
zhangsan.put("age", 18.4);
zhangsan.put("birthday", "1900-20-03");
zhangsan.put("majar", new String[] {"哈哈","嘿嘿"});
zhangsan.put("null", null);
zhangsan.put("house", false);
return zhangsan.toString();
}
}
复制代码
4.发布类
主方法运行后,直接在浏览器访问http://ip:8080/ws/hello?wsdl
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
import com.wsImpl.HelloWsImpl;
public class Service {
public static void main(String[] args) {
/**
EndpointImpl发布方式
*/
//EndpointImpl publish = (EndpointImpl) Endpoint.publish("http://10.10.150.20:8080/ws/hello",new HelloWsImpl());
//publish.getOutInterceptors().add(new LoggingOutInterceptor());
//publish.getInInterceptors().add(new LoggingInInterceptor());
/**
工厂发布方式
*/
//发布服务的工厂
JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
//设置服务地址,换成你的ip
factory.setAddress("http://10.10.150.20:8080/ws/hello");
//设置服务类
factory.setServiceBean(new HelloWsImpl());
//添加日志输入输出拦截器
factory.getInInterceptors().add(new LoggingInInterceptor());
factory.getOutInterceptors().add(new LoggingOutInterceptor());
//发布服务
factory.create();
System.out.println("发布WS服务成功");
}
}
复制代码
5.调用方法
import java.io.IOException;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import com.ws.HelloWs;
public class ProtoCall {
public static void main(String[] args) throws IOException {
//创建WSDL地址,不是服务地址
URL url = new URL("http://10.10.150.20:8080/ws/hello?wsdl");
/**
* QName是XML元素的限定名称,是组成XML的最基本的要素
* */
//创建服务名称
//1.namespaceURI - 命名空间地址
//2.localPart - 服务名称,wsdl中的name,不是@WebService注解中的name
QName qname = new QName("http://wsImpl.com/", "HelloWsImplService");
//Service创建视图
//参数:
//1.wsdlDocumentLocation - 使用说明书地址
//2.serviceName - 服务名称
Service service = Service.create(url, qname);
//获取实现类
HelloWs mobileCodeWSSoap = service.getPort(HelloWs.class);
//调用查询方法
String result = mobileCodeWSSoap.sayHello("188888888");
System.out.println(result);
}
}
复制代码
整合SpringBoot发布及调用
1.pom依赖
<dependencies>
<!-- 核心启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- web启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- webService-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web-services</artifactId>
</dependency>
<!-- CXF webservice -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-spring-boot-starter-jaxws</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-ws-security</artifactId>
<version>3.2.1</version>
</dependency>
<!-- CXF webservice -->
<!-- https://mvnrepository.com/artifact/commons-discovery/commons-discovery -->
<dependency>
<groupId>wsdl4j</groupId>
<artifactId>wsdl4j</artifactId>
<version>1.6.3</version>
</dependency>
<!-- Restful接口依赖,用于rest风格接口 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-spring-boot-starter-jaxrs</artifactId>
<version>3.1.12</version>
</dependency>
<dependency>
<groupId>org.wso2.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.3.1.wso2v1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.axis/axis -->
<dependency>
<groupId>org.apache.axis</groupId>
<artifactId>axis</artifactId>
<version>1.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-httpclient/commons-httpclient -->
<dependency>
<groupId>commons-httpclient</groupId>
<artifactId>commons-httpclient</artifactId>
<version>3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.xml/jaxrpc -->
<dependency>
<groupId>javax.xml</groupId>
<artifactId>jaxrpc</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.0.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-discovery/commons-discovery -->
<dependency>
<groupId>commons-discovery</groupId>
<artifactId>commons-discovery</artifactId>
<version>0.5</version>
</dependency>
<!-- 阿里JSON解析器 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.18.Final</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
复制代码
2.创建接口及实现类
接口
@WebService
: 标记此接口为WebService接口;
name
为接口名称,
targetNamespace
为名称空间,可以自定义;
@WebMethod
: 标记方法为WebService接口中的方法
@WebParam
: 标记参数为WebService接口中方法参数,可限定名称(name = “abdc”),不限定默以为方法参数变量名
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.xml.ws.BindingType;
import javax.xml.ws.soap.SOAPBinding;
@WebService(name = "ServerServiceDemo", targetNamespace = "http://server.webservice.example.com")
//@BindingType(value = SOAPBinding.SOAP12HTTP_BINDING)//将SOAP协议定义为1.2 Eclipse自带的WebService Brower只能解析soap1.1的协议,服务器端最好使用高版本的协议
public interface ServerServiceDemo {
@WebMethod
String emrService(@WebParam String data);
}
复制代码
实现类
@WebService
: 标记此接口为WebService接口;
name
为接口名称,
targetNamespace
为名称空间,可以自定义;
endpointInterface
为此类实现接口的全路径
@WebParam
: 标记参数为WebService接口中方法参数,可限定名称(name = “abdc”),不限定默以为方法参数变量名
import com.alibaba.fastjson.JSONObject;
import com.demo.axisDemo.service.ServerServiceDemo;
import org.springframework.stereotype.Component;
import javax.jws.WebParam;
import javax.jws.WebService;
@Component
@WebService(name = "ServerServiceDemo", targetNamespace = "http://server.webservice.example.com",
endpointInterface = "com.demo.axisDemo.service.ServerServiceDemo")
public class ServerServiceDemoImpl implements ServerServiceDemo {
@Override
public String emrService(@WebParam String data) {
if (null == data || "".equals(data.trim())) {
return "传入的参数为空";
}
System.out.println(data + " -------------------------");
return "服务端返回 调用成功:" + data;
}
}
复制代码
3.编写配置类
@Configuration
public class WebServiceConfig {
/**
引入接口类
*/
@Autowired
private ServerServiceDemo serverServiceDemo;
/**
* Apache CXF 核心架构是以BUS为核心,整合其他组件。
* Bus是CXF的主干, 为共享资源提供一个可配置的场所,作用类似于Spring的ApplicationContext,这些共享资源包括
* WSDl管理器、绑定工厂等。通过对BUS进行扩展,可以方便地容纳自己的资源,或者替换现有的资源。默认Bus实现基于Spring架构,
* 通过依赖注入,在运行时将组件串联起来。BusFactory负责Bus的创建。默认的BusFactory是SpringBusFactory,对应于默认
* 的Bus实现。在构造过程中,SpringBusFactory会搜索META-INF/cxf(包含在 CXF 的jar中)下的所有bean配置文件。
* 根据这些配置文件构建一个ApplicationContext。开发者也可以提供自己的配置文件来定制Bus。
*/
@Bean(name = Bus.DEFAULT_BUS_ID)
public SpringBus springBus() {
return new SpringBus();
}
/*
* 此方法作用是改变项目中服务名的前缀名
* 此方法被注释后, 即不改变前缀名(默认是services), wsdl访问地址为 http://127.0.0.1:8080/services/ws/api?wsdl
* 去掉注释后wsdl访问地址为:http://127.0.0.1:8080/soap/ws/api?wsdl
//@Bean
//public ServletRegistrationBean dispatcherServlet() {
// return new ServletRegistrationBean(new CXFServlet(), "/soap/*");
//}
/**
* 此处的EndpointImpl构造方法源码调用了JaxWsServiceFactoryBean及WebServiceFeature,
* 即在bus中开启webservice功能,并通过JaxWsServiceFactoryBean获取一个具体服务
*
* EndpointImpl端点对象,可以将其作用理解为连接bus与java WS服务
* WebServiceFeature 用于表示可以为 Web 服务启用或禁用的功能。
* */
@Bean
public Endpoint endpoint() {
EndpointImpl endpoint = new EndpointImpl(springBus(), serverServiceDemo);//363
endpoint.publish("/ws/api");
return endpoint;
}
}
复制代码
4.客户端调用
Axis调用
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import org.apache.axis.message.SOAPHeaderElement;
import org.apache.cxf.configuration.security.AuthorizationPolicy;
import org.apache.cxf.helpers.DOMUtils;
import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;
import java.net.URL;
public class CallUtiles {
//接口地址
private static String publishUrl = "http://localhost:8080/services/ws/api?wsdl";
//wsdl中的targetNamespace
private static String nameSpaceURI = "http://server.webservice.example.com";
public static String get(String userStr) throws Exception {
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(new URL(publishUrl));
//指定接口路径,要调用的方法名
call.setOperationName(new QName(nameSpaceURI, "emrService"));
//如果没用@WebParam(name="name")来表明参数名,则方法的入参是啥,这边就必须传一样的参数名才行。不然报错。
call.addParameter("arg0", XMLType.XSD_STRING, ParameterMode.IN);
call.setReturnType(XMLType.XSD_STRING);
Object[] obj = new Object[]{userStr};
String result = (String) call.invoke(obj);
return result;
}
}
复制代码
java原生调用
import com.demo.axisDemo.service.ServerServiceDemo;
import java.io.IOException;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
public class ProtoCall {
public static void main(String[] args) throws IOException {
//创建WSDL地址,不是服务地址
URL url = new URL("http://127.0.0.1:9088/api/Domain/Xinda-ESB/esb-ec2erp?wsdl");
/**
* QName是XML元素的限定名称,是组成XML的最基本的要素
* */
//创建服务名称
//1.namespaceURI - 命名空间地址
//2.localPart - 服务名称,wsdl中的name,不是@WebService注解中的name
QName qname = new QName("http://service.erp.esb.xinda.com/IDTIWSReceEC", "IDTIWSReceEC");
//Service创建视图
//参数:
//1.wsdlDocumentLocation - 使用说明书地址
//2.serviceName - 服务名称
Service service = Service.create(url, qname);
//获取实现类
ServerServiceDemo mobileCodeWSSoap = service.getPort(ServerServiceDemo.class);
//调用查询方法
String result = mobileCodeWSSoap.emrService("188888888");
System.out.println(result);
}
}
复制代码
下令工具调用
cmd输入命令:wsdl2java -p com -d ../src -client -encoding utf-8 http://localhost:8080/admin/cxfService?wsdl
注意:wsdl地址必须与发布publish中的相同,执行后会在../src生成代码,直接使用实现类get方法调用
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4