WebService通过HTTP协议完成远程调用: (深入分析)

WebService只采用HTTP POST方式传输数据,不使用GET方式;  -- 握手,WSDL-get,
普通http post的contentType为
application/x-www-form-urlencoded
WebService的contentType为-即在Http的基础上发SOAP协议
text/xml 这是基于soap1.1协议。
application/soap+xml 这是基于soap1.2协议。 WebService从数据传输格式上作了限定。WebService所使用的数据均是基于XML格式的。目前标准的WebService在数据格式上主要采用SOAP协议。SOAP协议实际上就是一种基于XML编码规范的文本协议。 SOAP – Simple Object Access protocol 简单对像访问协议。是运行在HTTP协议基础之上的协议。其实就是在HTTP协议是传输XML文件,就变成了SOAP协议。 SOAP1.1和SOAP1.2的 namespace不一样。可以通过查看类
javax.xml.ws.soap.SOAPBinding来查看里面的常量
默认情况下,Jdk1.6只支持soap1.1
即:@BindingType(value=javax.xml.ws.soap.SOAPBinding.SOAP11HTTP_BINDING)
WebService和Web服务器的区别:

WebService和Web服务器有什么区别呢?我们可以把WebService看作是Web服务器上应用;反过来说,Web服务器是WebService运行时所必需的容器。这就是它们的区别和联系。

使用JDK1.6发布的简单Web服务,其内部其实是使用Socket实现。可以查看:SUN公司未对外公布的API类com.sun.xml.internal.ws.transport.http.server. ServerMgr获知,请使用反编译工具。

WebService的特点
WebService通过HTTP POST方式接受客户的请求
WebService与客户端之间一般使用SOAP协议传输XML数据.
它本身就是为了跨平台或跨语言而设计的。

WebService的方式:

l通过客户端编程的方式调用
l通过ajax调用js+XML 

通过URLConnection调用

一、Ajax调用获取所有用户:

 <html>
<body>
<button id="btn" onclick="getUsers();">获取所有用户</button>
</body>
<script language="javascript">
var xhr = null;
function getUsers(){
var url = "http://localhost:9999/user";//声明完整的url
//以下声明soap文本
var soap = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" '+
'xmlns:q0="http://ws2.itcast.cn/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" '+
'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">'+
'<soapenv:Body><q0:users/></soapenv:Body></soapenv:Envelope>';
xhr.open("POST",url,true);
xhr.onreadystatechange=back;//以下设置请求头
xhr.setRequestHeader("Content-Type","text/xml;charset=UTF-8");
xhr.send(soap);//发送xml请求
}
function back(){
if(xhr.readyState==4){
if(xhr.status==200){
var xml = xhr.responseXML;//获取返回的xml文本并解析
var returns = xml.getElementsByTagName("return");
for(var i=0;i<returns.length;i++){
//var nm = returns[i].firstChild.text;//两种方式都可以
var nm = returns[i].getElementsByTagName("name")[0].text;
alert(nm);
}
}
}
}
//创建xhr对象,在IE上
function init(){
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
init();
</script>
</html>

二、客户端通过编程的方式访问服务:

使用javax.xml.ws.Service类用于访问web服务。
关键类Service
方法create – 用户创建Service对像,提供wsdlurl和服务名。
getPort-用于通过指定namespace,portName和接口的范型。
在客户端需要一个与服务器接口完全相同的类。(仍然使用工具生成。但只需要一个接口。并需要简单修改。如果返回的是复杂数据类型如POJO,还需要将POJO一并放到项目中)-不要试图通过-p来修改包名,会出错的。
关键类QName – 被称为完全限定名即:Qualified Name的缩写。
QName 的值包含名称空间 URI、本地部分和前缀。
1、以下是调用代码(以下代码仅供参考)
package com.itcast;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import com.leaf.mynamespace.MyName;
public class ClientTest {
public static void main(String[] args) throws Exception {
//create的第一个参数为一个URL对像,接收wsdl的地址信息
//QName的参数:1:
Service service =
Service.create(new URL("http://localhost:6666/helloworld?wsdl"),
new QName("http://leaf.com/mynamespace","myService"));
System.err.println(service);
//以下获取接口名
MyName o = service.getPort(
new javax.xml.namespace.QName("http://leaf.com/mynamespace","myPort"),
MyName.class);
System.err.println(o.mySayHiOperationName("中国北京"));
}
}

三、客户端编程-用的不是很多:

package cn;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import cn.wj.One;
public class Test {
public static void main(String[] args) throws Exception {
//声明wsdl地址
URL u = new URL("http://localhost:9999/one?wsdl");
//获取命名空间
String ns = "http://wj.cn";
//第二个参数是一个完全限定名,WjService是服务名
Service service = Service.create(u,new QName(ns,"WjService"));
//通过service的getPort方法返回指定的接口
One one = service.getPort(new QName(ns,"one"),One.class);
//调用sayHello方法
String ss = one.sayHello("DDDD");
System.err.println(ss);
}
}

最新文章

  1. SpringMvc的简单介绍
  2. 6.如何使用官方提供的nuget包实现cookie登陆
  3. RunLoop的深入了解
  4. Windows CMD下一些有用的命令
  5. C#与MATLAB混合编程
  6. list如何remove 特别容易出错
  7. 深度学习框架Caffe —— Deep learning in Practice
  8. AB PLC与西门子S7-1200以太网通信
  9. Centos 7 telnet 详解
  10. Codeforces 1045E. Ancient civilizations 构造 计算几何 凸包
  11. 022_applescript快速入门教程
  12. mac os系统go安装:go install github.com/nsf/gocode: open /usr/local/go/bin/gocode: permission denied
  13. 委托到Lambda的进化: ()=&gt; {} 这个lambda表达式就是一个无参数的委托及具体方法的组合体。
  14. mybatis的update使用选择
  15. C#中的命名空间namespace与Java中的包package之间的区别
  16. dev右下角增加弹框提示信息
  17. ajax在php中应用实例
  18. Windows安装MySQL教程
  19. Hive-开启动态分区
  20. 46.VUE学习之--组件之使用动态组件灵活设置页面布局

热门文章

  1. HDU-2095-find your present (2)-位或/STL(set)
  2. day 84 Vue学习六之axios、vuex、脚手架中组件传值
  3. php array_unshift,array_push追加数组元素
  4. vue项目实现按需加载的3种方式
  5. netty 解决粘包拆包问题
  6. 记录:使用springboot的cors和vue的axios进行跨域
  7. Python全栈开发:生成随机数
  8. opensuse 通过composer安装drush工具
  9. csps模拟67神炎皇,降雷皇,幻魔皇题解
  10. php多维数组