项目要用到ws,找了些资料,也在群里向大家请教,这是我跟一个朋友的聊天记录,给自己留个方便,以后看看什么的,也希望能给别人一个基本的概念!
星星 14:53:06
刚接触,有些不明白
星星 14:52:44
你需要什么?
星星 14:53:51
我用http://
星星 14:54:03
....hello.jws
星星 14:54:33
可以 看到那个 wsdl文件
星星 14:54:50
那个 server-config.wsdd
星星 14:54:08
你是做java开发的吧?那就不要用jws了,比较难用
星星 14:54:57
是 干什么 的
星星 14:55:00
对
星星 14:55:34
jdk1.4,有个xfire不支持 啊
星星 14:54:53
wsdl web service define language
星星 14:55:52
开发-佘 14:54:08
你是做java开发的吧?那就不要用jws了,比较难用
星星 14:56:01
那用什么?请赐教
星星 14:55:45
就是用wsdd
星星 14:57:02
就是server-config.wsdd 这个吗?
星星 14:56:54
其实对于你所有方式的请求,不论使用jws还是直接的wsdl那个url都是在web.xml里面转为org.apache.axis.transport.http.AxisServlet解析
星星 14:57:54
按照网上的例子作了一个不知道为什么不行?
星星 14:57:19
然后通过server-config.wsdd中的配置生成wsdl
星星 14:58:36
这应该是服务器端应该生成的吧 ?
星星 14:58:04
需要修改web.xml中的映射,增加一个servlet和若干个到servlet的映射
星星 14:58:51
是,是根据server-config.wsdd和结合wsdd中的指定类名,然后反射出来的方法列表,就是你看到的wsdl文件
星星 14:59:03
然后也是能够被直接使用的
星星 14:59:52
明白
星星 14:59:56
==
星星 14:59:49
<service name="WSDemo" type="" provider="java:RPC" style="rpc" use="encoded">
<parameter name="scope" value="Request"/>
<parameter name="className" value="com.lingtu.gps.ws.demo.WSDemo"/>
<parameter name="allowedMethods" value="*"/>
<namespace>http://DBBroker.lingtu.com</namespace>
星星 14:59:56
</service>
星星 15:00:31
是最重要的部分,也是你可以约定你所提供服务的部分,使用"*"匹配所有的public方法,生成wsdl文件
星星 15:01:24
我是按照这篇文章作的
星星 15:01:26
http://www.ibm.com/developerworks/cn/webservices/ws-startaxis/index.html(初级版)
http://www.ibm.com/developerworks/cn/webservices/ws-deepaxis/index.html (高级版)
星星 15:01:50
明白
星星 15:03:13
只要通过ie能访问哪个wsdl文件就说明服务器端的ws部署好了?
星星 15:03:01
呵呵,ibm的这个有点太复杂了,我还没接触那么多,不过,如果你用不到session管理和完全的方法级权限约束的话,应该不需要那么复杂,只要一个你提供的类和server-config.wsdd就可以开始工作了
星星 15:04:34
主要是这段“使用定制发布编写Web服务”
星星 15:04:40
应该就能满足了
星星 15:05:00
可是我按照他说的怎么不行啊
星星 15:05:03
郁闷
星星 15:04:29
因为axis的webservice使通过wsdl获得的,所以能获得在webservice中意味着能使用,只要你的类是正确的就ok
星星 15:05:13
呵呵,以前也看过,太长了,没看明白,现在用的axis就是只用了一个类,和server-config.wsdd搞定的
星星 15:05:47
如果要约束你的类里面暴露的方法,可以使用完整的名字来代替,而不是用*号通配
星星 15:06:32
call
星星 15:06:07
你是说调用么?
星星 15:06:58
对啊
星星 15:07:05
先说这个
星星 15:06:33
那要看是什么语言开发调用了
星星 15:07:21
我写完例子程序后
星星 15:07:22
http://localhost:8080/axis/services/city?wsdl
星星 15:07:37
这样访问 没效果
星星 15:07:55
你那有好的资料吗或现成的例子 ?
星星 15:07:58
+好友传给你
星星 15:08:56
好的
星星 15:10:44
哈哈
星星 15:10:51
你好
星星 15:11:23
如果方便的话,把他哪个小例子帮忙调一下
任我飞 15:11:13
没有时间,不好意思,呵呵,项目有点急
星星 15:12:06
好的
星星 15:12:13
十分感谢 啊
任我飞 15:12:02
http://localhost/axis/servlet/AxisServlet
这样就可以看到了
星星 15:12:57
好的
星星 15:14:06
以后还得象你多请教啊!
任我飞 15:13:34
不客气,你先看看
星星 15:14:22
好的
任我飞 15:16:08
接收文件保存于 C:/Documents and Settings/paul/桌面/WSDemo_rar
星星 15:16:30
axis里的这个方法是干什么的,api没看明白
星星 15:16:32
addParameter
任我飞 15:16:46
有这个方法么?写服务的时候没有啊
星星 15:18:07
客户端调用 的 方法
任我飞 15:17:59
你不是用的存根方式调用么?
星星 15:19:11
不是 啊 ?
星星 15:19:34
看了一下存根模式 有点麻烦 啊
任我飞 15:19:40
呵呵,存根模式用程序可以生成,生成后直接就可以使用一个对象来调用方法了,你说的麻烦是什么意思?
任我飞 15:19:42
那个
星星 15:20:47
知道的太少 了
星星 15:20:53
任我飞 15:19:40
呵呵,存根模式用程序可以生成,生成后直接就可以使用一个对象来调用方法了,你说的麻烦是什么意思?
星星 15:20:57
怎么生成
星星 15:21:04
永命令吗 ?
星星 15:21:18
我用命令生成了
任我飞 15:20:46
org.apache.axis.client.Call.addParameter(javax.xml.namespace.QName, javax.xml.namespace.QName, CLass, javax.xml.rpc.ParameterMode)
任我飞 15:21:19
是用wsdl2java的一个class程序生成,然后活的对象就可以直接使用了
任我飞 15:22:09
那个addParameter是指添加一个什么样的参数值,其中需要指定名称,名字空间,类型,入还是出值
星星 15:22:56
得在命令行 敲命令把
星星 15:23:08
入还是出值 ?
任我飞 15:22:27
是一个java程序
星星 15:23:15
这个不明白
任我飞 15:22:43
IN标识入参,OUT标识返回值
星星 15:23:47
入 和出 是相对客户还是服务器 啊 ?
任我飞 15:24:05
相对服务器,IN标识进入服务器的参数,一般java中的参数都是IN的,返回值会在invoke后给出,在com中使用这个比较多
星星 15:25:59
把你的程序直接放在 tomcat/webapp/下 运行 出错了
星星 15:26:24
org.apache.axis.InternalException: org.apache.axis.ConfigurationException: java.io.UTFDataFormatException: Invalid byte 1 of 1-byte UTF-8 sequence.
java.io.UTFDataFormatException: Invalid byte 1 of 1-byte UTF-8 sequence.
星星 15:26:28
错误片断
星星 15:26:38
还需要改什么配置马 ?
任我飞 15:26:15
你是放axis文件夹么?
星星 15:27:20
这个 WSDemo
任我飞 15:26:54
是不是用editplus修改server-config.wsdd
任我飞 15:27:06
只放axis目录就可以了
星星 15:27:51
什么都没动过
星星 15:29:02
试一下 再
星星 15:29:53
还是不行 啊
任我飞 15:29:16
异常
星星 15:30:13
org.apache.axis.InternalException: org.apache.axis.ConfigurationException: java.io.UTFDataFormatException: Invalid byte 1 of 1-byte UTF-8 sequence.
java.io.UTFDataFormatException: Invalid byte 1 of 1-byte UTF-8 sequence.
任我飞 15:30:20
你就看看结构把,可能是编码问题,jdk14的,注意axis,tomcat,jdk版本
星星 15:31:21
好的自己跳一下
星星 15:31:24
谢啦
星星 15:31:28
忙吧
任我飞 15:30:52
星星 15:31:45
星星 15:54:20
晕我原来例子也抱哪个错了哈
星星 16:15:49
搞定
任我飞 16:15:14
原因?
星星 16:16:34
wsdd中 编码是utf-8
星星 16:16:47
改成iso-8859-1
任我飞 16:16:27
哦,现在支持中文么?
星星 16:17:33
还不清楚那
星星 16:17:44
一会试一下
任我飞 16:17:10
呵呵,再试试吧,祝成功
星星 16:18:03
好的
星星 16:28:36
网上那个例子我也搞定了,
星星 16:29:00
声成的wsdl文件的编码怎么决定啊?
任我飞 16:28:54
不清楚,没有用过
星星 16:29:49
看到的wsd
星星 16:29:50
l
星星 16:30:03
文件编码是utf-8
星星 16:30:08
忙把
星星 16:39:12
ws的开发流程是个什么样子的?
星星 16:39:29
服务器端需要给客户端提供什么
星星 16:39:34
一个url吗?
任我飞 16:39:48
恩
星星 16:41:28
客户端根据url选择自己感兴趣的方法进行调用 ?
任我飞 16:41:34
先写一个接口,约定能提供的方法列表及参数信息,提供wsdd,然后向外公布一个url,然后进一步实现这个接口以提供服务,客户端可以根据wsdl来进行服务使用
星星 16:43:52
先写一个接口 ,这个接口是服务器端要用到的吧!
任我飞 16:43:40
这个接口是进行服务约定的,服务器需要实现这个接口以提供服务
星星 16:45:59
那就是说客户端也应知道这个接口 ,或者说这个接口是双方协商的 ,然后服务器端实现这些 接口 ,再通过 wsdd提供给 客户供起调用
任我飞 16:45:56
恩,只不过客户端对这个接口的了解只限于从wsdl获取的信息
星星 16:47:07
明白了
星星 16:47:19
看来你对ws的开发应该很熟了
任我飞 16:47:22
呵呵,只是使用,开发的那些东西到不是很清晰。
星星 16:48:56
今天跟你的聊天,受益非浅啊 !
星星 16:48:59
谢谢 !
星星 16:49:23
我可以把今天的内容放到我得博客上了 哈哈哈
任我飞 16:48:42
有个建议,这个接口要宽,提供的方法中的参数尽量使用原始类型,如String,Map,List之类,尽量不使用太复杂的类
任我飞 16:48:54
恩,有个总结的习惯挺好的
任我飞 16:49:08
在保定上学么?
星星 16:50:19
你怎么知道 ?
任我飞 16:50:02
0312,我女朋友以前在农大上学,0312拨熟了
星星 16:51:00
俺已经毕业快一年了
星星 16:51:03
出差那河北
星星 16:51:34
这涉及到能否传对象的问题了
任我飞 16:50:52
呵呵,也是06届的,呵呵
星星 16:51:47
如果传入的参数是个 对象 那就好了
星星 16:52:30
ibm那篇文章有时间得研究一下 啦
星星 16:52:41
很有缘啊
星星 16:52:42
^_^
任我飞 16:52:49
是,因为使用webservice的基础是soap,所以要传对象也可以,但是比较复杂,而且接口也不推荐将内部对象提供给客户端,这样客户端解析就需要服务器的对象包了,反而不利于webservice的推广,所以使用基础类型和简单集合类如果能解决就尽量不要使用复杂对象
星星 16:54:54
不过对象还是有用的 ,一个对象带n各属性 ,不然你得传n各参数
任我飞 16:56:29
呵呵,那就看你怎么设计接口了,如果n个属性是具有关联的,那可以使用对象,或者使用Map来传递,对于简单对象,需要进行soap序列化,性能问题会比较明显
星星 16:58:05
现说道这吧!有问题了再向你请教 啊
任我飞 16:57:44
其实没有绝对,只要是当前需求的,而且以后可能会这样持续下去的,就是合理的,只不过我遇到的项目恰好都没有太多的参数,而且客户端包括vb,c#,java各种,所以也没办法使用复杂对象
星星 16:59:39
看项目需要吧 !
任我飞 16:59:14
恩
注:server-config.wsdd放在WEB-IN下,ws服务器将根据它来定位被调用类和方法