Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What good open source REST webservice technology is out there?

Tags:

web-services

I'm looking for an alternative to the awesome .NET (WCF) REST capabilities.

Why?

I have deep interest in open source technology, but when it comes to webservices I do not have any experience except with .NET webservices.

Besides, I'm currently using a lot of Java and Python, and I am moving away from the Microsoft technology stack.

Please suggest alternatives in any programming language, but explain why it's good or better for some reasons. (this reason may be be tightly related with the choice of language)

What do I want to know?

  • Ease of use
    • Installation
    • Configuration
    • Generation capabilities
    • IDE integration
    • Deployment
  • Learning curve
  • Pros and cons
  • etc.
like image 995
Sander Versluys Avatar asked Feb 04 '11 16:02

Sander Versluys


People also ask

Which technology is best for REST API?

Postman. “It is probably the most popular tool for testing your REST API. If you take a look at their website, you'll find that Postman is used by 5 million developers and over 100,000 businesses to access 130 million APIs each month. It is also feature rich and supports all stages of the REST API life cycle.

Which API is available for REST API?

Rest Assured Rest Assured is an API tool that facilitates easy testing of REST services. It's an open-source tool and a Java domain-specific language designed to make REST testing simpler.


1 Answers

Spring 3.0 REST:

Spring uses annotation based controllers, which can be used to bind a url to a method in the controller. Annotations are used to differentiate between GET methods and POST methods.

@RequestMapping(value="/hotels/{hotel}/bookings/{booking}", 
       method=RequestMethod.GET)
public String getBooking(@PathVariable("hotel") long hotelId, 
           @PathVariable("booking")     long bookingId, Model model) {

    Hotel hotel = hotelService.getHotel(hotelId);
    Booking booking = hotel.getBooking(bookingId);
    model.addAttribute("booking", booking);
    return "booking";
}

Under the hood, the variable "hotel" in the URI string is converted to a long in the parameter list, as is booking. Spring REST can also marshal JSON objects into custom classes using this same technique. Note that this method is annotated as RequestMethod.GET, which means it's invoked for GET requests but not POST requests.

Spring 3.0 REST makes it easier to create RESTful Web services by eliminating the need to reinvent the wheel or marshal/unmarshal JSON text by hand from/to Java objects.

There is a demo here on the SpringSource Blog titled REST In Spring MVC. The learning curve is low, but getting the demo to work may take some time thanks to dependencies. Once you get setup and have a working demo, the hardest part should be over.

For IDE integration, check out Spring Roo. I've not used it, but I've heard it has some features that integrate with Eclipse IDE to make your life easier.

Restlets:

Restlets were designed solely for REST. As a result, the overhead is a lot lower than Spring 3.0. Restlets are better suited for cases where you don't have a GUI, and where you aren't concerned with MVC. Restlets can easily serve as both a server and a client. It also has an embedded server you can run, which eliminates the need for a container like Jetty or Tomcat.

I've had very little exposure to Python, but from what I've seen of Google App Engine's implementation of the webApp framework, the Router concept feels very similar. Those with a Python background may find the learning curve to be a lot lower:

@Override
public Restlet createInboundRoot() {
    Router router = new Router(getContext());
    getConnectorService().getClientProtocols().add(Protocol.FILE);

    // Serve the files generated by the GWT compilation step.
    Directory dir = new Directory(getContext(), LocalReference.createFileReference(new File("war/")));
    router.attachDefault(dir);
    router.attach("/contacts/123", ContactServerResource.class);

    return router;
}

It uses GWT on the client-side; I prefer to take that part out as it reminds me too much of Java Swing. While some people may find that advantageous, my personal preference is to stick with the technologies that feel more like the Web.

Below is a simple example of a REST server using the standalone mode. The server runs on port 8182, and it listens for GET requests. It has a similar annotation-based model as the Spring REST framework, which also helps split up the different HTTP methods and point them at different methods in your classes. This is a very basic "Hello World" REST example:

public class FirstServerResource extends ServerResource {  

   public static void main(String[] args) throws Exception {  
      // Create the HTTP server and listen on port 8182  
      new Server(Protocol.HTTP, 8182, FirstServerResource.class).start();  
   }

   @Get  
   public String toString() {  
      return "hello, world";  
   }

}  

Check out the Restlet Web Site for more information and examples of the Restlets framework. Restlets has a slightly less learning curve than Spring because it's targeted to REST; as a result, it doesn't contain all of the extra functionality included with Spring that can sometimes make finding an answer to a problem difficult. Restlets are definitely the way to go if you're looking for something lightweight.

Both of these two frameworks will run in Tomcat, Jetty, as well as on Google App Engine.

like image 113
jmort253 Avatar answered Nov 10 '22 03:11

jmort253