webservice的基础知识以及入门案例1

2023-05-16

一 webService

1.1 webservcie 

webservice是一种跨操作系统和跨语言的数据调用、数据交换的一种服务技术。用于网络通信,多台机器之间的数据交互。

最大优点:webservice最大的好处是客户端与服务端语言的兼容性交互时候可以传递对象。

1.2 webservice与socket的区别

1. socket是在网络中的数据传输层,采用的是TCP/UDP协议webservice是属于应用层,采用的是http协议

2. socket建立是长连接,webservice建立的是短连接(调用服务时建立连接,调用完毕后断开连接

1.3 wsdl文档

1.3.1 定义

定义:web services description language,用来描述web服务的xml格式的信息。

1.3.2 作用

作用:通过wsdl说明书,就可以描述webservice服务端对外发布的服务

1.3.3 文档格式

文档格式:

Service:指定服务所发布的名称,包括相关端口的集合,包括其关联的接口、操作、消息等。

Binding:指定消息传递的格式特定端口类型的具体协议和数据格式规范,通过binding指向portType

portType: 指明服务器的接口,描述 web service可被执行的操作方法,以及相关的消息,并且通过operation绑定相应的in和out的消息:其中in表示参数,out表示返回值,,

message: 定义了多个SOAP消息,每个方法通常都有2个message标签,name属性分别是xxx和xxxResponse

types: 定义了服务的namespace和关键信息的类型(方法的参数类型和返回值的类型)

 1.3.4 阅读方式

WSDL文档应该从下往上阅读。

1.先看service标签,看相应port的binding属性,然后通过值查找上面的binding标签。

2.通过binding标签可以获得具体协议等信息,然后查看binding的type属性

3.通过binding的type属性,查找对应的portType,可以获得可操作的方法和参数、返回值等。

4.通过portType下的operation标签的message属性,可以向上查找message获取具体的数据参数信息

1.4 客户端接口targetnamespace的注意事项

客户端接口调用中的namespance,targetnamespance要写成:包.类名的反缀形式

targetNamespace:指定你想要的名称空间,默认是使用接口实现类的包名的反缀

 

二 webService的案例-服务端代码

2.1 编写服务端

2.2 编写webservice的发布类

2.2.1 定义发布接口speaker

package com.bonc.xj.webservice;


import javax.jws.WebService;

/**
 * 定义服务的接口
 * @author Beauxie
 *
 */
@WebService//此注解用在类上指定将此类发布成一个WebService
public interface Speaker {

 String sayHello(String name);

}

2.2.2 定义发布接口实现类Person

注意:接口和实现类中必须用@WebService注解,并且在实现类的注解中必须指定endpointInterface属性的值为接口的全限定名

package com.bonc.xj.webservice.impl;

/**
 * @ClassName: Person
 * @Description: TODO
 * @Author: liujianfu
 * @Date: 2021/03/18 10:26:08 
 * @Version: V1.0
 **/

import com.bonc.xj.webservice.Speaker;

import javax.jws.WebService;

/**
 * 定义服务的实现类
 * @author Beauxie
 */
@WebService(endpointInterface="com.bonc.xj.webservice.Speaker")
public class Person implements Speaker {

    public String sayHello(String name) {

        return "Hello,"+name+"我在美丽的新疆吉木萨尔!";
    }

}

2.3 编写发布服务类

  //1.定义发布的地址:端口号,发布的上下文路径,自己定义
        String url = "http://localhost:8002/ws-demo";

package com.bonc.xj;

import com.bonc.xj.webservice.impl.Person;

import javax.xml.ws.Endpoint;

/**
 * Hello world!
 *
 */
public class ServerApp
{
    public static void main( String[] args )
    {
        //1.定义发布的地址:端口号,发布的上下文路径,自己定义
        String url = "http://localhost:8002/ws-demo";
        //2.发布服务
        //第一个参数是指定你要发布的地址,第二个参数是你要发布的服务对象
        Endpoint.publish(url, new Person());
        System.out.println("服务器已启动");
        System.out.println( "Hello World!" );

    }
}

启动服务:

然后打开浏览器访问http://localhost:8002/ws-demo?wsdl,只要在客户端浏览器能看以下WSDL文档,说明服务发布成功:

 

2.4 编写客户端

1.在这个服务端工程下,创建一个调用的客户端,这个客户端是和服务端在一个工程下,代码如下:

package com.bonc.xj;



import com.bonc.xj.webservice.Speaker;

import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import java.net.MalformedURLException;
import java.net.URL;

/**
 * Hello world!
 *
 */
public class ClientApp
{
    public static void main( String[] args ) throws MalformedURLException {
        //1.声明所发布的服务对应的wsdl地址
        URL url=new URL("http://localhost:8002/ws-demo?wsdl");
        //2.声明所要调用的Qname
        QName qname=new QName("http://impl.webservice.xj.bonc.com/", "PersonService");
        //3.创建客户端的服务代理对象
        Service service=Service.create(url,qname);
        Speaker speaker = service.getPort(Speaker.class);

        //4.调用服务的方法
        String str=speaker.sayHello("Beauxie");

        System.out.println(str);

    }
}

2.  QName qname=new QName("http://impl.webservice.xj.bonc.com/", "PersonService"); 这里面的两个参数,要参考发布文档中的targetnamespace 和name这个两个参数,两个参数都不能瞎写, 

其实表达的意思就是要访问服务端下的:com.bonc.xj.webservice.impl  的Person这个类(service后缀要加上,变为PersonSevice)

3. 执行结果:

 

三 webService的案例-客户端代码

虽然在上面服务端编写客户端代码也能调通,但是为了层次分明,和具有说服力,这里将单独再建一个客户端的工程,去调用服务端的服务接口。

3.1 webservice客户端工程

3.2 客户端speaker 接口

1.这里的接口

@WebService(targetNamespace = "http://webservice.xj.bonc.com/") 参考服务端发布的wsdl文档中,<wsdl:import 中的namespace的值,这里配置为http://webservice.xj.bonc.com/  ,其实就是映射成服务端
这个接口speaker所在的包.类的绝对路径。
<wsdl:import location="http://localhost:8002/ws-demo?wsdl=Speaker.wsdl" namespace="http://webservice.xj.bonc.com/"> </wsdl:import>

2.图片 

3.详情代码

客户端需要新建一个speaker的接口:和服务端的speaker接口一致

package com.bonc.ws.client.service;


import javax.jws.WebService;

/**
 * 定义服务的接口
 * @author Beauxie
 *
 */
/*
这个接口中targetnamespace的配置原则为:
参考服务端发布的wsdl文档中,wsdl=speaker.wsdl 中的namespace的值,这里配置为http://webservice.xj.bonc.com/  ,其实就是映射成服务端
这个接口speaker所在的包.类的绝对路径。
<wsdl:import location="http://localhost:8002/ws-demo?wsdl=Speaker.wsdl" namespace="http://webservice.xj.bonc.com/"> </wsdl:import>
 */

@WebService(targetNamespace = "http://webservice.xj.bonc.com/")
public interface Speaker {

 String sayHello(String name);

}

3.3 客户端调用接口

1.这里new QNam(x,x)参数的配置:

QName qname=new QName("http://impl.webservice.xj.bonc.com/", "PersonService"); 里面的参数配置原则:QName中两个参数所对应wsdl文档中参数:

这里的: 

package com.bonc.ws.client;

import com.bonc.ws.client.service.Speaker;

import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import java.net.MalformedURLException;
import java.net.URL;

/**
 * Hello world!
 *
 */
public class App2
{
    public static void main( String[] args ) throws MalformedURLException {
        //1.声明所发布的服务对应的wsdl地址
        URL url=new URL("http://localhost:8002/ws-demo?wsdl");
        //2.声明所要调用的Qname
        QName qname=new QName("http://impl.webservice.xj.bonc.com/", "PersonService");
        //3.创建客户端的服务代理对象
        Service service=Service.create(url,qname);
        Speaker speaker = service.getPort(Speaker.class);

        //4.调用服务的方法
        String str=speaker.sayHello("Beauxie");

        System.out.println(str);

    }
}

调用结果:

参考地址:https://blog.csdn.net/BeauXie/article/details/52851862

未完待续,下一篇:使用wsimport命令生成webservice的客户端接口 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

webservice的基础知识以及入门案例1 的相关文章

  • MWAN3报:interface vwan1 is error and tracking is active错误的解决

    当配置完MWAN3后 负载均衡 详细信息页面始终报错 interface vwan1 is error and tracking is active 的解决方法 升级mwan3 配合脚本 开机后WAN口获取到正确IP后 重启mwan3解决
  • Ubuntu14.04+OpenStackMitaka版本+PCIpassthrough(透传)的GPU直通之路

    显卡 xff1a GeForce GTX 1060 root 64 computer lspci nn grep NVIDIA 01 00 0 VGA compatible controller NVIDIA Corporation Dev
  • git与 github连接

    简单记录下自己琢磨git的运用 和 git 与 github账户的连接 xff0c 本人是在ubuntu操作系统下操作的 xff08 除了git安装部分同样使用与windows xff09 如果系统为windows 一下所有在终端输入的指令
  • 给windows server中的“未识别的网络”或“无法识别的网络”设置网络位置类型...

    在windows server中 xff0c 如果网络没有被正确的识别 xff0c 那么就需要手工设置一下网络位置类型 将 公用网络 指定设置为 专用网络 控制面板 系统和安全 管理工具 本地安全策略 网络列表管理器策略 网络 网络位置 x
  • MySQL group by后取每个分组中最新一条数据

    一 需求 MySQL group by后取每个分组中最新一条数据 二 实现 1 xff09 方案1 xff1a 使用min 和max 方法 1 group by后取每个分组中最新一条数据 SELECT MAX test id FROM te
  • 【Debian】设置代理服务器

    注意所有ip都要加上http etc profile System wide environment and startup programs for login setup Functions and aliases Go in etc
  • Ubuntu设置开机启动找不到rc.local的问题

    1 使用runlevel或者who r查看服务器的运行级别 xff0c 2 根据运行级别查看 ls lh etc rc d rc X d XXX gt rc local xff0c 所指向的rc local文件是哪个 默认在 etc rc
  • /usr/bin/env: 'bash\r': No such file or directory

    是由于windows格式的shell多了个 r 替换掉就可以了 https stackoverflow com questions 29045140 env bash r no such file or directory 或者直接在Lin
  • Ubuntu登陆不进去(已解决)

    Ubuntu一直在登陆界面循环 xff1a 登陆密码是正确的 xff0c 但是登陆后自动退回登陆界面 Ctrl 43 Alt 43 F1 F6进入命令行界面 xff0c 尝试startx启动桌面 xff0c 提示 xff1a could n
  • Map内存泄露问题

    如下代码Map的key为一个对象 xff0c 对象重写hashcode并且根据对象属性变化 xff0c 如果对象的属性值发生变化 xff0c 对象的hashcode也会变化 xff0c 就不能取出原来的值 xff0c 最终导致资源浪费 im
  • SQL语句、PL/SQL语句、SQL*PLUS语句结束符号

    xff08 1 xff09 SQL语句以 xff1b 或者 结束语句 通常情况是以 xff1b 结束语句 xff08 2 xff09 PL SQL语句以 结束语句 xff08 3 xff09 SQL PLUS语句以换行符结束语句
  • Debian 9 Stretch国内常用镜像源

    随着Debian 9的普及 xff0c 但由于伟大的墙的存在 xff0c 那就有必要整理一下国内的镜像站点 1 使用说明 一般情况下 xff0c 修改 etc apt sources list文件 xff0c 将Debian的默认源地址改成
  • docker分布式部署pyspider爬虫系统

    阅读准备 docker基础命令 xff0c docker compose基础pyspider基础 如果您不熟悉上面的内容 xff0c 可以先网上查阅有关资料 1 创建网络接口 首先 xff0c 创建一个Driver为bridge的网络接口
  • iOS 导航控制器、导航条、导航项、控制器的关系

    常见的APP的页面结构 xff0c 分为两个横向和纵向两个维度 xff0c 最为经典的就是横向维度采用UITabBarController xff0c 纵向维度采用UINavigationController 当然 xff0c 横向维度还可
  • 物化视图日志与增量刷新

    一 物化视图日志结构 Oracle 的物化视图的快速刷新要求必须建立物化视图日志 xff0c 通过物化视图日志可以实现增量刷新功能 物化视图日志的名称为 MLOG 后面跟基表的名称 xff0c 如果表名的长度超过 20 位 xff0c 则只
  • ubuntu 修改环境变量(PATH)

    ubuntu 修改环境变量 PATH 1 什么是环境变量 PATH 在Linux中 xff0c 在执行命令时 xff0c 系统会按照PATH的设置 xff0c 去每个PATH定义的路径下搜索执行文件 xff0c 先搜索到的文件先执行 我们知
  • python装饰器

    python装饰器 在不改变原有功能的情况下 xff0c 增加新的功能 在不改变存钱和取钱的功能 xff0c 增加验证登录的功能 def is login func def wapper args kwargs print 39 登录成功
  • python倒序删除list元素

    python按照条件在list中删除元素时 xff0c 如果正序从前往后删除 xff0c 会使元素的索引位置前移 xff0c 可能造成部分元素无法删除 xff0c 举例 xff1a 执行结果 xff1a 可见 xff0c 由于删除第一个3后
  • Python3 pytesseract识别简单的验证码

    安装tesseract并添加到系统PATH Python3 pytesseract识别简单的验证码 xff0c JPEG格式 xff0c 验证码样式如下 xff1a 此验证码比较简单 xff0c 因此简单二值化处理 xff0c 然后使用py
  • Android10.0和11.0唯一识别标识设计

    背景介绍 应用开发中不管是埋点统计还是推送通知 xff0c 都会用到唯一识别标识 xff0c 在Android中设备唯一码有很多 xff0c 如 xff1a MAC地址 IMEI号 xff08 DeviceId xff09 IMSI号 AN

随机推荐

  • Linux系统中用命令行清空垃圾箱Trash

    我用的系统是Ubuntu16 04 最近遇到了一个问题是 xff0c 当我的垃圾箱有大量的小文件时 xff0c 当我用图形界面清空垃圾箱时 xff0c 总是卡死 xff0c 而其清理很慢 xff0c 于是用命令行清理 xff0c 代码如下
  • 4、IP信息查询API接口,免费好用

    1 前言 IP信息查询接口 xff0c 这个是RollToolsApi通用系列接口的其中一个 xff0c 内部包含了2个小接口 xff0c 能实现获取访问者当前ip信息和指定信息ip信息 这个接口的主要特点是 xff0c 能获取ip地址所在
  • 7、全国天气查询API接口,免费好用

    1 前言 全国天气查询接口 xff0c 这个是RollToolsApi通用系列接口的其中一个 xff0c 内部包含了2个小接口 xff0c 能实现获取特定城市今日及未来三天的天气 这个接口的主要特点是 xff0c 数据更新延迟低 查看接口完
  • ios开发中如何判断手指在屏幕上是移动事件还是点击事件

    如果自己想 可以有一种方法是这样的 当用户touch动作结束后 判断用户点击开始位置和结束位置的坐标 如果相等 则说明是点击 否则为移动 这种方式理论上是可以的 在模拟机上也是可以的 原因是因为模拟机上你用的时鼠标点击 点击的是一个点 可以
  • zeal工具的安装与使用(离线api文档浏览器)

    本来想下载一个dash来用一下 xff0c 结果它只有mac版本 xff0c 没有windows版 xff0c 遂使用zeal zeal官网 xff1a https zealdocs org 文档地址 xff1a http kapeli c
  • Kubernetes部署SpringBoot连接外部数据库使用svc模式

    这篇文章主要讲解Kubernetes部署SpringBoot的过程 xff0c 其中主要的难点是用svc名称动态获取数据库IP 网上有一部分文档有说 xff0c 但是不进行讲解 xff0c 我在最初部署的时候测试不成功 xff0c 后来发现
  • Python进行 sftp上传下载

    1 Python进行 sftp上传下载 span class token comment 下载SFTP代码内容 pip install paramiko span span class token keyword import span p
  • VS远程调试方法

    远程调试步骤 一 远程调试前置条件 1 调试的机器上安装了 Microsoft Visual Studio 2 被调试机器上有远程调试的程序 xff0c 这个程序可以在VS安装路径下拷贝 xff0c 如果是默认安装 xff0c 那么所在的文
  • Qt 信号-槽的同步与异步处理

    通常使用的connect xff0c 实际上最后一个参数使用的是Qt AutoConnection类型 xff1a Qt支持6种连接方式 xff0c 其中3中最主要 1 Qt DirectConnection xff08 直连方式 xff0
  • Qt 线程同步与异步处理

    一 线程分析 1 继承QThread类 平时我们使用线程的时候一般是继承QThread类 xff0c 实现它的run 函数 xff0c 将需要在线程中执行的代码放在run 里进行执行 需要注意的事项 xff1a 如果是while循环 xff
  • 通过UltraEdit(UE)转化\r\n(回车换行)与\n(换行)

    r n 回车换行 是window上的换行符 xff0c n 换行 是linux上的换行符 xff0c 下面介绍通过UltraEdit UE 在windows上实现相互转化 1 r n 回车换行 转化为 n 换行 用UE打开对应的文本文件 x
  • Android多媒体篇

    多媒体接口和娱乐 游戏等业务密切相关 xff0c 灵活地采用多媒体接口 xff0c 可以使应用具备更强的吸引力 1 音频处理 作为多媒体处理的最基本的组成部分 xff0c 音频处理在移动终端上十分复杂 音频的播放 记录 以及多种场景 xff
  • Java基础教程

    一 Java语法 1 java主要特性 Java语言是简单的 xff1a Java语言的语法与C语言和C 43 43 语言很接近 xff0c 使得大多数程序员很容易学习和使用 另一方面 xff0c Java丢弃了C 43 43 中很少使用的
  • JSP基础教程

    xfeff xfeff JSP技术是以Java语言作为脚本语言的 xff0c JSP网页为整个服务器端的Java库单元提供了一个接口来服务于HTTP的应用程序 1 Java简介 1 xff09 为什么使用JSP xff1f JSP程序与CG
  • 系统设计概论

    1 分层系统软件体系结构 1 xff09 简介 层次系统风格将对软件结构组织成一个层次结构 xff0c 一个分层系统组织的 xff0c 每层对上层提供服务 xff0c 同时对下层来讲也是一个服务的对象 在一些分层系统中 xff0c 内部的层
  • python监控windows的cpu,内存,磁盘

    span class hljs comment user bin env python3 span span class hljs comment coding utf 8 span span class hljs keyword impo
  • Java问题_直接运行jar文件,系统没有反应

    问题 xff1a 直接运行jar文件 xff0c 系统没有反应 问题分析 xff1a 我比较好奇为什么安装了Java就可以直接运行 jar文件 https blog csdn net walkingmanc article details
  • 虚拟机安装archlinux的简单步骤

    这篇文章是我在虚拟机安装archlinux之后的一点心得 xff0c 参考了archwiki关于安装arch的一些内容https wiki archlinux org index php Beginners 27 guide 准备工作 选择
  • 服务器远程连接经常连接不上的解决方法

    我们大家在使用服务器的时候或多或少都会有碰上服务器突然远程不上的情况这边给大家分享的服务器远程不上解决办法 xff01 第一步 xff1a 机器如果不通看下是不是被牵引或者内网牵引 xff0c 打开kvm查看系统是否正常运行 1 远程端口通
  • webservice的基础知识以及入门案例1

    一 webService 1 1 webservcie webservice是一种跨操作系统和跨语言的数据调用 数据交换的一种服务技术 用于网络通信 xff0c 多台机器之间的数据交互 最大优点 xff1a webservice最大的好处是