How do I discover RESTful Web services? - web-services

When I want to find a "Big" Web service (WS-*/WSDL based) of required functionality I can simply google for ".... filetype:wsdl" because Google indexes also WSDL definitions. Or I can simply use some registries that already crawled the Web for WSDL definitions for me, e.g. SeekDa.com or ServiceFinder.
When I want to find RESTful Web service (RESTful Web API) I may count only on the community, because it is not possible to distinguish between URI of RESTful Web service and other Web resources (e.g. Web sites URLs) and hence any focused crawler cannot tell for 100% sure: this is URI of RESTful Web service. So, I come e.g. to the ProgrammableWeb.com and I hope someone already used/found the service I'm looking for and registered it there.
Recently, I was looking for the Web service for abbreviation expansion. I couldn't find it in portals like ProgrammableWeb, because no-one has put it there. Finally I was forced to browse through several abbreviation dictionaries sites, dig and drill there and I finally found Abbreviations.com Web service API in RESTful form. That took me a lot of time!
Is there any other Way to discover RESTful Web services on the Web?

There is a convention (recommended in REST API Design Handbook for example) that you expose a /api endpoint at the root of your service. This returns an XML or JSON response containing the "child" resources that your service supports e.g. /api/products

The REST ideal is that services are as consumable as Web Pages are, they don't need registries. [Got to admit I don't fully "get" the implications of this RESTful world, no WSDL, no registry feels like riding a bike with no stabilisers.]
In the old Web, pre-Google, how did we find pages? Effectively word-of-mouth and a few key starting points. REST services so far as I can see are pretty much in the pre-Google stage.
I don't agree that "it is not possible to distinguish between URI of RESTful Web service and other Web resources" - if we follow the link we get certain types of content application/xml and application/json would be pretty strong indicators wouldn't they?

There's a WSDL-like file for REST webservices: it's called WADL.

SoapUI now can discover the REST services. It works as a proxy, writing down all requests/responses that pass through. Having requests and responses SoapUI recreates descriptions/definitions of the services.
Now the definitions can be stored in WADL and WSDL formats (as WSDL and XML-Schema in XML world). It also can be stored in Swagger format. I prefer Swagger.
Swagger can be stored in SwaggerHub right from SoapUI, which is like GitHub for source code. SwaggerHub is one of many API management systems.

Related

Is there any repository like UDDI for publishing and discovering RESTful web service?

I am a novice to web service repository and i want to discover REST based service matching a keyword phrase or some parameters. Is there any repository available like UDDI for SOAP services?
Here are the links where related topics have been discussed
1 How do I discover RESTful Web services?
2 publishing and discovering REST web services
but no where it has been explicitly described how to pursue this task(like a complete tutorial link where RESTFUL web service has been published and retrieved )
Hope to get a well explained answer
Thanks in advance !
It's going to depend on what product are you using for discovery.
MDNS, try using JNDNS for Java. The method you want is probe and you'll have to listen for responses to the query for some predefined String that represents your endpoint. Sometimes people us DNS TXT records or SRV locators for the URL. Here's a good example
UDDI, specifically jUDDI (and 1 or two others) has a REST API that you can invoke. It works well if you know the 'key', or a unique identifier of the service. Since UDDI's data is complex, jUDDI has a FindEndpoints method which can return JSON or XML structures. HTTP GET to http://localhost:8080/juddiv3/services/inquiryRest/{XML,JSON}/endpointsByService/{id}
The response is of type UriContainer, which is just a list of Strings, each representing a valid URL that you should be able to do something with. There's a few more examples in the TCK Tests for juddi here
repository solution can provide some facilities such as service discovery, event notification that a normal DBMS cannot.

Is it possible for Spring RESTful services to privde a WADL or something similar?

Situation:
We are planning to build a set of new services a long side a set of old SOAP (Spring, apache CXF) web services. Our customers are used to being able to use ?wsdl to get a wsdl describing a service and the content it will accept/return.
I'm looking at providing the new services via spring controllers and RESTful urls. However not all of a request can be handled via a RESTful url, so we still need to have a payload request and responses. I'm looking at use #RequestBody and #ResponseBody and spring's Message Converters to auto(magically) handle both XML and JSON content. The idea being to let spring do as much of the heaving lifting as possible.
The problem:
I'm trying to figure out if it's possible given the REST/Message converter concept, to be able to provide a description of a service and it's request/response data in a similar fashion to the ?wsdl request. I understand that there are WADL documents that can be generated by some systems, but they appear to be a proposel and not fully accepted yet.
Does anyone know if spring can generate WADLs or something else that I can use to allow clients to query the RESTful services data structures?
SpringMVC doesn't support WADL auto generation, mostly because it doesn't use the JSR-311 standard REST API.
I have create a blog entry with a simple WADL generation Controller in java :
Tuxgalaxy Blog Entry.
But Tomasz Nurkiewicz also provide a WADL generation Controller in scala :
nurkiewicz Blog Entry.
You could use CXF JAX-RS for your REST services since you're already using it for SOAP (you can even expose the same service as SOAP and REST with CXF), and CXF gives you the WADL that you want by adding ?_wadl&_type=xml
The following code will work with Spring REST 4x and its based on the suggested code by tuxgalaxy provided on below https://jira.spring.io/browse/SPR-8705
http://javattitude.com/2014/05/26/wadl-generator-for-spring-rest/

Some doubts about RESTful web services?

I am new to the arena of RESTful services. I have been going through the articles about REST. And I have a lots of doubts. Please help me to clear these doubts. Thanks in advance.
1) For all RESTful web services, will there be a WSDL/WADL for describing the service? Is it mandatory to have service description? If there is no description, how can I know the data and its structure that I have to send along the HTTPRequest?
I read like, the request content could be any type (XML, JSON, YAML etc.). And there is no restriction for the content-type that could be send with request. Without a description how can I know the type of data that I am supposed to send?
2) By going through the articles, I have got the impression that RESTful services is used mainly for CRUD operation kind of services. Different HTTP verbs for different operations. But if you take web services, it can do all kinds of operations. For example, adding 2 numbers is not exactly a CRUD operation. If I use GET/POST to the resource which could do this operations for me, then will it be a violation of REST principles?
3) If you can point me to any public RESTful webservices that could be used for testing, I could try using the service and get an idea how complex the services could be.
Thanks in advance,
Paul
There is normally no machine-readable service description. You would typically know what to send by reading the documentation for the service.
REST isn't limited to CRUD and the PUT/GET/POST/DELETE methods are not necessarily the same as create/retrieve/update/delete. REST-based services can do anything that SOAP-based web services can do. It is completely RESTful to send a GET request to a URI like http://example.com/add?3,5.
You can find a list of REST services at http://www.programmableweb.com/apis/directory/1?protocol=REST.
Answer to your first question :
WSDL/WADL is not mandatory for restful webservices. Also, WSDL 1.1 HTTP binding was inadequate to describe restful webservice.
However, WSDL 2.0 can be used to describe it. Restful webservice should be used when the client and provider have mutual understanding of the contract.
Have a look at : http://www.ibm.com/developerworks/webservices/library/ws-restwsdl/
Second : Yeah, you can accomplish almost everything from crud operations. Like stated in previous answer http://example.com/add?3,5. is a valid crud.
No WSDL/WADL files. You get the HTTP protocol (e.g. GET, POST, UPDATE, DELETE) and everything else is up to you. Make sure to document your expected inputs and outputs accordingly.
No, RESTful web services are not restricted to CRUD. For your adding service, I would implement it as an "adder" resource which would take as input the 2 numbers to add. You could take these inputs as part of the url path (http://yourdomain.com/adder/1/2) or in the query string params (http://yourdomain.com/adder?var1=2&var2=2) or as inputs from an HTTP POST. Up to you.

What is web-service and how to develop it

I am looking for some good starting point for developing web-service.
I have one application which has C++ library support using which I can get all the details of the product.
I am supposed to write web service SDK for the same.
Any help.
Web services generally refer to a technique that allows code to be called via HTTP requests and responses. This is similar to a web page, except that what is returned from a web service is usually not HTML intended to be displayed in a browser - it is usually data of some kind.
"Web Service" is one of those terms that means whatever the person saying it means. Basically, its just a way to access data or functionality via http. There's a few standardized methods - REST, SOAP for web services, or you can just serve up XML, JSON, or other data from a plain old server side web app.
What you'd want to do is investigate what form this Web Server you are supposed to write needs to be in (SOAP, REST, something else), and then go from there.

Can a server page (jsp, aspx) be used as Web Service

What is the difference between using a "Web Service" and calling a server page such as JSP/ASPX?
To me it looks like a Web Service is just a framework around the server pages. For e.g. I can have a JSP page that takes:
mypage.jsp?method=getupdate&param1=23&param=44
(I can also send these variables through POST)
In my JSP page I can call the appropriate method based on the value of "method" and return a value back to the caller client app. Is this the raw form how a Web Service actually works? OR is there more to a Web Service call like someone told me that when you call a page, it is rendered but a Web Service is not rendered. But What if I remove the HTML code from JSP page then?
So when we say XML Web Service, the difference is that the client and the server both wrap/unwrap the requests/responses using XML and POST it to the Web Service page.
Web Services are a well defined set of standards defined by the W3C and other relevant bodies, which mostly define an architecture that runs over a network to communicate diverse applications while ensuring interoperability, discoverability and some other relevant criteria.
You can certainly create a server page just for your application without SOAP or XML-RPC. It's just that you shouldn't call it a "Web Service" unless it outputs SOAP or XML-RPC and provides a WSDL description for itself, because that leads to confusion and show you don't know what the "standard Web Services" mean.
You are correct to say that web services are a layer on top of the server pages. One of the common types of web services are SOAP web services that wrap requests and response into XML to achieve interoperability between different platforms/frameworks.
Sites like Facebook and Flickr that have much the same kind of public APIs are calling them 'web services' and I don't see that you're doing anything different.
Vinko seems to have some objection to polluting the 'Web Service' moniker but there's plenty of room under the W3 definition of a web service to include what you're doing.
As for Web services having to output SOAP or XML and provide a WSDL? I think there's a few REST advocates that would argue that point.