I have been learning and working on REST for a while now. But I have on many blogs that there are disconnects between what REST actually is and what is perceived. So I wanted to write an article based on my understanding of REST. I would talk here about what REST actually is and how to design systems that follow the principles of REST. I will talk about following things in the series.
- Components of modern distributed architecture
- Properties of RESTful design
- What REST is and what it is not?
- The journey to RESTfulness
- REST and the rest
- RESTful Architecture
- Elements of RESTful Architecture
- Designing for RESTful Services
- REST and Cloud
Components of modern distributed architecture
Distributed application development is more challenging in the modern times as we are dealing with of everything users, services, hardware, etc. Few of the major problems that we face today are:
Interoperability between heterogeneous applications
In simple words we want to integrate different applications which have been developed with different frameworks and might even run on different platforms. You must have seen multiple ways to sign up or share various website. It’s a live example of integration of heterogeneous applications in one place. These are different service providers who could not make assumptions for the applications and services provided by any other platform and yet we would like to use all these providers at one place.
We want these different integration pieces to simple, consistent and reliable.
Diversity in Devices
REST is based on the idea of a network based API rather than a library based API and this goes hand in hand with integration of heterogeneous applications and services available. Today we want the integration to be device independent. When we say devices we not only mean smartphones and tablets, it includes most of the electronic devices including cameras, navigation devices, watches, car in dash and what not.
We want our services and applications to work seamlessly for all the devices. Since most of these devices run native apps and not web based applications maintenance and updates are big challenges. And you could imagine the issues we might come across for performance and efficiency when working with multiple devices because of the network availability and amount of data that can be transferred on the network (data being paid as per usage).
To be or not to be: Cloud
Apart from the interoperability between different services and different devices a major problem that we face is the number of users simultaneously accessing the service. We could most out of the scalable infrastructure if have a scalable architecture. The various organizations have already been taking the advantage of the elastic infrastructure provided by various companies. The elastic infrastructure allows the business to automatically grow or shrink the computing power and storage capacity of the applications according to the number of users and pay only for the resources that are used.
However we need to understand that cloud just provides the hardware and capability to scale our applications and services and we need to develop our applications and services in a way so that could utilize the various capabilities offered by cloud. We need to build saleable architecture to take advantage of saleable infrastructure.
We could design scalable architectures by neither depending on the middleware in our infrastructure nor on the hardware does that have inherent limitations of its own. We should build applications with transparency in mind so that in case of any errors or failures we don’t have to dig through for days.
The gives us the capability to eliminate the situations shown on the left and provide us a clean (that’s all you need to think) and maintenance free hardware.
Properties of RESTful design
There are various properties of REST design align with the solutions of the challenges that we discussed above.
- Heterogeny – The ability to seamlessly interoperate with other participants regardless of language or platform.
- Scalability – The ability to limit complexity between components in a distributed system, efficiently handling requests and scaling out horizontally when needed.
- Evolvability – The ability for client and services to evolve independently of one another.
- Visibility – The ability for value added components such as intelligent gateways to operate correctly without needing access to any hidden or proprietary state such as session state.
- Reliability – The ability for clients to recover more reliably from failures by developing rich compensation strategies.
- Efficiency – The ability for multiple components such as proxy servers and caches to participate in the handling of requests taking load away from your server.
- Performance – The ability to use caches, greatly improving the speed in which a response can be delivered, giving the impression of increased performance.
- Managability – The ability for simpler management due to interactions between components happening in a highly consistent and visible way.
One or more of these properties align with solving each of the challenges that we discussed previously.
What REST is and what it is not?
REST is not RPC – In RPC the design target of a network interaction is a remote function and the goal RPC of RPC to abstract all the network details so that the developer writing the code should not care about the components interacting over the network.
Whereas in REST the design target of a network interaction is a network resource. Also the network schematics are part of the design.
REST is not just HTTP – Http is the underlying architecture on which REST is based but using just HTTP verbs correctly does not make our services completely RESTful. However most RESTful systems use HTTP as the underlying platform
REST in not just URI – URIs hold an important place in RESTful design but extreme focus on URIs could push us back to thinking designs more the RPC way.
REST is not just anything that is not SOAP – SOAP is more of an implementation detail and REST is more like an architectural style. SOAP aligns iteslf with RPC design style and anything which not SOAP does not imply that it is REST.
Representational State Transfer better known as REST is an architectural style defined in the dissertation of Dr. Roy Fielding at University of California, Irvine in 2000. He designed REST for larger architectural concepts on which web was designed. As per fielding the phrase “Representational state transfer” represents for how a well-designed application behaves as virtual state machine of web pages where progress is made via links.
The journey to RESTfulness – Richardson’s Maturity Model
This model gaining attention and importance in the community and has been referred by Martin Fowler and books like The RESTful CookBook. It is a model we could use to grade our API as per the constraints of REST. The more our APIs adhere to these constraints the closer they are towards RESTfulness.
The different steps in the image below represent the incremental steps towards REST. These are in no way the levels of REST.
L0 – represents that we are following the RPC style with the Plain Old XML (POX). This is the most elementary level of the service maturity.
L1 – represents the use differentiated resources.
L2 – represents the usage of HTTP verbs and HTTP status codes.
L3– represents the use of hypermedia controls.
More details on the Richardson’s Maturity Model could be found at Martin Fowler’s blog.
Any Questions, Comments and feedback are always welcome.