`
chelsea
  • 浏览: 117787 次
  • 来自: ...
社区版块
存档分类
最新评论

Web Services:自洽,编码,交换模型

    博客分类:
 
阅读更多
1, 自洽
以前曾经写过:
目前WebService不是自洽的,即一个WebService方法的参数和返回值不能是另外一个WebService,因此你不能在WebService的返回值上调用业务逻辑方法;顶多开发包做点手脚,包装几个getter/setter方法,或同构平台上在客户端拥有服务端的类定义,可以调用其方法,像.Net平台上的DataSet;参考开发包的处理,我们可以自己为WebService的返回值加入业务逻辑方法
a,开发包无非是为客户端生成一堆代理类,完成序列化/反序列化,解析远程调用协议等
b,我们可以修改这些代理类,加入业务逻辑方法,只要不影响序列化/反序列化,解析远程调用协议那些原有的部分就行
参考以前的远程过程调用协议,COM,RMI等,都能通过一个远程对象返回另外一个远程对象,可以调用各种方法,WebService完全应该定义其返回值、参数可以是另外一个WebService 
最近看了<<我应该采用哪一种WSDL样式>>, 文中提到RPC/Literal编码方式的href属性,让我联想起以前的想法,其实如果规定客户端Stub必须是可序列化的,那么是否就有可能解决WebService的参数和返回值可以是另外的WebService呢(或说是另外的WebService的客户端Stub类呢)?
2. Content-Type
SOAP 1.1 HTTP/SOAP 消息的媒体类型为“text/xml”,其编码处理是在 RFC2376 中定义的。而 SOAP 1.2 HTTP/SOAP 消息的媒体类型为“application/soap+xml”,其编码处理是在 RFC3023 中定义的。这些 RFC 规范定义了下列行为:

SOAP 1.1: HTTP/SOAP 请求的字符集由 HTTP 头中的 ContentType 字符集参数确定。在 SOAP 消息的 XML 声明部分定义的编码特性将被忽略。如果不指定 ContentType 字符集参数,字符集将被视为 US-ASCII。

SOAP 1.2: HTTP/SOAP 请求的字符集由 HTTP 头中的 ContentType 字符集参数确定。在 SOAP 消息的 XML 声明部分定义的编码特性将被忽略。如果未指定 ContentType 的字符集参数,将使用在 XML 声明部分定义的编码特性。如果 ContentType 字符集参数或 XML 声明的编码特性均未定义,它将被视为 UTF-8。
Content-Type: text/html;charset=GB2312
Content-Type: text/xml; charset=utf-8
3,UTF-8,Axis?支持其它编码?How to ?希望各位看官给个下面问题的答案
POST /wstest/NetWebService/SampleSer<wbr></wbr>vice HTTP/1.1
Host: localhost
Content-Type: text/xml; charset=utf-8  <!--1, how can I change it to charset=shift_jis using axis? Thanks-->
Content-Length: length
SOAPAction: "http://tempuri.org/max"

<?xml version="1.0" encoding="utf-8"?> <!--2, how can I change it to encoding="shift_jis" using axis? Thanks-->
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchem<wbr></wbr>a-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchem<wbr></wbr>a
" xmlns:soap="http://schemas.xmlsoap.org<wbr></wbr>/soap/envelope/">
  <soap:Body>
    <max xmlns="http://tempuri.org/">
      <a>int</a>
      <b>int</b>
    </max>
  </soap:Body>
</soap:Envelope>
Assume the operation name is not "max", but a japanese string, and I prefer shift_jis to utf-8, then what should I do?
4, 文档交换vs. RPC模型
以下内容来自<<Webservice 的设计和模式>>
RPC(Remote Procedure Call)本质上就是远程方法的调用。尽管Webservice是基于XML的但是你仍然可以使用远程方法调用这种模式来进行Webservice的实现,尤其是在那种简单的请求相应的模型中。在这个过程中,传输中的XML文件所描述的更多是有关远程方法的信息,比如方法名,方法参数等等。
而文档交换方式,与RPC相比较在XML文件中不是做远程方法的映射,而是一份完整的自包含的业务文档,当Service端收到这份文档后,先进行预处理(比如词汇的翻译和映射),然后再构造出返回消息。这个构造返回消息的过程中,往往不再是简简单单的一个方法调用,而是多个对象协同完成一个事务的处理,再将结果返回。
这两种方式的区别,类似与打电话和发邮件的不同处理方法。在目前,对于第一种方法提供了很多自动化的工具使得远程方法的调用能够很容易的完成,而后一种方法缺少一系列工具的支持,需要开发者手工完成。
尽管如此,在此还是推荐使用文档交换的方式。由于它在以下方面具有RPC所不具备的优点。
  • 使用文档方式,你可以充分利用XML文件的功能去描述和验证一份业务文档,而在RPC模型中XML仅仅被用于描述方法的信息。
  • 使用文档方式,在客户的Service的提供者之间不再需要紧密的约定,而RPC模型需要客户和Service的提供者紧密相连,一旦方法发生变化,客户端就需要做相应的改动。这不符合低耦合系统的要求,而在文档交换方式中则灵活的多。
  • 由于业务数据是自包含的,显然文档模型更利于采用异步处理。

以下内容来自<<我应该采用哪一种WSDL样式>>
Java 方法 : public void myMethod(int x);
Binding Type
WSDL Sample
SOAP Sample
Advantage
Disadvantage
RPC/Encoded
<message name="myMethodRequest">
<part name="x" type="xsd:int"/>
</message>
<message name="empty"/>

<portType name="PT">
<operation name="myMethod">
<input message="myMethodRequest"/>
<output message="empty"/>
</operation>
</portType>

<binding .../>
<!-- I won't bother with the details, just assume it's RPC/encoded. -->
<soap:envelope>
<soap:body>
<myMethod>
<x xsi:type="xsd:int">5</x>
</myMethod>
</soap:body>
</soap:envelope>
WSDL 基本达到了尽可能地简单易懂的要求。
操作名出现在消息中,这样接收者就可以很轻松地把消息发送到方法的实现。
  • 类型编码信息(比如 xsi:type="xsd:int" )通常就是降低吞吐量性能的开销。
  • 您不能简单地检验此消息的有效性,因为只有 <x xsi:type="xsd:int">5</x> 行包含在 Schema 中定义的内容;其余的 soap:body 内容都来自 WSDL 定义
RPC/Literal
<message name="myMethodRequest">
<part name="x" type="xsd:int"/>
</message>
<message name="empty"/>

<portType name="PT">
<operation name="myMethod">
<input message="myMethodRequest"/>
<output message="empty"/>
</operation>
</portType>

<binding .../>
<!-- I won't bother with the details, just assume it's RPC/
literal. -->
<soap:envelope>
<soap:body>
<myMethod>
<x>5</x>
</myMethod>
</soap:body>
</soap:envelope>
WSDL 还是基本达到了尽可能地简单易懂的要求。
操作名仍然出现在消息中。
去掉了类型编码
您仍然不能简单地检验此消息的有效性,因为只有 <x xsi:type="xsd:int">5</x> 行包含在 Schema 中定义的内容;其余的 soap:body 内容都来自 WSDL 定义
Document/Litaral
<types>
<schema>
<element name="xElement" type="xsd:int"/>
</schema>
</types>


<message name="myMethodRequest">
<part name="x"
element="xElement"/>
</message>
<message name="empty"/>

<portType name="PT">
<operation name="myMethod">
<input message="myMethodRequest"/>
<output message="empty"/>
</operation>
</portType>

<binding .../>
<!-- I won't bother with the details, just assume it's
document/literal. -->
<soap:envelope>
<soap:body>
<xElement>5</xElement>
</soap:body>
</soap:envelope>
没有编码信息
您可以在最后用任何 XML 检验器检验此消息的有效性。 soap:body<xElement>5</xElement> )中每项内容都定义在 Schema 中
WSDL 变得有些复杂。不过,这是一个非常小的缺点,因为 WSDL 并没有打算由人来读取。
SOAP 消息中缺少操作名。而如果没有操作名,发送就可能比较困难,并且有时变得不可能。
Document/Literal
Wrapped
<types>
<schema>

<element name="myMethod"/>
<complexType>
<sequence>
<element name="x" type="xsd:int"/>
</sequence>
</complexType>
</element>

</schema>
</types>
<message name="myMethodRequest">
<part name="
parameters" element="
myMethod"/>
</message>
<message name="empty"/>

<portType name="PT">
<operation name="myMethod">
<input message="myMethodRequest"/>
<output message="empty"/>
</operation>
</portType>

<binding .../>
<!-- I won't bother with the details, just assume it's document/literal. -->
<soap:envelope>
<soap:body>
<myMethod>
<x>5</x>
</myMethod>
</soap:body>
</soap:envelope>
没有编码信息。
出现在 soap:body 中的每项内容都是由 Schema 定义的,所以您现在可以很容易地检验此消息的有效性。
方法名又出现在 SOAP 消息中
WSDL 甚至更复杂,但是这仍然是一个非常小的缺点
分享到:
评论

相关推荐

    Web+Services:技术、架构和应用

    - **XML**:XML是一种自描述的数据格式,用于结构化数据的交换。在Web服务中,XML被用来编码请求和响应,确保不同系统间的互操作性。 - **SOAP**:SOAP是用于在Web上传输结构化信息的协议。它定义了消息格式,并...

    J2EE Web Services: XML SOAP WSDL UDDI WS-I JAX-RPC JAXR SAAJ JAXP

    3. **WSDL(Web Services Description Language)**:WSDL是一种XML格式,用于描述Web服务及其接口。它定义了服务的位置、提供的操作以及如何调用这些操作,是消费者发现和理解Web服务的关键。 4. **UDDI...

    专业英语 Understanding Web Services

    随着信息技术的快速发展,Web服务(Web Services)作为一项新兴的技术,在过去的几年里受到了越来越多的应用程序开发者的关注,并逐渐成为企业间以及企业和客户之间沟通的重要手段之一。相较于传统的客户端/服务器模型...

    Professional C# Web Services - Wrox (VBL)

    2. **SOAP(简单对象访问协议)**:SOAP是Web服务中最常见的通信协议,用于交换结构化的、XML编码的信息。C#通过.NET框架支持SOAP协议,允许开发者创建和消费SOAP Web服务。 3. **WSDL(Web服务描述语言)**:WSDL...

    Programming Web Services with SOAP

    - **SOAP 消息交换模型:** SOAP 支持多种消息交换模式,包括请求/响应、单向和通知等。 - **SOAP 作为 RPC 风格 Web 服务:** SOAP 可以被用来实现远程过程调用(RPC),允许客户端调用远程服务器上的方法并获取...

    基于C# ,.net的webservices项目 轮渡开航早知道

    在IT行业中,WebServices是一种常见的应用程序接口(API)实现方式,它允许不同系统间通过网络进行通信和数据交换。本项目“轮渡开航早知道”就是这样一个利用C#和.NET框架构建的WebServices应用,其主要目标是为...

    XML Web Services高级编程范例(NET平台)

    2. 实现服务类:继承自System.Web.Services.WebService的类实现上述接口,提供实际的服务逻辑。 3. 添加服务方法:在服务类中,为每个操作添加方法,这些方法将处理来自客户端的请求。 4. 配置服务:通过添加Web....

    Web Services Policy 1.5 - Framework

    2. **语法**:与抽象模型对应的是具体的语法实现,可能是XML或其他格式,用于实际编码和交换政策信息。 3. **构建块**:定义了一组基础的构造元素,如条件、选择、交替等,它们可以组合起来描述复杂的政策需求。 4...

    OGC OWS GC web services GIS

    根据给定文件的信息,我们可以提炼出与OGC Web Services(开放地理空间联盟网络服务)相关的多个关键知识点。这些知识点涉及到了GIS(地理信息系统)领域的多种技术和服务标准。 ### OGC Web Services简介 OGC Web...

    基于OPC和Web Services的阵地一体化管理系统集成.pdf

    Web Services的使用则让阵地一体化管理系统能够与企业的其他系统(如ERP、CRM等)进行接口对接和数据交换,这不仅有助于自动化管理决策的制定,而且能够实现数据的跨系统共享,促进业务流程的优化。 为了实现基于...

    webservices课件

    Web服务(Web Services)是一种基于互联网的、使用标准协议(如HTTP)进行通信的技术,它允许不同的应用程序之间进行数据交换和协同工作。在.NET框架下,Web服务是通过SOAP(Simple Object Access Protocol)消息来...

    JSR 181 Web Services Metadata for the JavaTM Platform

    - **开发模型**:该标准支持两种主要的开发模型: - **注解驱动模型**:开发者可以通过在类或方法上添加特定的注解来声明服务的行为。 - **配置文件驱动模型**:通过配置文件(如`web.xml`)来定义服务的行为。 -...

    用于实现Web服务的SOA编程模型.

    Web服务是基于开放标准(如XML、SOAP、WSDL和UDDI)的自包含、自解释的应用程序,可以通过网络进行交互。它们通常通过HTTP协议传输数据,使得跨平台集成变得简单。 **2. SOAP(Simple Object Access Protocol)** ...

    Visual C#.NET网络编程PDF文件,本书结合大量实例,全面介绍了基于Visual C#.NET的网络编程,内容包括Web Forms、ASP.NET、TCP/UDP端口通信、远程访问、MSMQ消息队列、电子邮件客户端系统、网络编程应用技巧与Web Services等。

    8. **Web Services**:Web Services是一种基于标准的、平台无关的方式,使得不同系统之间可以互相交互数据。在C#.NET中,可以使用ASP.NET Web Services(ASMX)或WCF来创建和消费Web服务,实现跨平台的数据共享。 ...

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

    &lt;webServices&gt; &lt;/webServices&gt; &lt;/system.web&gt; &lt;services&gt; &lt;add baseAddress="http://localhost:8080/MyWebService/"/&gt; &lt;/services&gt; ``` 完成以上步骤后,就可以...

Global site tag (gtag.js) - Google Analytics