RESTful 服务-WSDL 等效

我一直在阅读关于 REST 和 SOAP 的文章,并且理解为什么实现 REST 比使用 SOAP 协议更有益。然而,我仍然不明白为什么在 REST 世界中没有“ WSDL”等价物。我看到过一些帖子说“没有必要”使用 WSDL,或者在 REST 世界中它是多余的,但是我不明白为什么。以编程方式绑定到定义并创建代理类而不是手动编码不是总是很有用吗?我并不想进入哲学辩论,只是想知道 REST 中没有 WSDL 的原因,或者为什么不需要它。谢谢。

106124 次浏览

WSDL describes service endpoints. REST clients should not be coupled to server endpoints (i.e. should not be aware of in URLs in advance). REST clients are coupled on the media-types that are transfered between the client and server.

It may make sense to auto generate classes on the client to wrap around the returned media-types. However, as soon as you start to create proxy classes around the service interactions you start to obscure the HTTP interactions and risk degenerating back towards a RPC model.

WSDL is extensible to allow description of endpoints and their messages regardless of what message formats or network protocols are used to communicate

However, REST uses the network protocol by using HTTP verbs and the URI to represent an objects state.

WSDLs tell you at this place, if you send this message, you'll perform this action and get this format back as a result.

In REST, if I wanted to create a new profile I would use the verb POST with a JSON body or http server variables describing my profile to the URL /profile

POST should return a server-side generated ID, using the status code 201 CREATED and the header Location: *new_profile_id* (for example 12345)

I can then perform updates changing the state of /profile/12345 using the HTTP verb POST, say to change my email addresss or phone number. Obviously changing the state of the remote object.

GET would return the current status of the /profile/12345

PUT is usually used for client-side generated ID

DELETE, obvious

HEAD, gets the status without returning the body.

With REST it should be self-documenting through a well designed API and thus easier to use.

This is a great article on REST. It really help me understand it too.

The Web Application Description Language (WADL) is basically the equivalent to WSDL for RESTful services but there's been an ongoing controversy whether something like this is needed at all.

Joe Gregorio has written a nice article about that topic which is worth a read.

The Web Application Description Language (WADL) is an XML vocabulary used to describe RESTful web services.

As with WSDL, a generic client can load a WADL file and be immediately equipped to access the full functionality of the corresponding web service.

Since RESTful services have simpler interfaces, WADL is not nearly as necessary to these services as WSDL is to RPC-style SOAP services.

There is an RSDL (restful service description language) which is equivalent to WSDL. The URL below describes its practice http://en.wikipedia.org/wiki/HATEOAS and http://en.wikipedia.org/wiki/RSDL. The problem is that we have lots of tool to generate code from wsdl to java, or reverse. But I didn't find any tool to generate code from RSDL.

RSDL aims to turn rest like a hypermedia, in other words, it has more information than a service descriptor like WSDL or WADL. For example, it has the information about navigation, like hypertext and hyperlinks.

For example, given a current resource, you have a set os links to another resources related.

However, i didn't find Rest Clients that supports this format or Rest Server Solutions with a feature to auto generate it.

I think there is a long way for a conclusion about it. See the HTML long story and W3C vs Browsers lol.

For more details about Rest like Hypermedia look it: http://en.wikipedia.org/wiki/HATEOAS

Note : Roy Fielding has been criticizing these tendencies in Rest Apis without the hypermidia approach: http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven

My Conclusion : Now a Days, WADL is more common that Rest and Integration Frameworks like Camel CXF already supports WADL ( generate and consume ), because it is similar to WSDL, therefore most easy to understand in this migration process ( SOAP to REST ).

Let's see the next chapters ;)

WSDL 2.0 specification has added support for REST web services too. Best of both worlds scenario. Problem is WSDL 2.0 is not widely supported by most tools out there yet. WSDL 2.0 is W3C recommended, WSDL1.1 is not W3C recommended but widely supported by tools and developers. Ref: http://www.ibm.com/developerworks/library/ws-restwsdl/

Isn't it always useful to programmatically bind to a definition and create proxy classes instead of manually coding?

Agree wholeheartedly, this is why I use Swagger.io

Swagger is a powerful open source framework backed by a large ecosystem of tools that helps you design, build, document, and consume your RESTful APIs.

So basically I use Swagger to describe my models, endpoints, etc, and then I use other tools like swagger-codegen to generate the proxy classes instead of manually coding it.

See also: RAML