前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java小白翻身 - webservice教程4

Java小白翻身 - webservice教程4

作者头像
剽悍一小兔
发布于 2021-07-20 02:21:57
发布于 2021-07-20 02:21:57
48210
代码可运行
举报
运行总次数:0
代码可运行

之前都是需要根据发布的ws服务生成wsdl和客户端代码,其中不生成也可以动态调用。

步骤 1 LoginServiceImpl

现在,在LoginService的实现类中添加一个方法:getUser

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
public User getUser(String username, String password) {
    return new User(username,password);
}

User

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.example.server.bean;

public class User {

    private String username;
    private String password;

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

步骤 2 动态调用的例子

我们不需要生成wsdl和那一堆文件,直接通过ws接口地址,也可以去调用getUser方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//创建动态客户端
JaxWsDynamicClientFactory factory = JaxWsDynamicClientFactory.newInstance();
Client client = factory.createClient("http://localhost:8080/webservice/api?wsdl");
// 需要密码的情况需要加上用户名和密码
//client.getOutInterceptors().add(new ClientLoginInterceptor(USER_NAME,PASS_WORD));
HTTPConduit conduit = (HTTPConduit) client.getConduit();
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
httpClientPolicy.setConnectionTimeout(2000);  //连接超时
httpClientPolicy.setAllowChunking(false);    //取消块编码
httpClientPolicy.setReceiveTimeout(120000);     //响应超时
conduit.setClient(httpClientPolicy);
//client.getOutInterceptors().addAll(interceptors);//设置拦截器
try{
    Object[] objects = new Object[0];
    // invoke("方法名",参数1,参数2,参数3....);
    objects = client.invoke("getUser","jack","123");

    Method[] methods = objects[0].getClass().getMethods();
    for (int i = 0; i < methods.length; i++) {
        System.out.println(methods[i].getName());
        Object invoke = methods[i].invoke(objects[0]);
        System.out.println(invoke);
    }

}catch (Exception e){
    e.printStackTrace();
}

因为没有描述文件,所以你需要花费很大的代价去动态解析,说实话,还不如用上一节的方法呢,省心!

所以,站长个人是不推荐这种写法的。

步骤 3 一个动态解析Map对象的例子

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static void main(String[] args) throws Exception {
    //创建动态客户端
    JaxWsDynamicClientFactory factory = JaxWsDynamicClientFactory.newInstance();
    Client client = factory.createClient("http://localhost:8080/webservice/loginApi?wsdl");

    HTTPConduit conduit = (HTTPConduit) client.getConduit();
    HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
    httpClientPolicy.setConnectionTimeout(2000);  //连接超时
    httpClientPolicy.setAllowChunking(false);    //取消块编码
    httpClientPolicy.setReceiveTimeout(120000);     //响应超时
    conduit.setClient(httpClientPolicy);

    Object[] objects = client.invoke("userLogin");

    if(objects != null && objects.length > 0){
        Method[] methods = objects[0].getClass().getMethods();
        for (int i = 0; i < methods.length; i++) {
            //System.out.println(methods[i].getName());

            if(methods[i].getName().equals("getEntry")){
                Object entry = methods[i].invoke(objects[0]); //实际上是 UserLoginResponse.Return.Entry
                Method iteratorMethod = entry.getClass().getMethod("iterator");

                //反射调用迭代方法
                Object iteratorBean = iteratorMethod.invoke(entry);

                Method hasNextMethod = iteratorBean.getClass().getMethod("hasNext");
                hasNextMethod.setAccessible(true);

                while(Boolean.parseBoolean(hasNextMethod.invoke(iteratorBean).toString()) == true){
                    Method nextMethod = iteratorBean.getClass().getMethod("next");
                    nextMethod.setAccessible(true);
                    Object entryBean = nextMethod.invoke(iteratorBean);
                    Method getKeyMethod = entryBean.getClass().getMethod("getKey");
                    Method getValueMethod = entryBean.getClass().getMethod("getValue");
                    Object value = getValueMethod.invoke(entryBean);
                    value = new String(value.toString().getBytes("GBK"), "UTF-8");

                    System.out.println(getKeyMethod.invoke(entryBean) + "=" +  value);
                }

            }

        }
    }

}

经过几番测试,这种动态获取的总是有中文乱码的问题,好像接口被编译的时候是用GBK编译的(windows自带的编码,所以linux就没有这个问题)。

所以,只好通过代码手工转换一下。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
、ONLYOFFICE ONLYOFFICE是一家来自欧洲拉脱维亚的Ascensio System SIA公司研发的一款高端办公软件,它除了在线文本文档编辑,在线多人协作,和高端美化的电子表格外,同时还具有免费在线文件转换功能,下面给大家详细介绍一下。亮点介绍永久免费 ; 这款软件在线便捷转换文件的功能是完全免费的,没有任何套路捆绑的附加费用。无广告模式; ONLYOFFICE使用起来非常干净清爽,没有任何商业广告,内置广告,捆绑广告。使用方式便捷;在线使用PDF文件转换无需登录,无需注册,打开官网点击PDF转换器就可以在线做到文件转换,同时可以做
、ONLYOFFICE ONLYOFFICE是一家来自欧洲拉脱维亚的Ascensio System SIA公司研发的一款高端办公软件,它除了在线文本文档编辑,在线多人协作,和高端美化的电子表格外,同时还具有免费在线文件转换功能,下面给大家详细介绍一下。亮点介绍永久免费 ; 这款软件在线便捷转换文件的功能是完全免费的,没有任何套路捆绑的附加费用。无广告模式; ONLYOFFICE使用起来非常干净清爽,没有任何商业广告,内置广告,捆绑广告。使用方式便捷;在线使用PDF文件转换无需登录,无需注册,打开官网点击PDF转换器就可以在线做到文件转换,同时可以做
回复回复1举报
推荐阅读
编辑精选文章
换一批
Springboot调用wsdl的webservice接口两种不常用方式
import javax.xml.namespace.QName; import javax.xml.rpc.ParameterMode; import org.apache.axis.client.Call; import org.apache.axis.client.Service; import org.apache.axis.encoding.XMLType; import org.apache.cxf.endpoint.Client; import org.apache.cxf.jaxws.en
JQ实验室
2022/02/10
1.6K0
WebService客户端调用的5种常见方式
到此一个简单的webservice服务端项目就搭建完成了,这里我在application.properties文件中把端口改成8081:
科技新语
2024/11/21
5540
WebService客户端调用的5种常见方式
开发:随笔记录之 CXF 动态调用Webservice
import javax.xml.rpc.ServiceException; import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory; import org.apache.log4j.Logger;
执笔记忆的空白
2020/12/25
1.1K0
springboot调用webservice接口的两种方式,不使用axis
public String sendXml(String xml) { // 创建动态客户端 JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance(); Client client = dcf.createClient(System.getProperty("wsdl.url")); // 需要密码的情况需要加上用户名和密码 // clien
JQ实验室
2022/02/10
1.8K0
Spring Boot创建和调用WebService接口
“ 使用Spring Boot调用WebService接口是一个项目上的一个需求,甲方要求我们做一个对外的在线测评页面,但是我们公司的产品是在内网下,所以甲方提供一台服务器将一个端口映射到外网,由于仅仅是一个在线测评的功能所以尽可能高效的开发出来,于是Spring Boot便有用武之地了”
每天学Java
2020/06/02
16.9K2
WebService: SpringBoot集成WebService实践二
该篇为上一篇的延伸,上一篇知识简单介绍了WebService 的使用,该篇会对代码中模块及功能进行详细介绍,以作对WebService 进一步的理解。
Freedom123
2024/03/29
6000
WebService: SpringBoot集成WebService实践二
JAVA基础漏洞是如何自我修炼
众所周知,气是修炼的基础即反射是java的其中的一个高级特性。正是因为反射的特性引出了后续的动态代理,AOP,RMI,EJB等功能及技术,在后续再来说下代理,RMI等及其漏洞原理吧,在之前先来看看反射所有的原理及漏洞,那么,在修炼初期应该注意什么问题呢?
谢公子
2022/01/20
2930
JAVA基础漏洞是如何自我修炼
从0.5到1写个rpc框架 - 7:网关支持(gateway)
这个demo作为一个子模块(acuprpc-spring-boot-starter-gateway)加入了框架的全家桶,直接引入依赖就能使用这个功能。
acupt
2019/08/26
1.1K0
从0.5到1写个rpc框架 - 7:网关支持(gateway)
Java注解是如何玩转的,面试官和我聊了半个小时
小白:自定义注解后,需要定义这个注解的注解解析及处理器,在这个注解解析及处理器的内部,通过反射使用Class、Method、Field对象的getAnnotation()方法可以获取各自位置上的注解信息,进而完成注解所需要的行为,例如给属性赋值、查找依赖的对象实例等。
JavaQ
2020/03/26
8690
关于Java的反射机制,你需要理解这些..
反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
方志朋
2017/12/29
5800
Java反射机制深度剖析
Java反射机制是Java语言中一种很重要的机制,可能在工作中用到的机会不多,但是在很多框架中都有用到这种机制。我们知道Java是一门静态语言,在程序编译时变量的数据类型都已经确定,那么在Java运行时环境中,对于任意一个类,我们能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答案是肯定的。这种动态获取类的信息以及动态调用对象的方法的功能来自于Java的反射机制(Reflection)。
烂猪皮
2020/11/02
3420
Java反射机制深度剖析
Webservice实现与调用(基于spring的多种方式)
一、Webservice实现 实现方式分类 1. spring实现 bean配置 123 <bean class="org.springframework.remoting.jaxws.SimpleJaxWsServiceExporter"> <property name="baseAddress" value="http://localhost:8088/"/> </bean> service 12345678910 @Component @WebService(service
XING辋
2019/03/26
2.1K0
《Java-SE-第三十七章》之反射
Java的反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性,既然都可以拿到,我们就可以修改类型信息;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
用户10517932
2023/10/07
1630
《Java-SE-第三十七章》之反射
夯实Java基础系列12:深入理解Java中的反射机制
反射(Reflection)是Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性。Oracle官方对反射的解释是
Java技术江湖
2019/10/15
5540
Java反射机制详解
该文章介绍了如何通过反射机制在Java中获取类的元数据信息,包括类名、构造函数、成员变量以及方法。同时,文章还介绍了反射机制在实际开发中的应用场景,例如在Web后端开发中,通过反射机制动态加载Java类,实现灵活的业务扩展。反射机制虽然功能强大,但是也有一定的性能开销,因此在实际开发中应该谨慎使用。
Java后端工程师
2017/12/19
1.5K0
java调用webservice接口的几种方法
前几天看到群里有人问webservice,稍微总结一下! webservice的 发布一般都是使用WSDL(web service descriptive language)文件的样式来发布的,在WSDL文件里面,包含这个webservice暴露在外面可供使用的接口。今天搜索到了非常好的 webservice provider列表 http://www.webservicex.net/WCF/default.aspx 这上面列出了70多个包括很多方面的free webservice provider,uti
三哥
2018/06/15
38.6K1
Apache CXF实现WebService发布和调用
第一种方法:不用导入cxf jars 服务端: 1、 新建Web工程 2、新建接口和实现类、测试类 目录结构图如下: 接口代码: package com.cxf.spring.service; import javax.jws.WebMethod; import javax.jws.WebService; @WebService public interface IGreetingService { @WebMethod public String greeting(String
JQ实验室
2022/02/09
8640
Apache CXF实现WebService发布和调用
Springboot集成Web service接口服务
  1)、XML+XSD:WebService采用HTTP协议传输数据,采用XML格式封装数据(即XML中说明调用远程服务对象的哪个方法,传递的参数是什么,以及服务对象的 返回结果是什么)。XML是WebService平台中表示数据的格式。除了易于建立和易于分析外,XML主要的优点在于它既是平台无关的,又是厂商无关 的。无关性是比技术优越性更重要的:软件厂商是不会选择一个由竞争对手所发明的技术的。
别先生
2020/12/01
3K0
Springboot集成Web service接口服务
web项目使用cxf+spring搭建WebService,并部署到远程
说明服务发布成功,访问该项目http://localhost:8080/CXFWebservice/webservice
故久
2020/06/04
6330
JaxWsProxyFactoryBean调用WebService实例[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/162672.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/13
2.2K0
推荐阅读
相关推荐
Springboot调用wsdl的webservice接口两种不常用方式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验