博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WebService客户端几种实现方式
阅读量:5282 次
发布时间:2019-06-14

本文共 6881 字,大约阅读时间需要 22 分钟。

1、原生调用(需要获取服务接口文件)

import java.net.URL;import javax.xml.namespace.QName;import javax.xml.ws.Service;import com.soft.platform.webservice.server.MyService;public class WsClient {	public static void main(String[] args) throws Exception {		URL url = new URL("http://192.168.0.101:8089/myservice?wsdl");		// 指定命名空间和服务名称		QName qName = new QName("http://com.soft.ws/my", "MyService");		Service service = Service.create(url, qName);		// 通过getPort方法返回指定接口		MyService myServer = service.getPort(new QName("http://com.soft.ws/my",				"LoginPort"), MyService.class);		// 调用方法 获取返回值		String result = myServer.authorization("admin", "123456");		System.out.println(result);	}}返回结果: success

2.import生成客户端代码

wsimport -d d:/webservice -keep -p com.soft.test.wsimportClient -verbose 
这里写图片描述

public static void main(String[] args) {		MyService_Service service = new MyService_Service();		MyService login = service.getLoginPort();		String result = login.authorization("admin", "123456");		System.out.println(result);	}

3、cxf两种调用方式。

public static void main(String[] args) {		JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();		factory.setServiceClass(MyService.class);		factory.setAddress("http://192.168.0.101:8089/myservice?wsdl");		// 需要服务接口文件		MyService client = (MyService) factory.create();		String result = client.authorization("admin", "123456");		System.out.println(result);	}

  

public static void main(String[] args) throws Exception {		//采用动态工厂方式 不需要指定服务接口		JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();		Client client = dcf				.createClient("http://192.168.0.101:8089/myservice?wsdl");		QName qName = new QName("http://com.soft.ws/my", "authorization");		Object[] result = client.invoke(qName,				new Object[] { "admin", "123456" });		System.out.println(result[0]);	}

4、axis调用方式

import java.net.MalformedURLException;import java.net.URL;import java.rmi.RemoteException;import javax.xml.namespace.QName;import javax.xml.rpc.ParameterMode;import javax.xml.rpc.ServiceException;import org.apache.axis.client.Call;import org.apache.axis.client.Service;import org.apache.axis.encoding.XMLType;public class WsAClient {     /**	 * 跨平台调用Web Service出现	 *  faultString: 服务器未能识别 HTTP 头 SOAPAction 的值: 	 * JAX-WS规范不需要SoapAction,但是.NET需要,所以产生了这个错误。 	 * options.setAction("目标的TargetNameSpace"+"调用的方法名");	 */	public static void main(String[] args) {		String url = "http://192.168.0.101:8089/myservice?wsdl";		Service service = new Service();		try {			Call call = (Call) service.createCall();			call.setTargetEndpointAddress(new URL(url));			// WSDL里面描述的接口名称(要调用的方法)			call.setOperationName(new QName("http://com.soft.ws/my",					"authorization"));			//跨平台调用加上这个		   call.setUseSOAPAction(true);		   call.setSOAPActionURI("http://com.soft.ws/my/authorization");			// 接口方法的参数名, 参数类型,参数模式 IN(输入), OUT(输出) or INOUT(输入输出)			call.addParameter("userId", XMLType.XSD_STRING, ParameterMode.IN);			call.addParameter("password", XMLType.XSD_STRING, ParameterMode.IN);			// 设置被调用方法的返回值类型			call.setReturnType(XMLType.XSD_STRING);			// 设置方法中参数的值			Object result = call.invoke(new Object[] { "admin", "123456" });			System.out.println(result.toString());		} catch (ServiceException | RemoteException | MalformedURLException e) {			e.printStackTrace();		}	}}

axis方式依赖的相关jar包如下:

在这里插入图片描述

5、httpClient调用方式。

(1)maven依赖如下

4.5.6
org.apache.httpcomponents
httpclient
${httpclient.version}

(2)httpclient作为客户端调用webservice。代码如下

/* * Copyright (c) */package test;import org.apache.http.client.config.RequestConfig;import org.apache.http.client.methods.CloseableHttpResponse;import org.apache.http.client.methods.HttpPost;import org.apache.http.entity.StringEntity;import org.apache.http.impl.client.CloseableHttpClient;import org.apache.http.impl.client.HttpClients;import org.apache.http.util.EntityUtils;import java.nio.charset.Charset;/** * webservice客户端 * * @author David Lin * @version: 1.0 * @date 2018-09-09 12:16 */public class SoapClient {    public static void main(String args[]) throws Exception {        //soap服务地址        String url = "http://localhost:8888/ssm/Services/UserService?wsdl";        StringBuilder soapBuilder = new StringBuilder(64);        soapBuilder.append("
"); soapBuilder.append("
"); soapBuilder.append("
"); soapBuilder.append("
"); soapBuilder.append("
"); soapBuilder.append("
").append("admin").append("
"); soapBuilder.append("
").append("123456").append("
"); soapBuilder.append("
"); soapBuilder.append("
"); soapBuilder.append("
"); //创建httpcleint对象 CloseableHttpClient httpClient = HttpClients.createDefault(); //创建http Post请求 HttpPost httpPost = new HttpPost(url); // 构建请求配置信息 RequestConfig config = RequestConfig.custom().setConnectTimeout(1000) // 创建连接的最长时间 .setConnectionRequestTimeout(500) // 从连接池中获取到连接的最长时间 .setSocketTimeout(3 * 1000) // 数据传输的最长时间10s .build(); httpPost.setConfig(config); CloseableHttpResponse response = null; try { //采用SOAP1.1调用服务端,这种方式能调用服务端为soap1.1和soap1.2的服务 httpPost.setHeader("Content-Type", "text/xml;charset=UTF-8"); //采用SOAP1.2调用服务端,这种方式只能调用服务端为soap1.2的服务 // httpPost.setHeader("Content-Type", "application/soap+xml;charset=UTF-8"); StringEntity stringEntity = new StringEntity(soapBuilder.toString(), Charset.forName("UTF-8")); httpPost.setEntity(stringEntity); response = httpClient.execute(httpPost); // 判断返回状态是否为200 if (response.getStatusLine().getStatusCode() == 200) { String content = EntityUtils.toString(response.getEntity(), "UTF-8"); System.out.println(content); } else { System.out.println("调用失败!"); } } catch (Exception e) { e.printStackTrace(); } finally { if (null != response) { response.close(); } if (null != httpClient) { httpClient.close(); } } }}

返回结果为:

success

(3)用Jsoup提取响应数据。

maven依赖

1.11.3
org.jsoup
jsoup
${jsoup.version}

代码如下:

Document soapRes = Jsoup.parse(content); Elements returnEle = soapRes.getElementsByTag("return"); System.out.println("调用结果为:"+returnEle.text());

 

转载于:https://www.cnblogs.com/mracale/p/10578686.html

你可能感兴趣的文章
数据库查询问题小记
查看>>
validate插件:验证密码没有空格 用户名是5-10位 至少包含数字和大小写字母中的两种字符...
查看>>
echarts问题
查看>>
day 06 小数据池和编码
查看>>
node.js安装备忘录
查看>>
c/c++ explicit用法
查看>>
作业10-异常 java
查看>>
C\C++中strcat()函数、sprintf函数
查看>>
HTTP的特点?
查看>>
第二章 排版 2.9列表
查看>>
SQL Server中利用正则表达式替换字符串
查看>>
(六)Angularjs - 启动引导
查看>>
css3新单位vw、vh、vmin、vmax的使用详解(转载)
查看>>
软件测试培训第30天
查看>>
创建守护进程步骤与setsid()
查看>>
[iOS]Win8下iTunes无法连接iPhone版本的解决方法
查看>>
鸟哥私房菜基础篇:Linux 磁碟与档案系统管理习题
查看>>
垂直居中及水平垂直居中方案(共15种)
查看>>
JavaScript高级程序设计26.pdf
查看>>
jquery 对 table 的操作
查看>>