一、服务器端代码

新建一个web Service Project工程(貌似普通的java工程也可以,这里不太明白各种webService的框架有什么区别),建立如下的类:

package com.bobo.server;

import javax.jws.WebService;
import javax.xml.ws.Endpoint; @WebService
public class HelloServer {
public static void main(String[] args) {
Endpoint.publish("http://localhost:9001/hello", new HelloServer());
System.out.println("server is ready!");
} public String sayHello(String name){
return "hello,"+name; }
}

webService服务器端代码

这里需要注意以下几点:

1)@WebService注释必不可少,其作用在于将类或者接口标注为用于实现WebService的类或者接口

2)EndPoint发布完成后,将会用独立的线程运行,因此main中的方法依旧可以执行

3)@WebService,@WebMethod等注释,可以设置wsdl中的server名称,服务提供的方法名称,参数名称,以及方法是否对外发布等

4)服务器端的发布地址后加上?wsdl即可以访问服务的wsdl文件,这是一个WebService的接口描述文件,客户端只需要读懂该文件,就可以知道相关的服务如何调用,相关服务方法的参数,参数类型,返回值类型各是什么(从下往上找)

二、调用WebService的四种方法

这里以获取电话号码归属地的公共服务为例,举例说明调用WebService的多种方法

服务器端的描述参见:

http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx?WSDL

方法一、wsimport生成客户端代码的方式

和java,javac等命令一样,wsimport是jdk自带的一种方法,将jdk的bin目录加入环境变量后,可以在命令行直接执行

wsimport -s [要生成客户端代码的存储路径] -p [要生成客户端代码的包名,如果不指定,那么默认和服务器端的报名相同],如下所示:

wsimport -s E:\\workspace\\myeclipse_workspace\\TheClient\\src -p com.bobo.client -keep [wsdl的地址]

在命令行运行该命令之后,会发现对应的目录下生成了一系列的类文件,这些类文件封装了soap通信协议相关实现方法(soap底层还是http协议,只不过要求发送的请求体的格式必须是xml格式,并对xml中各个字段的写法进行了一系列的规定);

客户端调用服务端代码的实现类如下:

package com.bobo.test;
import com.bobo.client.*; public class WsimportTest { /**
* @param args
*/
public static void main(String[] args) { MobileCodeWSSoap soap=new MobileCodeWS().getMobileCodeWSSoap();
String result=soap.getMobileCodeInfo("", null);
System.out.println(result); } }

Wsimport实现的客户端代码

方法二、ajax请求

鉴于上述手机号码归属地的webService同时也支持get和post,因此把get,post以及soap集中方法都记录在此,上述方法在IE11浏览器中均能正常运行,可是在chrome中则不行;此外jquery的ajax方法发送soap正常运行,但使用原生js则返回415码,也不清楚为什么

关于上述问题的一些想法:前端发送ajax请求到后台,可能会出现跨域情况,

关于跨域,需要注意以下几点:

1)当前端发送ajax请求的主机和后台提供服务的主机不是同一台的时候,如sina.com——>baidu.com的时候,会出现跨域

2)如果前端请求本机的服务,本机有两种表示localhost和ip地址,当两种表示不一样的时候,也会出现跨域,如localhost——>192.168.x.x

3)跨域只有前端发送请求的情况下才可能出现,如果是后台,如java代码发送请求,是不会出现跨域的。

/*调用服务的get方法*/
function getResultByGet(){
$.ajax({
type:'GET',
dataType:'xml',
url:'http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo?mobileCode=18146531996&userID=',
success:function(data){
alert($(data).find("string").text());
}
});
}

get方式请求接口

/*调用服务的post方法*/
function getResultByPost(){
//alert("post");
$.ajax({
type:'POST',
dataType:'xml',
url:'http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo',
data:{"mobileCode":"","userID":null},
success:function(data){
alert($(data).find("string").text());
}
});
}

post方式请求接口

$(function(){

var soapData='<?xml version="1.0" encoding="utf-8"?>'+
'<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">'+
' <soap:Body>'+
'<getMobileCodeInfo xmlns="http://WebXml.com.cn/">'+
'<mobileCode>18146531996</mobileCode>'+
'<userID></userID>'+
'</getMobileCodeInfo>'+
'</soap:Body>'+
'</soap:Envelope>';
getResultByGet();
//getResultByPost();
//getResultByJqueryAjax(soapData);
//getResultByRawJS(soapData);
}); /*遵从soap协议,利用jquery*/
function getResultByJqueryAjax(soapData){
alert("soap");
$.ajax({
url:'http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx',
type:'POST',
//content-type:'text/xml;charset=UTF-8',
dataType:'xml',
data:soapData,
beforeSend:function(XmlHttpRequest){
//下面这句soapAction的设定貌似可有可无,但是Content-Type是必须的
XmlHttpRequest.setRequestHeader("SOAPAction","http://WebXml.com.cn/getMobileCodeInfo");
XmlHttpRequest.setRequestHeader("Content-Type","text/xml;charset=utf-8");
},
success:function(data){
alert($(data).find("getMobileCodeInfoResult").text());
} }); }

soap形式,利用jquery发送ajax请求

/*遵从soap协议,利用原始js*/
function getResultByRawJS(soapData){
alert("getResultByRawJS");
var xhr;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xhr=new XMLHttpRequest();
} else
{// code for IE6, IE5
xhr=new ActiveXObject("Microsoft.XMLHTTP");
}
//使用原生的js试一下
//var xhr=new XMLHttpRequest();
var url='http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx';
xhr.open('POST',url,true);
xhr.setRequestHeader("Content-Type","text-xml;charset=utf-8");
xhr.setRequestHeader("SOAPAction","http://WebXml.com.cn/getMobileCodeInfo");
xhr.send(soapData);
xhr.onreadystatechange=_back; function _back(){
if(xhr.readyState==){
if(xhr.status==){
alert("xhr.responseText:"+xhr.responseText);
} } };
}

soap方式,利用js发送ajax请求

方法三、urlConnection请求

package com.bobo.test;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection; public class UrlConnectionTest { public static void main(String[] args) throws Exception { String data="<?xml version=\"1.0\" encoding=\"utf-8\"?>"+
"<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"+
" <soap:Body>"+
" <getMobileCodeInfo xmlns=\"http://WebXml.com.cn/\">"+
" <mobileCode>18146531996</mobileCode>"+
"<userID></userID>"+
" </getMobileCodeInfo>"+
" </soap:Body>"+
"</soap:Envelope>";
String result=sendPost("http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx",data);
System.out.println(result); }
private static String sendPost(String url,String data) throws Exception{
StringBuilder result=new StringBuilder();
URL realUrl=new URL(url);
URLConnection connection=realUrl.openConnection();
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
connection.setRequestProperty("SOAPAction", "http://WebXml.com.cn/getMobileCodeInfo");
PrintWriter writer=new PrintWriter(connection.getOutputStream());
writer.write(data);
writer.flush();
writer.close(); BufferedReader reader=new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line="";
while((line=reader.readLine())!=null){
result.append(line);
}
return result.toString();
}
}

UrlConnection请求WebService

方法四、request请求

webService调用的N种方式的更多相关文章

  1. webservice调用的四种方式

    因为数据在网络上传输都是通过xml形式的,本质都是把数据封装然后通过xml传输,接收到的也是xml文件,1 和 4 让程序员屏蔽了处理xml文件,而2 和3需要程序员自己写请求体 ,还要处理返回的xm ...

  2. Axis2开发WebService客户端 的3种方式

    Axis2开发WebService客户端 的3种方式 在dos命令下   wsdl2java        -uri    wsdl的地址(网络上或者本地)   -p  com.whir.ezoffi ...

  3. DLL调用的两种方式(IDE:VC6.0,C++)

    原文:http://www.cnblogs.com/Pickuper/articles/2050409.html DLL调用有两种方式,一种是静态调用,另外一种是动态调用 (一)静态调用 静态调用是一 ...

  4. python 模块调用的几种方式

    在python里面又很多模块,或者引用第三方模块,python 模块调用的几种方式,下面详细解说 1,import 模块名 2,from 模块 import  模块里面的小功能 3,from  模块 ...

  5. 【Java EE 学习 80 下】【调用WebService服务的四种方式】【WebService中的注解】

    不考虑第三方框架,如果只使用JDK提供的API,那么可以使用三种方式调用WebService服务:另外还可以使用Ajax调用WebService服务. 预备工作:开启WebService服务,使用jd ...

  6. 动态调用WebService接口的几种方式

    一.什么是WebService? 这里就不再赘述了,想要了解的====>传送门 二.为什么要动态调用WebService接口? 一般在C#开发中调用webService服务中的接口都是通过引用过 ...

  7. Java调用.NET webservice方法的几种方式

    最近做项目,涉及到web-service调用,现学了一个星期,现简单的做一个小结.下面实现的是对传喜物流系统(http://vip.cxcod.com/PodApi/GetPodStr.asmx?ws ...

  8. webservice访问的几种方式

    今天在对接的客户用到了webservice,最终采用wsimport生成本地代理方式以SDK的形式对接,但是想的完整的总结一下ws的几种调用方式. 发布服务的IP地址是:192.168.125.116 ...

  9. [OpenSource]浅谈.Net和Java互相调用的三种方式

    在很多的大型系统开发中,开发工具往往不限制于同一种开发语言,而是会使用多种开发语言的混合型开发.目前Java和.Net都声称自己占85%的市场份额,不管谁对谁错,Java和.Net是目前应用开发的两个 ...

随机推荐

  1. 移动Web单页应用开发实践——实现Pull to Request(上/下拉请求操作)

    在单页应用开发中,无论是页面结构化,还是Pull to Request,都离不开一个技术——页面局部滚动.当下的移动web技术,主要使用下面两种方式实现局部区域的滚动: 基于IScroll组件,也有很 ...

  2. Jquery&JS简单选项卡

    结果,如图 为了明显,用绿色+红色 第一步:静态布局 先写html代码和css样式 要点一:  ul li都为块级元素,可以用height,但是里面字体不居中,我们用line-height,即达到居中 ...

  3. ajax的同步和异步问题 (转)

    async默认的设置值为true,这种情况为异步方式,当ajax发送请求后,在等待server端返回的数据的过程中,程序会继续执行ajax块后面的代码,直到服务器返回正确的结果才会去执行success ...

  4. maven相关概念

    1.maven仓库分为:本地仓库,远程仓库.远程仓库分为私服.中央仓储和其他公共库. 2.mvn clean install 部署到本地仓库 3.mvn clean deploy 部署到远程仓储 4. ...

  5. linux mysql服务器迁移

    服务器即将过保,重新申请了一台虚机,折腾了一下数据库的迁移.以下是主要步骤: 1.在windows上用navicat把数据和结构转储成sql文件 2.在mysql官网上下载rpm的压缩包 3.使用se ...

  6. gitlab & gerrit & git & repo & jenkins

    Omnibus GitLab documentation(中文安装说明) 在自己的服务器上部署 GitLab 社区版->较为全面 GIT & REPO & GERRIT (三) ...

  7. 《你不知道的JavaScript》读书笔记(一)作用域

    名词 引擎:从头到尾负责整个 JavaScript 程序的 编译 及 执行 过程. 编译器:负责 语法分析 及 代码生成. 作用域:负责收集并维护由所有声明的标识符(变量)组成的一系列查询,并实施一套 ...

  8. eclipse 版本号

    Eclipse 3.1 版本代号 IO [木卫1,伊奥]  Eclipse 3.2 版本代号 Callisto [木卫四,卡里斯托 ]Eclipse 3.3 版本代号 Eruopa [木卫二,欧罗巴  ...

  9. 【翻译】KNACK制作介绍

    KNACK 次世代游戏机的性能开发新世界,PlayStation 4首发游戏的舞台幕后     配合PS4的国内首发,作为SCE的第一个游戏发售的本作. 一边加入发挥次世代机机能的表现,设计了谁都可以 ...

  10. THinkPHP在模板中的volist循环使用外部变量注意事项

    循环中.自己定义的id=volist就可以使用$volist.id 或者$volist['id'] 而外面定义的变量就不能使用$vo.id 必须使用$vo['id']<volist name=& ...