2012-09-17 23:21:26 +04:00
<!DOCTYPE html>
< html lang = "en" > < head > < meta http-equiv = "Content-Type" content = "text/html; charset=UTF-8" >
< meta charset = "utf-8" >
< title > Django REST framework< / title >
2012-10-05 18:26:53 +04:00
< link href = "http://tomchristie.github.com/django-rest-framework/img/favicon.ico" rel = "icon" type = "image/x-icon" >
2012-09-17 23:21:26 +04:00
< meta name = "viewport" content = "width=device-width, initial-scale=1.0" >
< meta name = "description" content = "" >
< meta name = "author" content = "" >
<!-- Le styles -->
< link href = "http://tomchristie.github.com/django-rest-framework/css/prettify.css" rel = "stylesheet" >
< link href = "http://tomchristie.github.com/django-rest-framework/css/bootstrap.css" rel = "stylesheet" >
< link href = "http://tomchristie.github.com/django-rest-framework/css/bootstrap-responsive.css" rel = "stylesheet" >
< link href = "http://tomchristie.github.com/django-rest-framework/css/default.css" rel = "stylesheet" >
<!-- Le HTML5 shim, for IE6 - 8 support of HTML5 elements -->
<!-- [if lt IE 9]>
< script src = "http://html5shim.googlecode.com/svn/trunk/html5.js" > < / script >
<![endif]-->
2012-10-01 19:27:59 +04:00
< body onload = "prettyPrint()" class = "rest-hypermedia-hateoas-page" >
2012-09-17 23:21:26 +04:00
2012-10-05 22:27:27 +04:00
< div class = "wrapper" >
2012-09-17 23:21:26 +04:00
< div class = "navbar navbar-inverse navbar-fixed-top" >
< div class = "navbar-inner" >
< div class = "container-fluid" >
< a class = "repo-link btn btn-primary btn-small" href = "https://github.com/tomchristie/django-rest-framework/tree/restframework2" > GitHub< / a >
< a class = "btn btn-navbar" data-toggle = "collapse" data-target = ".nav-collapse" >
< span class = "icon-bar" > < / span >
< span class = "icon-bar" > < / span >
< span class = "icon-bar" > < / span >
< / a >
< a class = "brand" href = "http://tomchristie.github.com/django-rest-framework" > Django REST framework< / a >
< div class = "nav-collapse collapse" >
< ul class = "nav" >
< li > < a href = "http://tomchristie.github.com/django-rest-framework" > Home< / a > < / li >
< li class = "dropdown" >
< a href = "#" class = "dropdown-toggle" data-toggle = "dropdown" > Tutorial < b class = "caret" > < / b > < / a >
< ul class = "dropdown-menu" >
2012-10-09 15:01:56 +04:00
< li > < a href = "http://tomchristie.github.com/django-rest-framework/tutorial/quickstart" > Quickstart< / a > < / li >
2012-09-17 23:21:26 +04:00
< li > < a href = "http://tomchristie.github.com/django-rest-framework/tutorial/1-serialization" > 1 - Serialization< / a > < / li >
< li > < a href = "http://tomchristie.github.com/django-rest-framework/tutorial/2-requests-and-responses" > 2 - Requests and responses< / a > < / li >
< li > < a href = "http://tomchristie.github.com/django-rest-framework/tutorial/3-class-based-views" > 3 - Class based views< / a > < / li >
< li > < a href = "http://tomchristie.github.com/django-rest-framework/tutorial/4-authentication-permissions-and-throttling" > 4 - Authentication, permissions and throttling< / a > < / li >
< li > < a href = "http://tomchristie.github.com/django-rest-framework/tutorial/5-relationships-and-hyperlinked-apis" > 5 - Relationships and hyperlinked APIs< / a > < / li >
< li > < a href = "http://tomchristie.github.com/django-rest-framework/tutorial/6-resource-orientated-projects" > 6 - Resource orientated projects< / a > < / li >
< / ul >
< / li >
< li class = "dropdown" >
< a href = "#" class = "dropdown-toggle" data-toggle = "dropdown" > API Guide < b class = "caret" > < / b > < / a >
< ul class = "dropdown-menu" >
< li > < a href = "http://tomchristie.github.com/django-rest-framework/api-guide/requests" > Requests< / a > < / li >
< li > < a href = "http://tomchristie.github.com/django-rest-framework/api-guide/responses" > Responses< / a > < / li >
< li > < a href = "http://tomchristie.github.com/django-rest-framework/api-guide/views" > Views< / a > < / li >
< li > < a href = "http://tomchristie.github.com/django-rest-framework/api-guide/generic-views" > Generic views< / a > < / li >
< li > < a href = "http://tomchristie.github.com/django-rest-framework/api-guide/parsers" > Parsers< / a > < / li >
< li > < a href = "http://tomchristie.github.com/django-rest-framework/api-guide/renderers" > Renderers< / a > < / li >
< li > < a href = "http://tomchristie.github.com/django-rest-framework/api-guide/serializers" > Serializers< / a > < / li >
2012-10-05 20:10:33 +04:00
< li > < a href = "http://tomchristie.github.com/django-rest-framework/api-guide/fields" > Serializer fields< / a > < / li >
2012-09-17 23:21:26 +04:00
< li > < a href = "http://tomchristie.github.com/django-rest-framework/api-guide/authentication" > Authentication< / a > < / li >
< li > < a href = "http://tomchristie.github.com/django-rest-framework/api-guide/permissions" > Permissions< / a > < / li >
< li > < a href = "http://tomchristie.github.com/django-rest-framework/api-guide/throttling" > Throttling< / a > < / li >
2012-10-01 19:27:59 +04:00
< li > < a href = "http://tomchristie.github.com/django-rest-framework/api-guide/pagination" > Pagination< / a > < / li >
2012-09-17 23:21:26 +04:00
< li > < a href = "http://tomchristie.github.com/django-rest-framework/api-guide/content-negotiation" > Content negotiation< / a > < / li >
< li > < a href = "http://tomchristie.github.com/django-rest-framework/api-guide/format-suffixes" > Format suffixes< / a > < / li >
< li > < a href = "http://tomchristie.github.com/django-rest-framework/api-guide/reverse" > Returning URLs< / a > < / li >
< li > < a href = "http://tomchristie.github.com/django-rest-framework/api-guide/exceptions" > Exceptions< / a > < / li >
< li > < a href = "http://tomchristie.github.com/django-rest-framework/api-guide/status-codes" > Status codes< / a > < / li >
< li > < a href = "http://tomchristie.github.com/django-rest-framework/api-guide/settings" > Settings< / a > < / li >
< / ul >
< / li >
< li class = "dropdown" >
< a href = "#" class = "dropdown-toggle" data-toggle = "dropdown" > Topics < b class = "caret" > < / b > < / a >
< ul class = "dropdown-menu" >
< li > < a href = "http://tomchristie.github.com/django-rest-framework/topics/csrf" > Working with AJAX and CSRF< / a > < / li >
2012-10-08 17:26:56 +04:00
< li > < a href = "http://tomchristie.github.com/django-rest-framework/topics/browserhacks" > Browser hacks< / a > < / li >
2012-10-08 15:19:26 +04:00
< li > < a href = "http://tomchristie.github.com/django-rest-framework/topics/browsable-api" > Working with the Browsable API< / a > < / li >
< li > < a href = "http://tomchristie.github.com/django-rest-framework/topics/rest-hypermedia-hateoas" > REST, Hypermedia & HATEOAS< / a > < / li >
2012-09-17 23:21:26 +04:00
< li > < a href = "http://tomchristie.github.com/django-rest-framework/topics/contributing" > Contributing to REST framework< / a > < / li >
2012-10-08 15:19:26 +04:00
< li > < a href = "http://tomchristie.github.com/django-rest-framework/topics/migration" > 2.0 Migration Guide< / a > < / li >
< li > < a href = "http://tomchristie.github.com/django-rest-framework/topics/changelog" > Change Log< / a > < / li >
2012-09-17 23:21:26 +04:00
< li > < a href = "http://tomchristie.github.com/django-rest-framework/topics/credits" > Credits< / a > < / li >
< / ul >
< / li >
< / ul >
< ul class = "nav pull-right" >
2012-10-09 17:13:19 +04:00
<!-- TODO
2012-09-17 23:21:26 +04:00
< li class = "dropdown" >
< a href = "#" class = "dropdown-toggle" data-toggle = "dropdown" > Version: 2.0.0 < b class = "caret" > < / b > < / a >
< ul class = "dropdown-menu" >
< li > < a href = "#" > Trunk< / a > < / li >
< li > < a href = "#" > 2.0.0< / a > < / li >
< / ul >
< / li >
2012-10-09 17:13:19 +04:00
-->
2012-09-17 23:21:26 +04:00
< / ul >
< / div > <!-- /.nav - collapse -->
< / div >
< / div >
< / div >
2012-10-05 22:27:27 +04:00
< div class = "body-content" >
< div class = "container-fluid" >
< div class = "row-fluid" >
2012-10-05 16:22:18 +04:00
2012-10-05 22:27:27 +04:00
< div class = "span3" >
2012-10-08 15:19:26 +04:00
<!-- TODO
< p style = "margin-top: -12px" >
< a class = "btn btn-mini btn-primary" style = "width: 60px" > « previous< / a >
< a class = "btn btn-mini btn-primary" style = "float: right; margin-right: 8px; width: 60px;" > next » < / a >
< / p >
-->
2012-10-05 22:27:27 +04:00
< div id = "table-of-contents" >
< ul class = "nav nav-list side-nav well sidebar-nav-fixed" >
< li class = "main" > < a href = "#rest,-hypermedia-&-hateoas" > REST, Hypermedia & HATEOAS< / a > < / li >
2012-10-08 15:19:26 +04:00
< li > < a href = "#building-hypermedia-apis-with-rest-framework" > Building Hypermedia APIs with REST framework< / a > < / li >
2012-09-17 23:21:26 +04:00
2012-10-05 22:27:27 +04:00
< / ul >
< / div >
2012-09-17 23:21:26 +04:00
< / div >
2012-10-05 22:27:27 +04:00
< div id = "main-content" class = "span9" >
< h1 id = "rest-hypermedia-hateoas" > REST, Hypermedia & HATEOAS< / h1 >
2012-09-17 23:21:26 +04:00
< blockquote >
< p > You keep using that word "REST". I do not think it means what you think it means.< / p >
< p > — Mike Amundsen, < a href = "http://vimeo.com/channels/restfest/page:2" > REST fest 2012 keynote< / a > .< / p >
< / blockquote >
2012-10-09 19:45:28 +04:00
< p > First off, the disclaimer. The name "Django REST framework" was choosen simply to sure the project would be easily found by developers. Throughout the documentation we try to use the more simple and technically correct terminology of "Web APIs".< / p >
2012-09-17 23:21:26 +04:00
< p > If you are serious about designing a Hypermedia APIs, you should look to resources outside of this documentation to help inform your design choices.< / p >
< p > The following fall into the "required reading" category.< / p >
< ul >
2012-10-09 19:45:28 +04:00
< li > Roy Fielding's dissertation - < a href = "http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm" > Architectural Styles and
2012-09-17 23:21:26 +04:00
the Design of Network-based Software Architectures< / a > .< / li >
2012-10-09 19:45:28 +04:00
< li > Roy Fielding's "< a href = "http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven" > REST APIs must be hypertext-driven< / a > " blog post.< / li >
2012-09-17 23:21:26 +04:00
< li > Leonard Richardson & Sam Ruby's < a href = "" > RESTful Web Services< / a > .< / li >
< li > Mike Amundsen's < a href = "…" > Building Hypermedia APIs with HTML5 and Node< / a > .< / li >
< li > Steve Klabnik's < a href = "http://designinghypermediaapis.com/" > Designing Hypermedia APIs< / a > .< / li >
< li > The < a href = "http://martinfowler.com/articles/richardsonMaturityModel.html" > Richardson Maturity Model< / a > .< / li >
< / ul >
< p > For a more thorough background, check out Klabnik's < a href = "http://blog.steveklabnik.com/posts/2012-02-27-hypermedia-api-reading-list" > Hypermedia API reading list< / a > .< / p >
2012-10-08 15:19:26 +04:00
< h2 id = "building-hypermedia-apis-with-rest-framework" > Building Hypermedia APIs with REST framework< / h2 >
2012-09-17 23:21:26 +04:00
< p > REST framework is an agnositic Web API toolkit. It does help guide you towards building well-connected APIs, and makes it easy to design appropriate media types, but it does not strictly enforce any particular design style.< / p >
< h3 id = "what-rest-framework-does-provide" > What REST framework < em > does< / em > provide.< / h3 >
< p > It is self evident that REST framework makes it possible to build Hypermedia APIs. The browseable API that it offers is built on HTML - the hypermedia language of the web.< / p >
< p > REST framework also includes < a href = "../api-guide/serializers" > serialization< / a > and < a href = "../api-guide/parsers" > parser< / a > /< a href = "../api-guide/renderers" > renderer< / a > components that make it easy to build appropriate media types, < a href = "../api-guide/fields" > hyperlinked relations< / a > for building well-connected systems, and great support for < a href = "../api-guide/content-negotiation" > content negotiation< / a > .< / p >
< h3 id = "what-rest-framework-doesnt-provide" > What REST framework < em > doesn't< / em > provide.< / h3 >
2012-10-09 19:45:28 +04:00
< p > What REST framework doesn't do is give you is machine readable hypermedia formats such as < a href = "http://www.amundsen.com/media-types/collection/" > Collection+JSON< / a > or HTML < a href = "http://microformats.org/wiki/Main_Page" > microformats< / a > by default, or the ability to auto-magically create fully HATEOAS style APIs that include form descriptions, and semantically labelled hyperlinks. Doing so would involve making opinionated choices about API design that should really remain outside of the framework's scope.< / p >
2012-10-05 22:27:27 +04:00
< / div > <!-- /span -->
< / div > <!-- /row -->
< / div > <!-- /.fluid - container -->
< / div > <!-- /.body content -->
2012-09-17 23:21:26 +04:00
2012-10-05 18:26:53 +04:00
< div id = "push" > < / div >
2012-10-05 22:27:27 +04:00
< / div > <!-- /.wrapper -->
2012-10-05 18:26:53 +04:00
2012-10-05 22:27:27 +04:00
< footer class = "span12" >
2012-10-05 22:33:52 +04:00
< p > Sponsored by < a href = "http://dabapps.com/" > DabApps< / a > .< / a > < / p >
2012-10-05 22:27:27 +04:00
< / footer >
2012-10-05 18:26:53 +04:00
2012-09-17 23:21:26 +04:00
<!-- Le javascript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
< script src = "http://tomchristie.github.com/django-rest-framework/js/jquery-1.8.1-min.js" > < / script >
2012-10-05 16:22:18 +04:00
< script src = "http://tomchristie.github.com/django-rest-framework/js/prettify-1.0.js" > < / script >
< script src = "http://tomchristie.github.com/django-rest-framework/js/bootstrap-2.1.1-min.js" > < / script >
2012-09-17 23:21:26 +04:00
< script >
//$('.side-nav').scrollspy()
var shiftWindow = function() { scrollBy(0, -50) };
if (location.hash) shiftWindow();
window.addEventListener("hashchange", shiftWindow);
$('.dropdown-menu').on('click touchstart', function(event) {
event.stopPropagation();
});
< / script >
2012-10-01 19:27:59 +04:00
< / body > < / html >