请教高手, 关于WebService的一些疑问?

ansensp 2011-02-21 03:53:04
今晨浏览论坛, 看到帖子http://topic.csdn.net/u/20081217/13/5a9075fc-feb1-4cde-96ac-5f982f7a1b7b.html. 此贴公布了一些免费且常用的WebService. 由于本人从来没有使用过WebService, 顿感好奇, 遂开始研究. 于是根据上贴中的一个天气预报服务, 写了如下三个方法去调用该webService

public static String invokeWebServiceBySoap() throws IOException{
URL url = new URL("http://www.webxml.com.cn/WebServices/WeatherWebService.asmx");
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/soap+xml;charset=utf-8");
connection.connect();

String param = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
+"<soap12:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\">"
+"<soap12:Body>"
+"<getWeatherbyCityName xmlns=\"http://WebXml.com.cn/\">"
+"<theCityName>北京</theCityName>"
+"</getWeatherbyCityName>"
+"</soap12:Body>"
+"</soap12:Envelope>";

param = new String(param.getBytes(), "UTF-8");
OutputStream os = connection.getOutputStream();
os.write(param.getBytes("UTF-8"));
os.flush();
os.close();

InputStream in = connection.getInputStream();
byte[] bs = new byte[in.available()];
in.read(bs);

in.close();
os.close();

return new String(bs, "UTF-8");
}

public static String invokeWebServiceByHttpGet() throws IOException{
URL url = new URL("http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getWeatherbyCityName?theCityName=北京");
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.setDoInput(true);
connection.connect();

InputStream in = connection.getInputStream();
byte[] bs = new byte[in.available()];
in.read(bs);
in.close();

return new String(bs, "UTF-8");
}

public static String invokeWebServiceByHttpPost() throws IOException{
URL url = new URL("http://www.webxml.com.cn//WebServices/WeatherWebService.asmx/getWeatherbyCityName");
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setRequestMethod("POST");
connection.connect();

String city = "theCityName=北京";
city = new String(city.getBytes(), "UTF-8");

OutputStream os = connection.getOutputStream();
os.write(city.getBytes("UTF-8"));
os.flush();
os.close();

InputStream in = connection.getInputStream();
byte[] bs = new byte[in.available()];
in.read(bs);

in.close();
os.close();

return new String(bs, "UTF-8");
}

三个方法分别使用HTTP+SOAP/POST, HTTP/GET, HTTP/POST 三种方式去调用此service, 执行都能正确返回结果, 可是由于没有接触过WebServie, 所以有如下两个疑问:

(1). 既然后上述三个方法都能调用WebService, 为何还要是用Axis或者XFire编写WebService客户端?
(2). 直接在服务器上发布一个Servlet, 然后响应给客户端一个xml结构的输出流. 这样的servlet与WebService有和区别?

我想可能是我根本就没理解什么是WebService, 所以请熟悉WebService的朋友帮忙指点一下, 不胜感激!

...全文
117 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
蒙面客 2011-02-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 viszl 的回复:]
(1)为何使用xfrie和axis
照你这样的说法很多类库都不需要使用了,javamail啊,poi啊,dom4j啦,都可以自己实现这些功能嘛
我只是使用过axis1和axis2,就axis来说发布一个webservice以及编写一个客户端是很方便的,比如说Lz按照你的方法你所调用的方法需要传递一个list,map或者自己定义的对象的话你改怎么实现呢?用axis就可以很方便的实现
(2)we……
[/Quote]

同意
推荐使用xfrie
牛十二 2011-02-21
  • 打赏
  • 举报
回复
同意楼上观点
1.主要是为了提高开发效率
2.并不是说所有的webservice是给客户端调用的,有一大部分仍然是java后台系统调用的。
3.楼主上述三个方法都能调用,但有没有发现三个调用都有重复的代码,为了代码的优化便产生了webservic框架
4.返回的xml文件解析也是头痛的问题,用框架封装后易于调用。
loveofmylife 2011-02-21
  • 打赏
  • 举报
回复
(1)为何使用xfrie和axis
照你这样的说法很多类库都不需要使用了,javamail啊,poi啊,dom4j啦,都可以自己实现这些功能嘛
我只是使用过axis1和axis2,就axis来说发布一个webservice以及编写一个客户端是很方便的,比如说Lz按照你的方法你所调用的方法需要传递一个list,map或者自己定义的对象的话你改怎么实现呢?用axis就可以很方便的实现
(2)webservice不是servlet
http://www.docin.com/p-27546561.html
zn85600301 2011-02-21
  • 打赏
  • 举报
回复
1.当传输比较复杂的数据对象时 用原始的方法开发效率代价太大
2.web service 通信一般都会有2个消息 发送消息和接受消息的回馈
如果是servlet 只能单一的返回消息 无法进行一些业务判断
web service 可以跨语言通信
StanleyYu 2011-02-21
  • 打赏
  • 举报
回复
如果应用程序有成千上万的用户,而且分布在世界各地,那么客户端和服务器之间的通信将是一个棘手的问题。因为客户端和服务器之间通常会有防火墙或者代理服务器。在这种情况下,使用DCOM就不是那么简单,通常也不便于把客户端程序发布到数量如此庞大的每一个用户手中。

web service适合多个应用程序之间的数据交互,在通过web进行互操作或远程调用的时候是最有用的。
楼主所列的三种方法为传统方法,这样做的结果是开发难度大,程序很难维护。

大致列几个web service的优点:
一:跨防火墙的通信
二:应用程序集成
三:B2B的集成
四:软件和数据重用
jackey_ctdw 2011-02-21
  • 打赏
  • 举报
回复
我也没理解什么是WebService, 所以请熟悉WebService的大虾指点一下
智鹿软件 2011-02-21
  • 打赏
  • 举报
回复
推荐使用xFire
酒剑仙 2011-02-21
  • 打赏
  • 举报
回复
你那三种方式都只是客户端的调用
webservice 实际应用 要复杂的多。
所以才出现axis 和xfire 这种类库来封装
jackey_ctdw 2011-02-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 s_ongfei 的回复:]
同意楼上观点
1.主要是为了提高开发效率
2.并不是说所有的webservice是给客户端调用的,有一大部分仍然是java后台系统调用的。
3.楼主上述三个方法都能调用,但有没有发现三个调用都有重复的代码,为了代码的优化便产生了webservic框架
4.返回的xml文件解析也是头痛的问题,用框架封装后易于调用。
[/Quote]
+1
youjianbo_han_87 2011-02-21
  • 打赏
  • 举报
回复
1. 你这个是调用代码。WebService本来就是跨平台的。所以显得简单。

2. 用框架,只是为了一般程序员开发用的。真正开发WebService,是要准许WebService一系列很复杂规范。用Java开发或者.net开发。你不一定知道有哪些规范需要实现和满足,你去看下WebService的规范和它的底层那些协议,你就知道。为什么要那么多框架来方便我们开发了。

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧