XFire客户端编程实现方式和及AJAX调用方法

2024-02-05 14:48

本文主要是介绍XFire客户端编程实现方式和及AJAX调用方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

1. 客户端拥有Web服务端的class字节码文件

条件:能拿到服务端提供的接口Class,包括启用代理模式的应用

private static void initWebServiceClient() {//Service srModel = new ObjectServiceFactory().create(TestDAOService.class);Service serviceModel = new ObjectServiceFactory().create(IHelloService.class);XFireProxyFactory factory = new XFireProxyFactory(XFireFactory.newInstance().getXFire());ResourceBundle rb = ResourceBundle.getBundle("com/sonyon/properties/config");//String endPoint = "http://80.80.100.186:80/xfire/services/IHelloService";String endPoint = rb.getString("service");boolean enableProxy = Boolean.valueOf(rb.getString("enableproxy")).booleanValue();String proxyAddress = rb.getString("proxyhost");String proxyPort = rb.getString("proxyport");try {//启用代理if(enableProxy){service = (IHelloService) factory.create(serviceModel,endPoint);//Client client = new Client(serviceModel,endPoint);Client client = Client.getInstance(service);//禁用默认代理Util类client.setProperty(CommonsHttpMessageSender.DISABLE_PROXY_UTILS,"true");client.setProperty(CommonsHttpMessageSender.DISABLE_KEEP_ALIVE,"true");//禁用100-continue协议client.setProperty(CommonsHttpMessageSender.DISABLE_EXPECT_CONTINUE,"true");client.setProperty(CommonsHttpMessageSender.HTTP_PROXY_HOST,proxyAddress);client.setProperty(CommonsHttpMessageSender.HTTP_PROXY_PORT,proxyPort);//client.setProperty(HttpTransport.CHUNKING_ENABLED,"true");} else {//service = (IHelloService) factory.create(serviceModel,endPoint);service = (IHelloService) factory.create(serviceModel,endPoint);//Client client = new Client(serviceModel,endPoint);Client client =  Client.getInstance(service);//禁用默认代理Util类client.setProperty(CommonsHttpMessageSender.DISABLE_PROXY_UTILS,"true");client.setProperty(CommonsHttpMessageSender.DISABLE_KEEP_ALIVE,"true");//禁用100-continue协议client.setProperty(CommonsHttpMessageSender.DISABLE_EXPECT_CONTINUE,"true");//client.setProperty(HttpTransport.CHUNKING_ENABLED,"true");}/*URL testurl = new URL(testwsdl);HttpURLConnection httpConnection = (HttpURLConnection)testurl.openConnection();  httpConnection.setReadTimeout(20000);//设置http连接的读超时,单位是毫秒  httpConnection.connect();Client testClient = new Client(httpConnection.getInputStream(), null);//Client testClient = new Client(new URL(testwsdl));if(enableProxy){testClient.setProperty(CommonsHttpMessageSender.DISABLE_PROXY_UTILS,"true");testClient.setProperty(CommonsHttpMessageSender.HTTP_PROXY_HOST,"10.60.1.33");testClient.setProperty(CommonsHttpMessageSender.HTTP_PROXY_PORT,"808");}*/String result = service.sayHi("test");logger.info("WebService测试程序返回字符串为:" + result);//Object[] results = testClient.invoke("getName",new Object[] {});if(result != null){logger.info("--------------WebService client Create and Test success----------------------------");} else {logger.warn("--------------WebService client Create success But Test failure---------------------");}} catch (Exception e) {logger.warn("WebService客户端连接服务器失败,请检查WebService服务器参数或网络连接!",e);}}// JSR181模式,注意这里Server端开发组需要向Client提供实现类,而不止于//接口,有点危险
Service srvcModel = new AnnotationServiceFactory().create(HelloServiceImpl.class);
XFireProxyFactory factory = new XFireProxyFactory(XFireFactory.newInstance().getXFire());
String helloWorldURL = "http://localhost:8080/webservice/services/Hello";
Hello hello = (Hello) factory.create(srvcModel,helloWorldURL);
System.out.println(hello.sayHi("test"));

 

2、 动态模式,不生成字节码,直接调用

动态模式不需要服务端的class,不过性能和复杂对象映射等估计做得不会太好。

Client client = new Client(new URL("http://localhost:8080/webservice/services/Hellowsdl"));
Object[] results = client.invoke("sayHello", new Object[] { "Cao," });
System.out.println((String) results[0]);

3、 通过开发工具、根据WSDL生成Client Stub 

   注:来源于网络仅作参考

//简单参数的HelloClient client=new HelloClient();HelloPortType port =client.getHelloHttpPort();System.out.println(port.sayHello("hi!"));//参数复杂的MemberServiceClient client = new MemberServiceClient();MemberService memberService = client.getMemberServiceHttpPort();User user = new User();/*JAXBElement<String> name = new JAXBElement<String>(new QName("http://memberService", "username"), String.class, "smallnest");JAXBElement<String> password = new JAXBElement<String>(new QName("http://memberService", "password"), String.class, "123456");*/ObjectFactory objFac=new ObjectFactory();JAXBElement<String> name = objFac.createUserUsername("smallnest");JAXBElement<String> password = objFac.createUserPassword("123456");user.setUsername(name);user.setPassword(password);Member oneMember = new Member();JAXBElement<String> memeberName = new JAXBElement<String>(new QName("http://memberService", "name"), String.class, "迈克");JAXBElement<String> email= new JAXBElement<String(newQName("http://memberService","email"), String.class,"micro@micro.com");
oneMember.setName(memeberName);
oneMember.setEmail(email);
oneMember.setRank(6);
// 调用方法memberService.addMember(oneMember, user);

4、通过Ajax调用(js+XML)

(1、)

写一个页面,发送Ajax请求,请求的URL即服务的地址,请求方式是POST,另外,还需要设置请求头,以及手动构造请求体。


<head><title>通过ajax调用webservice服务</title>
<script>
var xhr;
function sendAjaxWS(){xhr = new ActiveXObject("Microsoft.XMLHTTP");                 //指定ws的请求地址var wsUrl = "http://192.168.1.108:5678/hello";//手动构造请求体var requestBody = '<soapenv:Envelope             xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" ' + '         xmlns:q0="http://service.itcast.cn/" xmlns:xsd="http://www.w3.org/2001/XMLSchema "'+
' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">'+'<soapenv:Body><q0:sayHello><arg0>'+
document.getElementById("msg").value+'</arg0> <arg1>10</arg1> </q0:sayHello></soapenv:Body></soapenv:Envelope>';
//打开连接
xhr.open("POST",wsUrl,true);
//重新设置请求头
xhr.setRequestHeader("content-type","text/xml;charset=utf8");
//设置回调函数
xhr.onreadystatechange = _back;
//发送请求
xhr.send(requestBody);
}//定义回调函数function _back(){if(xhr.readyState == 4){if(xhr.status == 200){var ret = xhr.responseXML;//解析xmlvar eles = ret.getElementsByTagName("return")[0];alert(eles.text);}}}</script>
</head>
<body><input type="text" id="msg" /><input type="button" onclick="sendAjaxWS();" value="通过ajax调用webservice服务"/>
</body>

由于使用ajax – js调用web服务完成不同于使用java代码调用。所以,必须要对SOAP文件非常的了解。

一般使用ajax调用,应该是在已经获知了以下信息以后才去调用:

获知请求(request)的soap文本。

获知响应(response)的soap文本。

请求文件和响应文本格式,一般会随web服务的发布一同发布。

我们可以通过WSExplorer获取上面两段文本。

5、 通过URLConnection调用

         1,指定WebService服务的请求地址:

        String wsUrl = "http:// 124.205.244.130:5678/hello";

     2,创建URL:URL url = new URL(wsUrl);

       3,建立连接,并将连接强转为Http连接

URLConnection conn = url.openConnection();

          HttpURLConnection con = (HttpURLConnection) conn;

       4,设置请求方式和请求头:

          con.setDoInput(true);                  //是否有入参

          con.setDoOutput(true);                //是否有出参

          con.setRequestMethod("POST");   // 设置请求方式

          con.setRequestProperty("content-type", "text/xml;charset=UTF-8");

      5,// 手动构造请求体

               String requestBody = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" "

                         + " xmlns:q0=\"http://service.itcast.cn/\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema \" "

                         + " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">"

                         + "<soapenv:Body><q0:sayHello><arg0>lisi</arg0> <arg1>10</arg1> </q0:sayHello></soapenv:Body></soapenv:Envelope>";

   6,通过流的方式将请求体发送出去:

         //获得输出流

         OutputStream out = con.getOutputStream();

         out.write(requestBody.getBytes());

         out.close();

    7,服务端返回正常:

   int code = con.getResponseCode();

       if(code == 200){//服务端返回正常

         InputStream is = con.getInputStream();

         byte[] b = new byte[1024];

         StringBuffer sb = new StringBuffer();

         int len = 0;

         while((len = is.read(b)) != -1){

             String str = new String(b,0,len,"UTF-8");

             sb.append(str);

        }

        System.out.println(sb.toString());

        is.close();

       }

       con.disconnect();

}

说明:整合两篇文章的特点,把client编程和交互模式做一个统一

参考:

1、http://www.cnblogs.com/yolanda-lee/p/4907380.html#3916174

2、https://blog.csdn.net/javalearning1014/article/details/2667974

这篇关于XFire客户端编程实现方式和及AJAX调用方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/681254

相关文章

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

内核启动时减少log的方式

内核引导选项 内核引导选项大体上可以分为两类:一类与设备无关、另一类与设备有关。与设备有关的引导选项多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导选项。比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导选项,那么就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导选项说明。大多数选项是通过"_

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount