日期:2014-05-16 浏览次数:20369 次
??? N年前,一说到跨平台的服务方案,大牛们就想到"Socket Server",小兵们就一直退,退到会议室的墙角。
??? 几年前,一说到跨平台的服务方案,连客户都会想到"Web Service"。
??? 现在,是个人都可以,在几分钟里,使用REST风格把一个服务的客户端和服务端写出来。
??? REST首先是一个词,然后代表了一种服务提供模式。嗯,圣贤说,任意服务协议,都可以拆成传输协议,服务模式,数据格式三维表达,那REST就是依赖http作为传输机制,request-reponse模式,数据是预先协商好的任意格式。
??? 结果,任何语言的客户端,随便用一个http库访问某个URL,将请求信息写成XML或JSON或纯字符串,放在POST实体中。服务端也任意的实现一个servlet甚至jsp/asp/php,接收客户端发过来的请求,返回XML/JSON/字符串的结果就完了。
???So Easy,心里是不是立刻就想到了实现的方式。Java里用Apache的HttpClient??发送一个POST请求。
HttpClient?httpClient?=?new?HttpClient(); EntityEnclosingMethod?method?=?new?PostMethod(url);?method.setRequestBody(fooXml); method.setRequestHeader("Content-type","application/xml;?charset=utf8");? httpClient.executeMethod(method);? String?body?=?method.getResponseBodyAsString();?
?
??? 另外一个XML/JSON的操作库,严重推荐codehaus的xstream?,很漂亮的在xml/json和java对象间转换。比其他重型的xml binding方案便捷得多,下面是xml与java对象互转的代码。
Xstream??xs?=?new?Xstream();? String?xml?=?xs.toXML(foo); Foo?foo?=?(Foo)xs.FromXML(xml);??
?
??? .Net下面就更简单,http库和xml库都自带了。
???? 这是个最吸引人的地方,就是REST里,写服务不再是一个框架级的事情,不再需要配置文件和回调函数,只要懂几个API,甚至API都不要,白手DIY出服务来。InfoQ的这篇文章不错:Simple JAVA and .NET SOA interoperability?
??? 罗喧说,REST是面向消息(资源)的简单交互逐步替代RPC。真正的REST有如下的主张:
<order self='http://example.com/customers/1234' > <amount>23</amount> <product ref='http://example.com/products/4554' /> </order>
????当然,REST简单也有简单的代价,比如缺乏了事务、可靠性、WS-Address、UDDI等机制。不过这些机制在正统的WebService世界里使用的也不多。对于那些没有使用任何附加机制的纯WebService,都可以考虑用REST编写,或者像DIY事务?一样自己设计协议。
???另外需要客户自解释Payload,或是依靠Server方提供的SDK,而不能从直接WSDL生成DTO,WADL