一、服务器端代码
新建一个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("18146531996", 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":"18146531996","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==4){ if(xhr.status==200){ 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请求
今天的文章N/a_N种方式分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/46358.html