• WebService客户端几种实现方式


    原文地址:https://blog.csdn.net/linjinhuo/article/details/78777694

    文章目录
    一、发布一个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);
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    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";
    }

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

    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    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
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    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);
    }
    1
    2
    3
    4
    5
    6
    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);
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    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]);
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    4、axis调用方式
    这个例子是比较老的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();
    }
    }

    }
    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
    axis方式依赖的相关jar包如下:


    5、httpClient调用方式。
    (1)maven依赖如下

    <properties>
    <httpclient.version>4.5.6</httpclient.version>
    </properties>
    <dependencies>
    <dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>${httpclient.version}</version>
    </dependency>
    </dependencies>
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    (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("<?xml version="1.0" encoding="UTF-8"?>");
    soapBuilder.append("<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://webservice.soft.com/">");
    soapBuilder.append(" <soapenv:Header/>");
    soapBuilder.append(" <soapenv:Body>");
    soapBuilder.append(" <web:authorization>");
    soapBuilder.append(" <userId>").append("admin").append("</userId>");
    soapBuilder.append(" <password>").append("123456").append("</password>");
    soapBuilder.append(" </web:authorization>");
    soapBuilder.append(" </soapenv:Body>");
    soapBuilder.append("</soapenv:Envelope>");

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


    }
    }

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    返回结果为:

    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>
    <ns2:authorizationResponse xmlns:ns2="http://webservice.soft.com/">
    <return>success</return>
    </ns2:authorizationResponse>
    </soap:Body>
    </soap:Envelope>

    1
    2
    3
    4
    5
    6
    7
    8
    (3)用Jsoup提取响应数据。
    maven依赖

    <properties>
    <jsoup.version>1.11.3</jsoup.version>
    </properties>

    <dependencies>

    <dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>${jsoup.version}</version>
    </dependency>

    </dependencies>
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    代码如下:

    Document soapRes = Jsoup.parse(content);
    Elements returnEle = soapRes.getElementsByTag("return");

    System.out.println("调用结果为:"+returnEle.text());
    1
    2
    3
    4
    6、SoapUI
    soapUI是一个开源测试工具,通过soap/http来检查、调用、实现Web Service的功能/负载/符合性测试。
    用这个图形化工具也可以调用WebService服务,作为测试使用。


    7、其他
    只要WSDL服务地址能够访问,就能根据wsdl描述的信息手动造一个 服务接口文件 ,这样客户端就可以使用这个接口文件调用服务。
    ————————————————
    版权声明:本文为CSDN博主「少年梦fire」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/linjinhuo/java/article/details/78777694

  • 相关阅读:
    【笔记】初探KNN算法(2)
    【笔记】初探KNN算法(3)
    将onenote快速复制粘贴到博客园后台
    【笔记】numpy.array基础(2)
    【笔记】matplotilb数据可视化基础
    【笔记】numpy.array的常用基本运算以及对数据的操作
    【笔记】初探KNN算法(1)
    关于解决numpy使用sklearn时的警告问题
    【笔记】读取数据以及简单的数据探索
    【笔记】numpy.array基础(3)
  • 原文地址:https://www.cnblogs.com/eyesfree/p/12917846.html
Copyright © 2020-2023  润新知