一、服务器端代码

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

  1. package com.bobo.server;
  2.  
  3. import javax.jws.WebService;
  4. import javax.xml.ws.Endpoint;
  5.  
  6. @WebService
  7. public class HelloServer {
  8. public static void main(String[] args) {
  9. Endpoint.publish("http://localhost:9001/hello", new HelloServer());
  10. System.out.println("server is ready!");
  11. }
  12.  
  13. public String sayHello(String name){
  14. return "hello,"+name;
  15.  
  16. }
  17. }

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 [要生成客户端代码的包名,如果不指定,那么默认和服务器端的报名相同],如下所示:

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

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

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

  1. package com.bobo.test;
  2. import com.bobo.client.*;
  3.  
  4. public class WsimportTest {
  5.  
  6. /**
  7. * @param args
  8. */
  9. public static void main(String[] args) {
  10.  
  11. MobileCodeWSSoap soap=new MobileCodeWS().getMobileCodeWSSoap();
  12. String result=soap.getMobileCodeInfo("", null);
  13. System.out.println(result);
  14.  
  15. }
  16.  
  17. }

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代码发送请求,是不会出现跨域的。

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

get方式请求接口

  1. /*调用服务的post方法*/
  2. function getResultByPost(){
  3. //alert("post");
  4. $.ajax({
  5. type:'POST',
  6. dataType:'xml',
  7. url:'http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo',
  8. data:{"mobileCode":"","userID":null},
  9. success:function(data){
  10. alert($(data).find("string").text());
  11. }
  12. });
  13. }

post方式请求接口

  1. $(function(){
  2.  
  3. var soapData='<?xml version="1.0" encoding="utf-8"?>'+
  4. '<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/">'+
  5. ' <soap:Body>'+
  6. '<getMobileCodeInfo xmlns="http://WebXml.com.cn/">'+
  7. '<mobileCode>18146531996</mobileCode>'+
  8. '<userID></userID>'+
  9. '</getMobileCodeInfo>'+
  10. '</soap:Body>'+
  11. '</soap:Envelope>';
  12. getResultByGet();
  13. //getResultByPost();
  14. //getResultByJqueryAjax(soapData);
  15. //getResultByRawJS(soapData);
  16. });
  17.  
  18. /*遵从soap协议,利用jquery*/
  19. function getResultByJqueryAjax(soapData){
  20. alert("soap");
  21. $.ajax({
  22. url:'http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx',
  23. type:'POST',
  24. //content-type:'text/xml;charset=UTF-8',
  25. dataType:'xml',
  26. data:soapData,
  27. beforeSend:function(XmlHttpRequest){
  28. //下面这句soapAction的设定貌似可有可无,但是Content-Type是必须的
  29. XmlHttpRequest.setRequestHeader("SOAPAction","http://WebXml.com.cn/getMobileCodeInfo");
  30. XmlHttpRequest.setRequestHeader("Content-Type","text/xml;charset=utf-8");
  31. },
  32. success:function(data){
  33. alert($(data).find("getMobileCodeInfoResult").text());
  34. }
  35.  
  36. });
  37.  
  38. }

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

  1. /*遵从soap协议,利用原始js*/
  2. function getResultByRawJS(soapData){
  3. alert("getResultByRawJS");
  4. var xhr;
  5. if (window.XMLHttpRequest)
  6. {// code for IE7+, Firefox, Chrome, Opera, Safari
  7. xhr=new XMLHttpRequest();
  8. } else
  9. {// code for IE6, IE5
  10. xhr=new ActiveXObject("Microsoft.XMLHTTP");
  11. }
  12. //使用原生的js试一下
  13. //var xhr=new XMLHttpRequest();
  14. var url='http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx';
  15. xhr.open('POST',url,true);
  16. xhr.setRequestHeader("Content-Type","text-xml;charset=utf-8");
  17. xhr.setRequestHeader("SOAPAction","http://WebXml.com.cn/getMobileCodeInfo");
  18. xhr.send(soapData);
  19. xhr.onreadystatechange=_back;
  20.  
  21. function _back(){
  22. if(xhr.readyState==){
  23. if(xhr.status==){
  24. alert("xhr.responseText:"+xhr.responseText);
  25. }
  26.  
  27. }
  28.  
  29. };
  30. }

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

方法三、urlConnection请求

  1. package com.bobo.test;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.InputStreamReader;
  5. import java.io.PrintWriter;
  6. import java.net.MalformedURLException;
  7. import java.net.URL;
  8. import java.net.URLConnection;
  9.  
  10. public class UrlConnectionTest {
  11.  
  12. public static void main(String[] args) throws Exception {
  13.  
  14. String data="<?xml version=\"1.0\" encoding=\"utf-8\"?>"+
  15. "<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/\">"+
  16. " <soap:Body>"+
  17. " <getMobileCodeInfo xmlns=\"http://WebXml.com.cn/\">"+
  18. " <mobileCode>18146531996</mobileCode>"+
  19. "<userID></userID>"+
  20. " </getMobileCodeInfo>"+
  21. " </soap:Body>"+
  22. "</soap:Envelope>";
  23. String result=sendPost("http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx",data);
  24. System.out.println(result);
  25.  
  26. }
  27. private static String sendPost(String url,String data) throws Exception{
  28. StringBuilder result=new StringBuilder();
  29. URL realUrl=new URL(url);
  30. URLConnection connection=realUrl.openConnection();
  31. connection.setDoOutput(true);
  32. connection.setDoInput(true);
  33. connection.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
  34. connection.setRequestProperty("SOAPAction", "http://WebXml.com.cn/getMobileCodeInfo");
  35. PrintWriter writer=new PrintWriter(connection.getOutputStream());
  36. writer.write(data);
  37. writer.flush();
  38. writer.close();
  39.  
  40. BufferedReader reader=new BufferedReader(new InputStreamReader(connection.getInputStream()));
  41. String line="";
  42. while((line=reader.readLine())!=null){
  43. result.append(line);
  44. }
  45. return result.toString();
  46. }
  47. }

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. 表单序列化 js

    function serliaze(form) { //序列化表单 var obj = {}; $.each(form.serializeArray(), function (index) { if ...

  2. java并发编程-线程池的使用

    参考文章:http://www.cnblogs.com/dolphin0520/p/3932921.html 深入剖析线程池实现原理 将从下面几个方面讲解: 1.线程池状态 2.任务的执行 3.线程池 ...

  3. SQL查询一周内过生日的用户

    SELECT birthday, )) + '-' + )) + '-' + )) AS datetime) AS Nbirthday FROM CRM_Customer WHERE birthday ...

  4. __proto__和protaotype的区分

    直接看这样一个例子. var XXX = function(){}; var p = new XXX(); 可以把上面的例子拆分为如下一个过程: var p={}; //初始化一个对象p p.__pr ...

  5. [LeetCode]题解(python):030-Substring with Concatenation of All Words

    题目来源 https://leetcode.com/problems/substring-with-concatenation-of-all-words/ You are given a string ...

  6. 史上最用心的iOS App上架流程【转】

    转:http://www.jianshu.com/p/16fa56eacb5e 题记 麻痹起来嗨!看网上那么多的教程,依然在我心爱的爱屁屁在上架的时候遇到各种 J8 问题,最大的问题就是:Xcode ...

  7. Windows-001-Win7系统变量设置

    本节主要讲述Windows系统环境变量配置介绍,以 Windows 7 为例讲解. 1.右键单击 计算机,选择 属性,进入 系统 界面,如下所示: 2.点击上图中的 高级系统设置,进入 系统属性 界面 ...

  8. emmc boot1 boot2 partition

    使用mfg tool烧写android5.1的镜像之后,再使用旧版的mfg tool烧写linux或者android镜像,都不能正常启动,而且运行的uboot还是android5.1版本的uboot. ...

  9. 我的工具箱之MyEclipse9.1

    下载地址:http://pan.baidu.com/s/1bbuN1s 这个工具是用来开发Java程序,自带JDK和Tomcat,功能全面周到,使用方便. 市面上MyEclipse版本很多,但都需要破 ...

  10. CSS布局一

    CSS布局一 实例一(居中) div#container{ width:960px; height:650px; margin:0 auto; border:1px solid #ccc; /*就是说 ...