2025年WebService客户端几种实现方式

WebService客户端几种实现方式文章目录 一 发布一个 webservice 服务 jdk 原生 1 编写服务接口 2 服务实现类 3 发布服务 4 浏览器查看是否发布成功 二 几种客户端调用方式 1 jdk 原生调用 需要获取服务接口文件 2 用 import 命令生成客户端代码 3 cxf 类库 两种调用方式 4 axis 调用方式 5 httpClient 调用方式 6 SoapUI 7 其他 一

文章目录

一、发布一个webservice服务(jdk原生)

1.编写服务接口

2.服务实现类

3.发布服务

4.浏览器查看是否发布成功

二、几种客户端调用方式

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

2、用import命令生成客户端代码

3、cxf类库 两种调用方式。

4、axis调用方式

5、httpClient调用方式。

6、SoapUI

7、其他

一、发布一个webservice服务(jdk原生)

1.编写服务接口

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

/**
*
* 基于soap协议(http+xml)的服务
*/
@WebService(name = "Login",// 定义Port名称
serviceName = "MyService", // 修改WebService服务名称
targetNamespace = "http://com.soft.ws/my" // 定义命名空间,默认为倒置的包名
)
public interface MyService {
// 提供一个对外公开的服务
@WebMethod(operationName = "authorization")
// 修改方法名
String authorization(@WebParam(name = "userId") String userId,
@WebParam(name = "password") String password);
}

2.服务实现类

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

/**
* 服务实现类
*/
@WebService(endpointInterface = "com.soft.platform.webservice.server.MyService",
name = "Login",// 定义Port名称
serviceName = "MyService", // 修改WebService服务名称
targetNamespace = "http://com.soft.ws/my" // 定义命名空间,默认为倒置的包名
//服务实现类和接口的注解要一样全
)
public class MyServiceImpl implements MyService {

@WebMethod(operationName = "authorization" // 修改方法名
)
@Override
public String authorization(
@WebParam(name = "userId") String userId,
@WebParam(name = "password") String password) {
if ("admin".equals(userId) && "123456".equals(password)) {
return "success";
}
return "error";
}

}

3.发布服务

运行下面的代码 发布WebService服务

/**
* 发布服务
*
*/
public class MyPublisher {

public static void main(String[] args) {
//指定服务url
String url = "http://192.168.0.101:8089/myservice";
//指定服务实现类
MyService server = new MyServiceImpl();
//采用命令行发布者Endpoint发布服务
Endpoint.publish(url, server);
}

}

4.浏览器查看是否发布成功

打开浏览器地址栏输入:http://192.168.0.101:8089/myservice?wsdl
结果如下:

二、几种客户端调用方式

上面发布的服务不要关闭,编写另外一个客户端类来调用上面发布服务,有以下几种方法来调用服务

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

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 http://192.168.0.101:8089/myservice?wsdl

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);
}

wsimport是jdk自带的,可以根据wsdl文档生成客户端调用代码的工具。
无论服务器端的WebService是用什么语言写的,都将在客户端生成Java代码。

wsimport.exe位于JAVA_HOME\bin目录下.

3、cxf类库 两种调用方式。

Apache CXF 是开源的WebService框架,CXF帮助您使用前端编程api(如JAX-WS和JAX-RS)构建和开发服务。这些服务可以使用多种协议,如SOAP、XML/HTTP、RESTful HTTP或CORBA,并在多种传输协议(如HTTP、JMS或JBI)上工作。
官网地址:http://cxf.apache.org/

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]);
}

注意事项:
apache-cxf-3.2.XX 开始JDK最低要求要JDK1.8而
apache-cxf-3.1.XX还是支持JDK1.7的
cxf的WebServices客户端代码maven依赖如下:



org.apache.cxf
cxf-rt-frontend-jaxws
3.xx.xx


org.apache.cxf
cxf-rt-transports-http
3.xx.xx

/code>

br />

code class='prism'>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();


}


}



}

/code>

br />

code class='prism'>


4.5.6



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

/dependencies>

br /> * Copyright (c)

br /> */

br /> package test;

br />

br /> import org.apache.http.client.config.RequestConfig;

br /> import org.apache.http.client.methods.CloseableHttpResponse;

br /> import org.apache.http.client.methods.HttpPost;

br /> import org.apache.http.entity.StringEntity;

br /> import org.apache.http.impl.client.CloseableHttpClient;

br /> import org.apache.http.impl.client.HttpClients;

br /> import org.apache.http.util.EntityUtils;

br />

br /> import java.nio.charset.Charset;

br />

br /> /**

br /> * webservice客户端

br /> *

br /> * @author David Lin

br /> * @version: 1.0

br /> * @date 2018-09-09 12:16

br /> */

br /> public class SoapClient {

br />

br /> public static void main(String args[]) throws Exception {

br /> //soap服务地址

br /> String url = "http://localhost:8888/ssm/Services/UserService?wsdl";

br /> StringBuilder soapBuilder = new StringBuilder(64);

br /> soapBuilder.append("

?xml version=\"1.0\" encoding=\"UTF-8\"?>");


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();
}
}


}
}

/pre>

p>返回结果为:

/p>

pre class='language-javascript'>




success


/pre>

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


maven依赖

/p>

pre class='language-javascript'>


1.11.3





org.jsoup
jsoup
${jsoup.version}


/code>

code class='prism'>Document soapRes = Jsoup.parse(content);


Elements returnEle = soapRes.getElementsByTag("return");



System.out.println("调用结果为:"+returnEle.text());

/code>

br /> 用这个图形化工具也可以调用WebService服务,作为测试使用。

br />

7、其他

只要WSDL服务地址能够访问,就能根据wsdl描述的信息手动造一个 服务接口文件 ,这样客户端就可以使用这个接口文件调用服务。

编程小号
上一篇 2025-05-30 18:57
下一篇 2025-06-24 21:30

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/hz/140444.html