`
piperzero
  • 浏览: 3518698 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

Web Service难道又是一个美丽的童话?

阅读更多
<iframe align="center" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog.html" frameborder="0" width="728" scrolling="no" height="90"></iframe>

Web Service用了这么多年了,相信没有人会怀疑其跨平台性。无论是MS的WS还是J2EE的WS,自己和自己平台的交互一般都不会有什么配置问题。可是,当我们想要用一种平台去访问另一种平台的WS的时候,一个矛盾出现了,就是对WSML的解释存在差异性。

我做了一个例子,在VB中用MSSoap访问PHP Pear SOAP生成的WS,众所周知WSDL一般都不是人写的。

假设有一个发送短消息的函数

PHP生成Web Service有三种主要的方法:

1 用自带的soap函数

function send($address, $content, $key) {}

$server = new SoapServer(null, array('urn' => "SmsSender"));
$server->addFunction("send");
$server->handle();

这种方法无法生成wsdl

2 用Pear的SOAP

class SmsSender {
function send($address, $content, $key) {
}
}

$server = new SOAP_Server();
$webservice = new SmsSender();
$server->addObjectMap($webservice,'urn:SmsSender');
$server->service($HTTP_RAW_POST_DATA);

该类库可以自动生成WSDL如下:

<?xml version="1.0"?><definitions name="SmsSender" targetnamespace="urn:SmsSender" xmlns:wsdl="&lt;a href=" http:>http://schemas.xmlsoap.org/wsdl/" xmlns:soap="<a href="http://schemas.xmlsoap.org/wsdl/soap/">http://schemas.xmlsoap.org/wsdl/soap/</a>" xmlns:tns="urn:SmsSender" xmlns:xsd="<a href="http://www.w3.org/2001/XMLSchema">http://www.w3.org/2001/XMLSchema</a>" xmlns:SOAP-ENC="<a href="http://schemas.xmlsoap.org/soap/encoding/">http://schemas.xmlsoap.org/soap/encoding/</a>" xmlns="<a href="http://schemas.xmlsoap.org/wsdl/">http://schemas.xmlsoap.org/wsdl/</a>"&gt;<br><types xmlns="&lt;a href=" http:>http://schemas.xmlsoap.org/wsdl/"&gt;<br></types><br><porttype name="SmsSenderPort"></porttype><br><binding name="SmsSenderBinding" type="tns:SmsSenderPort"><br><binding style="rpc" transport="&lt;a href=" http:>http://schemas.xmlsoap.org/soap/http" /&gt;<br></binding></binding><br><service name="SmsSenderService"><br><documentation></documentation><br><port name="SmsSenderPort" binding="tns:SmsSenderBinding"><br><address location="&lt;a href=" http:>http://202.195.160.145/sms/ws.php" /&gt;<br> </address></port><br></service><br></definitions>

3 使用nusoap,不过由于最新版本有bug,所以我懒得用。

下面我们用VB调用上面的第二个WS

Dim client
Set client = CreateObject("MSSOAP.SOAPClient30")
client.ClientProperty("ServerHTTPRequest") = True

On Error Resume Next

Call client.MSSoapInit("http://host/sms/ws.php?wsdl", "SmsSenderService", "SmsSenderPort")
If Err 0 Then
Debug.Print "initialization failed" + Err.Description
End If


strg = client.send("12345678", "test", "key")
If Err 0 Then
Debug.Print Err.Description
Debug.Print "faultcode=" + client.FaultCode
Debug.Print "faultstring=" + client.FaultString
Debug.Print "FaultActor=" + client.FaultActor
Debug.Print "Detail=" + client.Detail
End If

MSSoap居然返回错误:

initialization failedWSDLPort:Port SmsSenderPort has no operations HRESULT=0x1: 函数不正确。
- WSDLService:Processing service SmsSenderService found no port definitions HRESULT=0x80070057: 参数不正确。
- WSDLReader:Analyzing the WSDL file failed HRESULT=0x80070057: 参数不正确。
- Client:One of the parameters supplied is invalid. HRESULT=0x80070057: 参数不正确。

那是不是WSDL的确错误呢?我继续用PHP的Pear的SOAP客户端来调用这个WS

$client = new SOAP_Client("http://host/sms/ws.php");
$client->send("12345677", "test", "key");

我甚至没有指定WSDL,也能顺利的执行。

还有Axis的WS如果给.net调用,经常也会存在一些莫名奇妙的错误。

如果我用一种平台的工具生成WSDL,然后让另一种平台用这个WSDL反向生成代码,这种代码的可读性会大大下降。

问题的症结似乎在于WSDL的过度复杂和设计之初,没有考虑手写代码的便捷性和可行性,HTML就是一个完全可以手写的代码。

难道Web Servcie就和EJB一样,所谓的一次部署只是一个美丽的童话?各家厂商为了自己的利益,无法使得WSDL变得完全中立?

或者是否应该有一个第三方的工具,独立与任何语言的工具来定义WS,然后通过可定制的模板,自动生成各家语言的各种框架所需的配置文件?如果有的话,可能会火!

欢迎大家参与讨论,你的WS最佳实践是什么?

没想到这个问题引发了不少朋友的激烈讨论。首先我声明的是,我选用了REST的Web Service,因为我觉得它比SOAP在解决我遇到的这个问题上更方便,快捷。其次,我觉得这个问题比较搞的点在于,M$在测试MSSOAP的时候,并没有找几个PHP的WS来做测试。同样Pear SOAP在做测试的时候,也没有用MSSOAP来测试。每个厂商似乎都只要保证自己的平台能够顺利的联通就可以了。同样对于Axis,Xfire也存在这样的问题。就像Xhtml,CSS的很多标准,虽然好,但是每个浏览器也不是都完全支持所有的标准。




分享到:
评论

相关推荐

    C#Web Service C#Web Service C#Web Service

    C# Web Service是一种基于.NET Framework的开发技术,用于创建分布式应用程序,使得不同系统间能够通过互联网进行通信。这种服务提供了一种标准化的方式,允许应用程序通过HTTP协议交换数据,因此,即使它们是由不同...

    Web service应用实例

    示例代码片段展示了如何创建一个名为`Service`的Web服务类,包含一个`GETDATA`方法,返回一个自定义的结构体`TestData`。 **2. 配置Web.config** 由于VS2005及后续版本的Web Service默认不支持远程调试,需在项目...

    web service ppt

    SOA(Service-Oriented Architecture)服务导向架构是Web Service的一个高级应用模式,它强调构建可重用的服务,通过服务组合实现业务流程。理解SOA需要熟悉XML、HTTP/HTTPS作为基础协议,以及SCHEMA/DTD用于XML数据...

    web service reference

    - **Eclipse WTP (Web Tools Platform)**:Eclipse的一个插件,提供了一整套工具用于Web应用和Web Service的开发。 - **Spring Framework**:Spring提供了对Web Service的支持,包括对SOAP和RESTful服务的支持。 ##...

    J2EE Web Service

    J2EE(Java 2 Platform, Enterprise Edition)规范描述了如何将多种企业级Java API集成到一个完整的平台中。具体而言,J2EE 1.4规范告诉我们应用服务器如何配置和部署Enterprise JavaBeans(EJB)2.1、Java Servlets...

    PB11开发Web Service应用

    "PB11 開發Web Service 應用.pdf"文档很可能会包含具体的实例,指导开发者如何从头开始创建一个简单的Web Service,包括定义服务接口、实现业务逻辑、发布服务以及在PB11中创建客户端进行调用等步骤。 五、学习资源...

    SAP web Service 基础教程

    SOAMANAGER 是 SAP Netweaver 平台上的一个基于 Web Dynpro 的程序,用于管理和配置 Web 服务。通过 SOAMANAGER,可以发布和管理 SAP 系统中的 Web 服务,实现 SAP 与其它系统的集成。 六、结论 本教程对 SAP Web ...

    《实战Delphi6/Kylix2/SOAP/Web Service程序设计篇》(

    在《实战Delphi6/Kylix2/SOAP/Web Service程序设计篇》这本书中,作者李维精心编撰了一套系统而全面的教程,针对的是Delphi6和Kylix2这两个经典的Visual Basic derivative (VBD) 编程环境,尤其是针对SOAP(Simple ...

    delphi 6/Kylik2 soap/Web Service程序设计篇下册+代码,非常好的教程。

    TSoapServer可以绑定到一个方法或接口,使得这个方法可以通过SOAP调用。TSoapClient则负责向远程SOAP服务器发送请求并接收响应。 2. **Web Service定义**: Web Service的接口通常使用WSDL(Web Services ...

    T100 Web Service 接口开发v1.5版.rar

    综上所述,T100 Web Service接口开发v1.5版是一个全面的解决方案,涵盖了接口设计、开发、测试和应用等多个环节。通过深入学习提供的文档、示例和库文件,开发者能够有效地利用这个接口实现T100PDA与其他系统的数据...

    用Delphi实现Web Service的简单示例

    1. **获取WSDL**:Web Service发布后,你可以得到一个WSDL(Web Service Description Language)文件,它描述了服务的接口、消息格式和位置。 2. **创建客户端代理**:在Delphi中,使用WSDL Importer导入WSDL,这会...

    Web Service编程:用C#开发网络服务

    Web Service编程是现代软件开发中的一个重要领域,尤其是在分布式系统和跨平台通信中。C#作为.NET框架的主要编程语言,提供了强大的工具和库来创建和消费Web Service。本篇将深入探讨C#环境下开发Web Service的相关...

    Spring Web Service实例

    Spring Web Service是Spring社区基于Spring提供的一个关注于创建”文档驱动”的Web Service的模块, 它的主要目标是方便基于”契约优先”(Contract-First)的SOAP服务的开发. 好像没有多少人讨论, 大多数的话题都是...

    web service 天气预报 web service 天气预报

    web service 天气预报web service 天气预报web service 天气预报web service 天气预报web service 天气预报web service 天气预报

    什么是Web Service

    这里的`weather.asp`就是一个简单的Web Service实例,它公开了一个可以通过Web调用的API。 #### 更深入的理解 除了基本的HTTP GET请求,Web Service还可以通过更复杂的协议(如SOAP)来提供更丰富的功能。SOAP消息...

    编写一个简单的Web Service

    ### 编写一个简单的Web Service #### 知识点概览 - **开发环境搭建**:包括Windows 2000 + IIS、Visual Studio .NET、SQL Server。 - **Web Service创建流程**:通过Visual Studio .NET创建一个新的C# ASP.NET Web ...

    delphi web service接口实例

    首先,创建一个新的VCL Forms应用程序,然后添加`TWebModule`组件到表单上。`TWebModule`是提供Web服务的基础,它包含处理HTTP请求的方法。接着,创建一个接口(如`IWebService`),定义你需要暴露的服务方法。例如...

    用vfp编写Web Service

    首先创建一个新的Class Library,然后在其中定义服务类,这个类将包含Web Service的所有方法。 2. **定义服务接口**:在服务类中,你需要声明并实现服务的公共方法。这些方法将被Web Service客户端调用,通常需要...

Global site tag (gtag.js) - Google Analytics