鸿 网 互 联 www.68idc.cn

当前位置 : 服务器租用 > 编程语言开发 > erlang > >

webService原理及使用

来源:互联网 作者:佚名 时间:2017-02-11 10:30
本人正在学习使用webservice技术,做个笔记,加深印象,也把自己的学习经历分享出来,以供和我这样的小白参考借鉴,如有不合理之处,请指正,谢谢。 学习webservice,你应该、明白一下几点: ① webService是做什么的? ②它有什么用? ③它在开发项目中解决

本人正在学习使用webservice技术,做个笔记,加深印象,也把自己的学习经历分享出来,以供和我这样的小白参考借鉴,如有不合理之处,请指正,谢谢。

学习webservice,你应该、明白一下几点:
① webService是做什么的?
②它有什么用?
③它在开发项目中解决什么样的问题?
④….
带着这几个疑虑,我一一道来。
一,webservice的基本概念!
通俗的说,他就是解决不同的应用程序之间相互调用的一种技术,
举例:像天气查询功能,你可以通过使用webService技术调用气象局对外提供的服务,查询相应的天气情况,
它主要有三个不同的技术(就这样叫吧)帮助实现其功能。在这里我还要讲一下,werbservice最基本的组成就是客户端和服务端
怎么区分客户端和服务端了?
你可以这么理解,谁发请求,谁就是客户端,谁接受请求谁就是服务端

  1. :SOAP
  2. WSDL
  3. UDDI
    soap
    (Simple Object Access Protocol)简单对象存取协议。简单的理解可以认为soap = http+xml,soap有分两个版本,1.1和1.2 Java只支持1.1的发布协议,所以Java开发的使用soap1.1
    在Javaweb(本人是搞Java开发的)开发的过程中,当浏览器发送一个请求给服务器的时候,他们之间是通过httprequest发送请求,通过httprespose传递响应的。在使用webService技术时,这种请求响应之间就通过http发送请求xml讲请求的数据带过来,
    WSDL
    (Web Services Description Language) WSDL 文件是一个 XML 文档,用于说明一组 SOAP 消息以及如何交换这些消息。大多数情况下由软件自动生成和使用。
    UDDI
    可以简单的认为他就是一个webService接口说明书,这个在开发的时候几乎不怎么使用,现在的企业级的开发都是通过两个交换接口的约束文档,而这个文档中已经说明了这个接口的方法名和传递的参数,就不在查询uddi文档了(在uddi文档中有你定义的接口的前提下)

现在就写一个简单的webService实现:
先编写服务端代码:

public static void main(String[] args) {
/**
 * 提供对外访问的服务,提供服务的对象
 * Endpoint 是Java jdk提供的一个类,他是javax.xml.ws.Endpoint;包下的,必须是jdk1.6以上
 * publish("url","Object对象");
 * 192.168.1.xxx 是你本机的ip地址,你要把它发布在哪儿,你就写他的ip地址
 * 9989 是端口名。只要不被占用就行
 * new HelloSevice() 是我自己写的一个类
 */
Endpoint.publish("http://192.168.1.xxx:9989/HelloService", new HelloSevice());

**HelloSevice类**

/**
* 外部访问的类
* @author Administrator
*
*/
@WebService
public class HelloSevice {
/**
编写这个类的时候一定的给他写方法,不然会报com.sun.xml.internal.ws.model.RuntimeModelerException:异常,提示你这里类里面没有任何方法,
这个类上面使用@WebService注解和自己文字说明注解,
要发布的这个类一定的是public 非final的方法
*
*/
public void systemTo(){
System.out.println(“你好”);
}
}

编写完之后 运行main主函数,在控制台没有报任何异常的时候,说明你的webservice服务编写成功了,你可以将*http://192.168.1.xxx:9989/HelloService?wsdl* 拷贝刀浏览器的地址栏访问 要是出现一下的信息就ok了
![webService服务器代码编写成功示例](http://img.blog.csdn.net/20160716121521320)

下面编写客户端的代码:(你有服务端,那必须的有客户端,相互调用吗!)
客户端代码的实现 有三种方式,
第一种,
使用Java jdk自带的wsimport根据服务端说明书(wsdl)生成本地代码,我们将生成的本地代码在计算机上找见,直接copy到自己的项目中,操作这些代码就可以实现客户端的调用了
在dos命令下使用
wsimport -d . http://192.168.1.xxx:9989/HelloService?wsdl 
生成本地代码,
wsimport -d 是生成 http://192.168.1.xxx:9989/HelloService?wsdl 代码的class文件
wsimport -s . http://192.168.1.xxx:9989/HelloService?wsdl 
wsimport -s 是生成Java代码和class文件
还可以使用wsimport -s . -p 新的包名(你在项目开发时怎么取包名,这里就怎么写) http://192.168.1.xxx:9989/HelloService?wsdl
生成指定包名的Java类
现在在客户端创建一个类(随意),

public static void main(String[] args){
//找到HelloService 接口的实现类
HelloSeviceService hs = new HelloSeviceService();
//通过实现类得到接口中的方法
//getHelloSevicePort() 这个在生成的Java代码的接口的实现类中可以找见
HelloSevice hService = hs.getHelloSevicePort();
//输出实现类中的一个方法
hService .systemTo();

}

运行这个main方法,你会看到在控制台出现“你好”

第一种方法的总结:

  • 在编写服务端代码是注意Endpoint.publish(“url”,”object”),要发布的类的使用@webService注解
  • 在dos命令生成Java文件 使用wsimport -s . wsdl命令
  • 在编写客服端代码是,讲使用wsimport -s生成的代码拷贝到自己的项目中,使用就和平常操作一个类没有区别了
    第二种实现方法
    通过IO流inputStream 和outputStream 两个操作。
    首先设置Tcp/IP Monitor 这个工具 这个已经被eclipse集成了 你可以在Windows –>perferences –>搜索 momitor
    momitor的配置
    Tcp/IP Monitor这个工具可以直观的看到请求头,请求体,传送的数据和响应头,响应体 响应的数据数据格式
    原理,就是soap的http请求+xml数据格式的传送
    代码实现:
Public Static void main(String[] args){
    //Url是wsdl的地址不要?wsdl
    /*
    * 这些方法都是Java.IO包下和Java.net包下的
    */
    URl url = new URl("http://192.168.1.xxx:9989/HelloService");
    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接受客户端请求的方式
    OutPutStream sps = connection.getOutputStream();//使用OutPutStream 流发送数据
    //拼接要传送的xml格式数据.可是使用string拼接,也可以使用StringBuffer的append的方法拼接
    StringBuffer sb = new StringBuffer();
    sb.append("在monitor界面得到的xml格式数据")
    sps.write(sb.toString().getBytes());
    //然后使用inputStream读取数据
    InputStream inputStream  = connection.getInputStream();
    int length = 0;
    Byte[] b = new byte[1024];
    while((length=inputStream.read(b))!=-1){
        String b = new String(b,0,length,"utf-8");//使用utf-8防止乱码问题
        System.out.println(b);
    }

}

以上代码都是手打的,如有错误,请谅解,但原理是对滴
第三种,通过客户端编程
这需要jdk提供的一个service类,同时还依赖衣一个接口,这个接口可以wsimport生成的代码中获取
代码实现:

public static void main(String[] args) throws Exception {
        /*
         * 使用Java.net的url
         */
        URL url = new URL("http://192.168.1.xxx:9989/HelloService");
        //QName("命令空间","服务名称")
        QName qName = new QName("http://webservice.web.com/", "HelloSeviceService");
        /*
         * 创建服务
         * jdk apl service 的create(URL wsdlDocumentLocation, QName serviceName)方法 
         */
        Service service = Service.create(url,qName);
        //获取接口类型
        /*
         * java api 提供的getPort(QName portName, Class<T> serviceEndpointInterface) 
         * 可在wsdl生成的文件中查找HelloSevicePort 是port标签的name属性的值
         * http://webservice.web.com/ 还是命名空间
         */
        HelloSevice  hSevice= service.getPort(new QName("http://webservice.web.com/", "HelloSevicePort"), HelloSevice.class);
        //调用HelloSevice的方法
        hSevice.systemTo();

好了,三种webService的实现方法都以讲完,本人也是边看黑马程序员视频,边学习的,如有不对,请指教,共同进步!有望几年之后成为技术大牛!
`

“`

网友评论
<