WebService详解

一,webservice 的原理分析:

它是一种构建应用程序的普遍模型,可以在任何支持网络通信的操作系统中实施运行;它是一种新的web应用程序分支,是自包含、自描述、模块 化的应用,可以发布、定位、通过web调用。

Web Service是一个应用组件,它逻辑性的为其他应用程序提供数据与服务.各应用程序通过网络协议和规定的一些标准数据格式(Http,XML,Soap)来访问Web Service,通过Web Service内部执行得到所需结果.Web Service可以执行从简单的请求到复杂商务处理的任何功能。一旦部署以后,其他Web Service应用程序可以发现并调用它部署的服务。

简单的说:

Webservices 就是一个应用程序,它向外界暴露出一个能够通过Web进行调用的API。这就是说,你能够用编程的方法通过Web来调用这个应用程序。我们把调用这个Webservices 的应用程序叫做客户在构建和使用Web Service时,主要用到以下几个关键的技术和规则: Http传输信道 XML( Extensible Markup Language ):描述数据的标准方法. SOAP( Simple Object Access Protocol ):表示信息交换的协议. WSDL( Web Services Description Language ):Web服务描述语言. UDDI(Universal Description, Discovery and Integration):通用描述、发现与集成,它是 一种独立于平台的,基于XML语言的用于在互联网上描述商务的协议。



二、webservice 的概念,解决什么问题?


webservice 就是一个应用程序,它提供一种通过web 方式访问的api.
解决两个系统或者(应用程序)之间的远程调用.....
调用是跨语言,跨平台...
webservice 最基本的组成部分就是客户端,服务端...

服务端:(作为服务端,怎么将自己的应用程序发布成一个webservice,让别人调用)

webservice的客户端与服务端进行交互的时候传递的数据格式:xml 。

webservice description language(web 服务描述语言.. api)xml,简称wsdl

soap(简单对象访问协议) webservice 的客户端与服务端进行交互的时候走的协议

(soap 分两个版本(soap 1.1 与soap1.2)),现在的本是soap1.1,因为java jdk 只支持soap1.1版本的协议发布..

***** soap 协议=在http 的基础之上传送xml 格式的数据..


发布服务:
//java jdk 提供一个自带的类可以将java 应用程序发布成webservice 
/**
* 1,提供服务对外的访问地址
* 2,提供服务的类的对象...
*/
Endpoint.publish("http://主机名:端口/helloService",,提供服务的类的对象);


注意:1,endpoint是java jdk 提供的类,用来发布webservice,所以你的jdk 版本必须在1.6.0_21之上..
      2,被发布的类当中必须包含一个有效(方法必须为publish的非静态的,非final的方法)的方法
      3,被发布的类上面必须有注解...

客户端:
(作为客户端,怎么调用别人发布的webservice)
调用服务:我们可以通过java jdk 自带的一个命令 wsimport 根据服务端说明书(wsdl)生成本地的java 代码

我们直接操作这些java 代码,就可以调用webservice 。


wsimport -d . +服务说明书(wsdl)的地址 生成本地的class 文件
wsimport -s . +服务说明书(wsdl)的地址 生成本地的class 文件与java文件
wsimport -s . -p(包名)+服务说明书(wsdl)的地址 生成本地的class 文件与java文件

调用方式:
①:通过wsimport
工具1:webservice explorer (通过图形化界面的方式调用webservice)

工具2:tcp/ip Monitor  可以拦截webservice客户端与webservice 服务端进行交互的整个过程以及数据传输的格式..


②:通过java jdk 自带的一个类URLConnect(可以发送一个http 请求)
原理:我们可以通过URLConnect 这个对象,发送一个http 请求,往webservice 服务端 传送xml 格式的数据,
模拟soap 协议 ,因为soap协议就是在http 的基础上传送xml格式的数据..


③:通过客户端编程的方式调用 webservice 我们需要通过java jdk 自带的类 Service ,
同时,我们需要依赖一个接口,这个接口我们可以通过wsimport 生成的本地代码当中获取...




/**
  互联网上有很多免费的服务,http://www.webxml.com.cn 可以在这个网站上面找到。

**/

三。举例。


1,调用互联网上手机号码归属地查询的服务

  使用wsimport 生成本地代码调用。



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package com.raychen.client.webservice;

import cn.com.webxml.MobileCodeWS;
import cn.com.webxml.MobileCodeWSSoap;

/**
 * 调用互联网上手机号码归属地查询的服务...
 * 
 * 
 *
 */

public class TelephoneAddressInvoke {

    /**
     * @param args
     */

    public static void main(String[] args) {

        //获取接口的实现类...

        MobileCodeWSSoap codeWSSoap=new MobileCodeWS().getMobileCodeWSSoap();
        
        String address=codeWSSoap.getMobileCodeInfo("13888888888""");
        
        System.out.println("address=="+address);
        
    }

}


1,调用互联网上天气预报的服务

   使用 HttpURLConnection调用。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package com.raychen.client.webservice;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import javax.jws.WebService;
import javax.xml.ws.Endpoint;

/**
 * 
 * 调用互联网上天气预报的数据...
 * 
 * 
 *
 */

@WebService
public class WeatherInvoke {

    /**
     * @param args
     * @throws Exception 
     */

    public static void main(String[] args) throws Exception {
        
        Endpoint.publish("http://192.168.9.100:9898/weather"new WeatherInvoke());
    }
    /**
     * 
     * 调用互联网查询天气的信息....

     * @param city
     * @return
     * @throws Exception 
     */

    public  String getWeather(String city) throws Exception{
    
        URL url=new URL("http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx");
        
        HttpURLConnection connection=(HttpURLConnection) url.openConnection();//打开连接
        
        connection.setDoInput(true);//如果要接收服务端传送数据,必须设置为true
        
        connection.setDoOutput(true);//如果要往服务端传送数据,必须设置为true
        
        connection.setRequestProperty("Content-Type""text/xml;charset=utf-8");//设置内容类型
        
        connection.setRequestMethod("POST");//webservice 接收客户端的请求方式是post
        
        OutputStream outputStream=connection.getOutputStream();//通过流往服务端发送数据..
        
        StringBuffer buffer=new StringBuffer(5000);
        
        buffer.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>")
        .append("<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/\">")
        .append("<soap:Body> <getWeather xmlns=\"http://WebXml.com.cn/\">
<theCityCode>")
        .append(city).append("</theCityCode> <theUserID></theUserID></getWeather>
</soap:Body></soap:Envelope>");
        
        outputStream.write(buffer.toString().getBytes());
        
        InputStream ios=connection.getInputStream();
        
        int length=0;
        
        byte b [] =new byte [1024];
        
        StringBuilder build=new StringBuilder();
        
        while((length=ios.read(b))!=-1){
        
            String s =new String(b,0,length,"utf-8");
            
            build.append(s);
        }
        
        return build.toString();
    }

}



④:通过ajax 去调用webservice 
xmlhttpRequest 对象时浏览器自带的一个对象,可以通过此对象发送一个http 请求,传送xml 格式的数据到服务端
(模拟soap 协议...)
不能访问:跨域(a 站点的js 访问b 站点的请求...)


webservice 加深:
通过webservice 的客户端与服务端的几种调用方式,通过tcp ip/monitor 监控webservice 请求的过程
拦截请求的数据,对数据进行分析...
webservice 的客户端与服务端进行交互的时候,
第一次通过get 请求 wsdl 的服务说明书
第二次通过post 的方式 请求 webservice 服务...

理解wsdl 服务的说明书:
我们可以通过修改注解来修改wsdl 服务说明书的描述。
如果修改了说明书,则会影响wsimport 生成的本地代码....





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值