Approaching pure REST: Learning to love HATEOAS 110

Posted by ryan Thu, 24 Jun 2010 05:06:00 GMT

We've been building up a REST API at work for a couple of months now, have an iPhone client, an Android client, and a browser-based client built on it, and are well on our way to using it for a number of other purposes. As far as client and API development are concerned, things are going pretty smoothly. So, when I read Michael Bleigh's article on how he thinks that building a pure REST API is too hard, and probably not worth the time, I was pretty surprised. I started wondering if maybe I'd misunderstood something, despite spending quite some time poring over Roy Fielding's dissertation and scads of other articles by a variety of authors. After some reflection, I've decided that I'm not missing anything, and it's a lot easier than people think to build a pure REST API, once you understand what one is, and have determined that REST is an appropriate architecture for your system.

Learn about REST from credible sources

There's a lot of information out there about REST, so naturally there's also a lot of inaccurate, incomplete, confusing, and misleading information out there. The key to learning about REST, as with everything else, is finding good sources of information. In my research, there were a handful of people who were instrumental in my understanding of the topic: Roy Fielding, Jim Webber, Ian Robinson, Mark Baker, Sam Ruby, Leonard Richardson, and Subbu Allamaraju. Specifically, the following are great sources of information on REST:

REST is a fairly broad topic to understand completely. Only after reading through the above sources, and then some, did I begin to fully grasp what it is, and why it's so important. Due to the contextualized nature of this article, I strongly suggest that you at least skim through the links above before continuing on here.

HATEOAS: The "hard part" about REST

The most sparsely-documented aspect of REST in Roy Fielding's dissertation is the "hypermedia as the engine of application state" (HATEOAS) constraint; it's also the aspect of REST that has the fewest practical examples. It's no surprise, then, that HATEOAS is the part of REST most-often neglected or misinterpreted by API developers. There is one rather popular and ubiquitous hypertext-driven application out there to learn from, however: The World Wide Web.

A popular, yet misleading example

The world-wide web is a great example of utilizing hypermedia; it's also a source of much confusion around the role of hypermedia in APIs. In his article, Michael Bleigh uses the same example that Fielding uses in a comment on his rant of how web browsers and spiders don't distinguish between an online-banking resource and a wiki resource, and only need to be aware of the "links and forms", and "what semantics/actions" are implied by traversing those links". Fielding uses the example as a way to illustrate how clients of REST services need only know about the standard media types used in a service response in order to make use of the service. The problem with this analogy is that browsers and spiders are extremely general consumers of hypermedia.

A web site can be thought of as a REST API, except the media types and link relations that are used are not structured enough to allow most applications to determine the meaning of individual links and forms. Instead, a web site typically relies on a human user to determine the semantics of the site from the natural language text, sounds, and visuals presented to them via HTML, Javascript, Flash, JPEGs, or any other standard data formats at the web site author's disposal. That's fine if you're building a system designed to be used by human beings, but if you're designing one to be consumed by other software, then your system and the systems that use it are going to have to agree on something up-front in order to play nicely.

A more common example

It's an exciting, web-driven world we're building, and clients usually need to do quite a bit more than allow their users to browse or crawl the systems we build. The Twitter API, for example, has services that allow clients to update their status, or retweet one that already exists. Twitter's API is not RESTful, so the documentation for retweeting a status instructs developers to call the service by sending an HTTP POST or PUT request to http://api.twitter.com/1/statuses/retweet/[id].[format].

If the Twitter API were RESTful, clients would need to understand what it means to follow a link to retweet a status. The semantics of such a service are deeper than what Fielding talks about in his comment about browsers and crawlers. At the same time, I think that this deep level of understanding is a more common requirement for clients of web APIs. It's this need for clients to have deep semantic understanding of an API that has Michael Bleigh questioning whether it's even worth the effort to make an API like Twitter's hypertext-driven.

It's not that hard!

HATEOAS is not as difficult to adhere to as people think. If you've ever built an interactive website that includes links and forms in HTML pages it generates and returns to its users, then congratulations: You've conformed to HATEOAS! For an API to conform to HATEOAS, it must provide all valid operations, what they mean, and how to invoke them, in representations that it sends to clients. In order to provide this knowledge in-band, it must utilize standard media types and link relations. If the API can't use standard types and relations, then custom types must be defined. Regardless of what types and relations are used, the point is that clients should be bound to services they consume at a higher, more generalized level than a specific communication channel, URI pattern, and set of invocation rules. The only difference between building a web site and web API that conforms to HATEOAS is that the majority of media types and link relations that you'll need for a web site are already defined, whereas you'll most-likely need to define some of your own for an API.

Michael Bleigh states in his article that REST requires "too much work from the [service] provider in defining and supporting custom media types with complex modeled relationships", but defining media types and link relations for a REST API simply takes the place of other forms of documentation that would otherwise have to be produced. Subbu Allamaraju has a pretty good article on documenting RESTful applications. Among other things, he highlights how you no longer need to specify details on constructing requests to specific services within a REST API. The hypermedia constraint of REST requires that all possible requests be constructable at runtime, and provided by the API itself; clients must know how to interpret the hypermedia controls, but then are only responsible for interpreting the semantics of specific links and structural elements of the data format. This allows for greater flexibility on the service side to make changes, and greater resilience on the client side to those changes.

Michael states that it's too much work to define "complex modeled relationships", but defining link relations in a REST API's media type definitions is not any more complex than leaving those relationships undefined and requiring clients to figure them out on their own by poking around the documentation. The difference is just that the effort of figuring those relationships out and working with them in a consistent way gets shifted from the (single) service developer to the (multitude of) client developers. If links are provided, but relationship types are not defined or specified, clients must base their behavior on specific links, thus making it harder to change those links. As was stated earlier, having well-defined relationships also encourages consistency and sound design from the service developers, and improves the ease with which clients make sense of and build solutions against an API.

Benefits of HATEOAS

There are many short- and long-term benefits of HATEOAS. Many of the benefits that Roy Fielding talks about, such as supporting unanticipated use-cases, the ability of generalized clients to crawl a service, and reducing or eliminating coupling between a service and its clients, tend only to be fully realized after a service has been available to the public for a while. Craig McClanahan -- author of the Sun Cloud API -- suggested some short-term benefits of adhering to the HATEOAS constraint of REST. One of the benefits mentioned by McClanahan is the improved ability of a service to make changes without breaking clients. Subbu Allamaraju describes, in his previously-mentioned article, the simplification that REST lends to the documentation of services that are written within its constraints.

Another short-term benefit of HATEOAS is that it simplifies testing. I've worked on a number of projects where there was a QA team comprised of non-technical people, and my current project is no exception. The QA team performs primarily manual testing of our applications, and leave the automated testing to the developers. They do, however, have a few people on their team capable of writing automated tests. So, I wrote a simple client against our REST API with knowledge of only the hypermedia semantics, which translates the hypermedia controls of our API into HTML links and forms that can then be driven by testing tools like Selenium. This had the added benefit of allowing me to kick the tires, as it were, of the API early on and make sure that we were getting things right by writing a simple client against it. Since the client is bound only to the hypermedia semantics of the API, it's incredibly resilient to change. Also, having the QA team rely on an HTML client ensures that all aspects of the API are hypertext-driven; if they weren't, they couldn't be tested and would be kicked back to development.

It's also possible that defining media types and link relations used by an API in a standardized, generalized fashion, as required by REST, encourages the developers of an application to think about the consistency and structural clarity of their services; I definitely feel like this is the case when I work on or with REST APIs. The reasons for this higher-level of thought about the API may be due to the fact that, once the hypermedia controls have been defined, the technical details are pretty much out of the way and developers are left with determining the structure of the system their building; it's classic separation of concerns, which has yielded great results from conscientious developers for decades. In addition to encouraging better API design, defining the hypermedia controls and link relations in a consistent, standardized fashion also improves the client developers' ability to make assumptions about the API, thus improving their productivity.

A solution built on top of a true REST API can be bound to the relations and semantics in a media type, whereas a solution built on top of a partially-RESTful API, as they are typically built, is bound to each individual service in the API and the (often-times undocumented and implied) relationships between those services. Michael Bleigh suggests in his article that it's "too much work for clients and library authors to perform complex aggregation and re-formulation of data" when they're built on a true REST API. With the advantages of REST that have been mentioned so far, it should be the architecture of choice for client or library developers that are concerned with building systems that are resilient to or tolerant of common changes in and challenges of a web-based system. Developers that would like the flexibility to bind to the semantic subset of an API that is appropriate to their client or library (general hypermedia, or deep semantic understanding) would also probably prefer a REST API.

Of course, there are also the often-mentioned reasons for using REST: Scalability and maintainability. You can't work on a web application these days without having to build an API to drive iPhone, Android, mobile web, or some other client. Twitter's API has quite a few clients already (318 as of 6/21/2010). With so many clients likely to be built against a modern web API, it's important that one be written in a way that is as scalable and maintainable as possible, for the sake of both the clients and the system providing the services. The advantage of exposing services over the web is that, with REST, it's already designed to be massively scalable and maintainable, and the better a web API is at playing by the rules of the web, the more it can take advantage of those properties.

Comments

Leave a comment

  1. Exchange Rate 3 months later:

    You don’t conflate Rails approach to REST, and the REST architecture in general.

    In fact some (including Roy Fielding who invented the term) might say that Rails isn’t entirely true to the REST philosophy, for a bunch of reasons which I won’t bore you with right now.

    Certainly, Rails routing and controller architecture often requires a lot of boilerplate to acheive re-usable resource structures, and to create hyperlinks between resources, as you example demonstrates. Rails lacks a clean, obvious abstraction of the key concept of REST, the ‘resource’ – whereas a more pure REST framework (like java’s Restlet) have this concept as an interface in their architecture…

  2. cialis pas cher 9 months later:

    The excelent tutorial and it is definitely going to help me some time.

  3. SJR Luxuria 9 months later:

    Very nice tutorial, Thanks mate

  4. programy 10 months later:

    Great blog post, I have been waiting for that

  5. Discount Sunglasses Outlet 11 months later:

    Don't let anyone steal your dreams.

  6. dagaanbiedingen about 1 year later:

    Rails lacks a clean, obvious abstraction of the key concept of REST, the ‘resource’ – whereas a more pure REST framework (like java’s Restlet) have this concept as an interface in their architecture…

  7. moncler daunenjacke about 1 year later:

    Putting on cozy and exact moncler daunenjacke in winter is actually a sort of sharing.

    We is aware, normally, moncler daunenjacke with apparel pattern and colorific form

    could have an influence on our stature's luxury. As soon as we know this point, we can

    easily improve apparel to hide scars, and cultivate our spirit look. We virtually can

    not see an excellent stature in our genuine life, nonetheless Moncler jackets relieved

    that problem at once, developing our psychological overall look. These moncler outlet

    are ideal for adult males and not other jackets to produce you seems trendy. Moncler

    coats will also be to be had for navy blues, greys, pink for very little women. The

    designers are sensible plus they make down jackets look incredibly trendy. moncler

    jacken's designer always make sure that the wearers can enjoy the nature in cold wind

    with stylish design. You won't be capable of share your spiritual experiences as

    readily if you you should not have on apparel that flatters you and also turn you into

    seem available and appealing.

  8. Chloe Outlet over 1 year later:

    The writing is very good, I learn a lot from it.I wil come here next time.

  9. Best almost 2 years later:

    The vital key for learning about REST, as with everything else, is finding good sources of information.

  10. dissertations help almost 2 years later:

    Dissertation writing is a tough task and we are confused on how to start a dissertation. Dissertations are really hard because we have to search a lot on several topics when we are starting a dissertation. Information is not that easy to filter out when we are starting a dissertation. People like you will help us in this regard. Thanks a lot for sharing this piece of information because dissertations are considered as an important aspect in an academic career of a student. dissertation help UK

  11. prada outlet almost 2 years later:

    Your article is very reasonable, in my life is very affected, like the article of individual words, use a good. Thank you.

  12. Polo Outlet almost 2 years later:

    Your blog written in very real, very interesting, write the mood and feeling, watched was touched!

  13. casque beats almost 2 years later:

    chaque gymnase une commission d'examen. Elle se compose du directeur de l'établissement, des professeurs de la première (i), et d'un membre du comité provincial d'instruction publique.Les ministres du culte ne font pas partie de cette http://www.casquedrdredetox.com/

  14. ray ban sunglasses almost 2 years later:

    two countries.Early in the session of parliament 1834, the question of the corn laws came on for discussion, upon a motion of Mr Hume, in favour of a moderate fixed duty, in place of the http://www.rayban-wayfarer.us/

  15. Polo Outlet almost 2 years later:

    Happened to see your blog, which is we are decree by destiny it, your article written in very touching and hope you continue to work hard.

  16. Aqua gym almost 2 years later:

    Do you mind if I quote a few of your posts as long as I provide credit and sources back to your website? My website is in the exact same niche as yours and my users would genuinely benefit from some of the information you present here. Please let me know if this okay with you.

    Cheers!

  17. lunette ray ban almost 2 years later:

    Your blog is very real, and I nearby the friends all say this is a very good blog , Thank you! I want to thank you offer this good blog

  18. prada schuhe almost 2 years later:

    Very happy to see such a good blog ,and the blog will have been attractive, I’ve telled a lot of friends look at this blog!

  19. chanel taschen online shop almost 2 years later:

    This article content is not only simple but also unique, fully reflects the author's rich writing skills and life experience, hope to see more interesting articles ....

  20. supreme fitted hats almost 2 years later:

    your website is so great that i love it very much. thank you for sharing it with us.Thanks for making the pattern available so quickly. Hm, maybe I can re-prioritize some projects. Who am I fooling? I'm going to go buy more yarn.

  21. chanel taschen almost 2 years later:

    Your blog gives me a good reference, a good article, exquisite design, offered me a great help, Thank you for sharing.

  22. casque audio beat almost 2 years later:

    Thank you!As a novice, your blog provides me with a lot of help, gave me the inspiration to once again express my gratitude.

  23. Ralph Lauren Outlet Online almost 2 years later:

    TAT.Wonderful site.Asked me the same problem. I definitely want to read more soon.Or the newest members of the Superfriends.

  24. prada taschen almost 2 years later:

    I want to express my respect to your support, your plan quite rich connotation. I am looking forward to your next article, I will try to learn your skills.

  25. Ralph Lauren Outlet Online about 2 years later:

    Don't be too perfect life of, what you say is very reasonable, the person's life in the struggle for the good life, come on!

  26. Ralph Lauren Outlet Online about 2 years later:

    Finish see think you are a very talented people, give a person the feeling of a kind of dream, support you ~ ~

  27. roomtivek about 2 years later:

    Heya terrific website! Does running a blog similar to this require a great deal of work? I have no knowledge of programming however I had been hoping to start my own blog in the near future. Anyways, should you have any ideas or tips for new blog owners please share. I understand this is off subject nevertheless I simply wanted to ask. Cheers!

  28. sac chanel pas cher about 2 years later:

    L'examen scientifique est avant tout une appréciation morale du savoir et de l'aptitude du candidat ; ce n'est pas une épreuve par points et par questions.

  29. supra chaussure about 2 years later:

    Et en effet, comment prescriro des règles aux examinateurs, comment leur imposer un programme de questions, lorsque l'enseignement n'a rien d'arrêté

  30. casque audio beats about 2 years later:

    de stationnaire, mais qu'il avance toujours? Et puis, à quoi bon les dispositions réglementaires, lorsque ce sont les facultés qui confèrent les grades?

  31. oakley coupons about 2 years later:

    Very happy to meet you have to blog, very great, was a great help to me, the fine blog, very good information, is very reality. I feel good article should let more people share together is right, I will always support you.

  32. casque dr dre about 2 years later:

    brûlait, l'autre était glacé et l'on était obligé de se lever à chaque instant pour se réchauffer. Les oreilles du cuisinier gelèrent pendant qu'il allait à la rivière chercher de l'eau.et en avaient tué plusieurs. Ces Indiens avaient

  33. foot cramps about 2 years later:

    I know this if off topic but I'm looking into starting my own weblog and was wondering what all is required to get setup? I'm assuming having a blog like yours would cost a pretty penny?

    I'm not very web smart so I'm not 100% sure. Any tips or advice would be greatly appreciated. Thanks

  34. foot cramps about 2 years later:

    I know this if off topic but I'm looking into starting my own weblog and was wondering what all is required to get setup? I'm assuming having a blog like yours would cost a pretty penny? I'm not very web smart so I'm not 100% sure. Any tips or advice would be greatly appreciated. Thanks

  35. I am regular visitor, how are you everybody? This article posted at this website is really pleasant.

  36. Underground mixtapes about 2 years later:

    You'd superb suggestions there. I did a research about the concern and identified that likely almost anyone will agree along with your internet page. 705207

  37. regeneracja skrzyni biegóW about 2 years later:

    Hello, i think that i saw you visited my website thus i came to “return the favor”. I am trying to find things to improve my web site!I suppose its ok to use some of your ideas!!

  38. Lexia-3 V47 PP2000 about 2 years later:

    Lexia-3 V47 PP2000 V25 Diagnostic Tool is compatible with most of Citroen and Peugeot cars from 1995. 100Z

  39. Ballonkarten about 2 years later:

    Do you mind if I quote a few of your posts as long as I provide credit and sources back to your site?

    My blog site is in the very same area of interest as yours and my users would really benefit from a lot of the information you provide here. Please let me know if this ok with you. Regards!

  40. mcallen web design about 2 years later:

    Wow, wonderful blog layout! How long have you been blogging for? you made blogging look easy. The overall look of your site is wonderful, let alone the content!

  41. Kristopher about 2 years later:

    I'm really inspired along with your writing skills as smartly as with the structure on your weblog. Is that this a paid theme or did you modify it yourself? Anyway stay up the nice quality writing, it is uncommon to see a nice weblog like this one nowadays..

  42. Adelaida about 2 years later:

    Everything is very open with a very clear description of the issues. It was really informative. Your website is useful. Many thanks for sharing!

  43. website about 2 years later:

    Hi there everyone, it's my first pay a visit at this site, and article is genuinely fruitful designed for me, keep up posting these articles.

  44. best free domain over 2 years later:

    It's really a nice and useful piece of info. I'm happy that you simply shared this helpful info with us. Please stay us up to date like this.

    Thanks for sharing.

  45. online Christian dating over 2 years later:

    I was able to find good info from your articles.

  46. Cory over 2 years later:

    Hello there, just became alert to your blog through Google, and found that it's truly informative. I'm gonna watch out for brussels. I'll appreciate if you continue this in future. Numerous people will be benefited from your writing. Cheers!

  47. frezowanie over 2 years later:

    WOW just what I was looking for. Came here by searching for />

  48. make money online marketing ways over 2 years later:

    Please let me know if you're looking for a article writer for your site. You have some really great articles and I feel I would be a good asset. If you ever want to take some of the load off, I'd really like to write some articles for your blog in exchange for a link back to mine. Please shoot me an e-mail if interested. Kudos!

  49. Isabel Marant Boots over 2 years later:

    Such as taste and the content of the article is worth sharing, at least, I think the article I feel.

  50. rack card printing over 2 years later:

    Truly when someone doesn't be aware of afterward its up to other users that they will help, so here it takes place.

  51. What's up to all, the contents existing at this web page are actually amazing for people knowledge, well, keep up the nice work fellows.

  52. pick up artist over 2 years later:

    I am not sure where you are getting your information, but good topic. I needs to spend some time learning more or understanding more.

    Thanks for fantastic information I was looking for this information for my mission.

  53. online dating sites over 2 years later:

    Hello mates, nice article and fastidious urging commented at this place, I am truly enjoying by these.

  54. Photographers in Sandton over 2 years later:

    Good day! This is my first visit to your blog! We are a collection of volunteers and starting a new initiative in a community in the same niche. Your blog provided us valuable information to work on. You have done a marvellous job!

  55. keyword research over 2 years later:

    I relish, lead to I discovered exactly what I used to be looking for. You've ended my 4 day lengthy hunt! God Bless you man. Have a nice day. Bye

  56. keyword research over 2 years later:

    I relish, lead to I discovered exactly what I used to be looking for. You've ended my 4 day lengthy hunt! God Bless you man. Have a nice day. Bye

  57. buy your mini over 2 years later:

    It's an awesome paragraph in support of all the internet visitors; they will take advantage from it I am sure.

  58. Howdy would you mind letting me know which webhost you're utilizing? I've loaded your blog in 3 completely different internet browsers and I must say this blog loads a lot faster then most. Can you suggest a good web hosting provider at a reasonable price?

    Thanks a lot, I appreciate it!

  59. Thanks for ones marvelous posting! I really enjoyed reading it, you're a great author.I will make sure to bookmark your blog and may come back sometime soon. I want to encourage you to ultimately continue your great posts, have a nice afternoon!

  60. If you are losing interest in workouts, are having trouble sleeping, and feel weak and irritable, you may be in a state of over-training and should take a week or more off. If you are living not in the US and ones country uses that metric system, then you will have to do an extra step when calculating your perfect diet regime plan. The largest muscles in your body are found in your upper leg, so this is the logical place to start.

  61. favarafavara over 2 years later:

    What's up, after reading this remarkable article i am too happy to share my know-how here with friends.

  62. Howdy fantastic website! Does running a blog such as this take a large amount of work? I have very little expertise in computer programming however I had been hoping to start my own blog soon. Anyways, should you have any ideas or techniques for new blog owners please share. I know this is off topic nevertheless I simply wanted to ask.

    Many thanks!

  63. latest govt jobs over 2 years later:

    I think the admin of this website is genuinely working hard for his site, as here every material is quality based stuff.

  64. new iphone case over 2 years later:

    Amazing issues here. I'm very happy to see your post. Thanks a lot and I am taking a look forward to contact you. Will you kindly drop me a e-mail?

  65. http://www.artelbowler.n.nu over 2 years later:

    Its like you read my mind! You seem to know a lot about this, like you wrote the book in it or something. I think that you can do with some pics to drive the message home a little bit, but instead of that, this is great blog. An excellent read. I will definitely be back.

  66. get cybermonday price over 2 years later:

    This is the perfect web site for anybody who wishes to find out about this topic. You realize so much its almost tough to argue with you (not that I really will need to…HaHa). You certainly put a new spin on a subject which has been written about for many years. Great stuff, just wonderful!

  67. <a href="http://www.abc.com/">abc</a> over 2 years later:

    Great share

  68. http://www.abc.com/ over 2 years later:

    great article

  69. abbybuc over 2 years later:

    diamond inclusions needle diamond inclusion http:/diamondinclusions.tumblr.com diamond crystal

  70. Shella over 2 years later:

    Does your website have a contact page? I'm having trouble locating it but, I'd like to send you an email. I've got some ideas for your blog you might be interested in hearing. Either way, great website and I look forward to seeing it grow over time.

  71. Celeste over 2 years later:

    This website was... how do I say it? Relevant!! Finally I've found something which helped me. Thanks a lot!

  72. クロエ アウトレット over 2 years later:

    My partner and I stumbled over here from a different page and thought I might check things out. I like what I see so now i am following you. Look forward to looking into your web page for a second time.

  73. cung cấp linh kiện thang máy over 2 years later:

    I am actually pleased to read this webpage posts which includes tons of helpful facts, thanks for providing these kinds of statistics.

  74. visit website over 2 years later:

    When some one searches for his vital thing, so he/she desires to be available that in detail, so that thing is maintained over here.

  75. Eugenia over 2 years later:

    Also take a lot of fluids and water. Approved by the FDA, Latisse eyelash growth solution can help achieve longer, fuller eyelashes. You don.

  76. Harriett over 2 years later:

    Hey I know this is off topic but I was wondering if you knew of any widgets I could add to my blog that automatically tweet my newest twitter updates. I've been looking for a plug-in like this for quite some time and was hoping maybe you would have some experience with something like this. Please let me know if you run into anything. I truly enjoy reading your blog and I look forward to your new updates.

  77. url shortener over 2 years later:

    Very nice post. I just stumbled upon your blog and wanted to say that I have really enjoyed browsing your blog posts. In any case I'll be subscribing to your feed and I hope you write again very soon!

  78. Eyelashes can grow back once thyroid is completely treated. It takes a little experience and trial and error to put false eyelashes on correctly. Keep in mind the Egyptians.

  79. http://tinyurl.com/tennplumb20109 over 2 years later:

    It seems you really fully understand very much related to this subject matter and it shows via this article, labeled “kinderman.

    net : Approaching pure REST: Learning to love HATEOAS”. Thanks a lot ,Susanna

  80. webcammenow over 2 years later:

    Do you have a spam issue on this blog; I also am a blogger, and I was wondering your situation; many of us have developed some nice practices and we are looking to swap techniques with other folks, why not shoot me an e-mail if interested.

  81. webcammenow over 2 years later:

    Do you have a spam issue on this blog; I also am a blogger, and I was wondering your situation; many of us have developed some nice practices and we are looking to swap techniques with other folks, why not shoot me an e-mail if interested.

  82. find here over 2 years later:

    Great weblog here! Additionally your site quite a bit up fast! What host are you using? Can I am getting your affiliate link for your host? I wish my website loaded up as fast as yours lol

  83. Erick over 2 years later:

    Thanks for sharing your thoughts. I truly appreciate your efforts and I am waiting for your next write ups thank you once again.

  84. hiddencamsfuck.thumblogger.com over 2 years later:

    I delight in, cause I discovered exactly what I used to be having a look for. You have ended my four day lengthy hunt! God Bless you man. Have a great day. Bye

  85. espresso maker review over 2 years later:

    Excellent blog here! Also your site loads up very fast! What host are you using? Can I get your affiliate link to your host? I wish my site loaded up as fast as yours lol

  86. ralph lauren wedding dresses over 2 years later:

    Nice post. I used to be checking constantly this blog and I'm inspired! Extremely useful information particularly the ultimate section :) I maintain such information much. I used to be seeking this particular information for a very long time. Thanks and good luck.

  87. ralph lauren wedding dresses over 2 years later:

    Nice post. I used to be checking constantly this blog and I'm inspired! Extremely useful information particularly the ultimate section :) I maintain such information much. I used to be seeking this particular information for a very long time. Thanks and good luck.

  88. Latia over 2 years later:

    Aw, this was a really nice post. Taking a few minutes and actual effort to produce a top notch article… but what can I say… I put things off a lot and never seem to get anything done.

  89. Latia over 2 years later:

    Aw, this was a really nice post. Taking a few minutes and actual effort to produce a top notch article… but what can I say… I put things off a lot and never seem to get anything done.

  90. Medicines for yeast Infection over 2 years later:

    Right now it appears like Movable Type is the top blogging platform out there right now. (from what I've read) Is that what you are using on your blog?

  91. Thank you a lot for sharing this with all folks you actually know what you are speaking approximately! Bookmarked. Kindly additionally talk over with my web site =).

    We could have a hyperlink change arrangement between us

  92. antique oil cans over 2 years later:

    This is the perfect blog for everyone who wishes to understand this topic. You know so much its almost hard to argue with you (not that I really will need to…HaHa). You definitely put a fresh spin on a topic that has been discussed for decades. Excellent stuff, just great!

  93. niche profit classroom review over 2 years later:

    Just want to say your article is as surprising. The clearness in your post is simply excellent and i can assume you are an expert on this subject. Well with your permission allow me to grab your RSS feed to keep up to date with forthcoming post.

    Thanks a million and please continue the rewarding work.

  94. sales calls over 2 years later:

    Great web site you have got here.. It's difficult to find quality writing like yours these days. I seriously appreciate people like you! Take care!!

  95. jeremy scott wings 2.0 flames over 2 years later:

    You're so interesting! I do not think I've read through something like this before. So good to find somebody with some original thoughts on this subject matter. Really.

    . many thanks for starting this up. This website is something that is required on the internet, someone with some originality!

  96. cancan over 2 years later:

    Currently it looks like Drupal is the best blogging platform out there right now. (from what I've read) Is that what you are using on your blog?

  97. Www.Feuerwehr.Ch over 2 years later:

    Nice post. I learn something new and challenging on blogs I stumbleupon everyday. It will always be helpful to read through articles from other authors and practice something from other websites.

  98. Susanna over 2 years later:

    What's up to all, the contents existing at this web page are genuinely awesome for people experience, well, keep up the good work fellows.

  99. Susanna over 2 years later:

    What's up to all, the contents existing at this web page are genuinely awesome for people experience, well, keep up the good work fellows.

  100. paleo ernährung over 2 years later:

    I know this if off topic but I'm looking into starting my own blog and was curious what all is needed to get set up? I'm assuming having a blog like yours would cost a pretty penny? I'm not very web smart so I'm not 100% certain. Any suggestions or advice would be greatly appreciated. Kudos

  101. I do consider all of the ideas you've introduced in your post. They are very convincing and will certainly work. Still, the posts are too brief for novices. May you please lengthen them a bit from next time? Thanks for the post. Darline Herschel Emely Derrick Ester Ben Tonie Dino Teresa Rodrick Mitsue Randal Eusebia Stacey Lavonda Arthur Janise Brandon Kristan Jess Annmarie Wendell Allyn Derick Keila Curt Tammara Eldridge Bree Lenny Tona Luther Laurene Mariano Kitty Arturo Sarah Kennith Felecia Charley Rosie Donte Carmela Louis Norah Kip Melissa Johnathon Carma Gil Olivia Chauncey Fannie Oswaldo Denisse Gus Sharon Domingo Glinda Lesley Minta Irving Altagracia Dong Kathryne Markus Lori Alfredo Candie Steven Lara Hiram Tawna Dario Deeann Loren Tracey Wesley Corey Miles Ja Garth Geri Carter Easter Harris Laurel Kent Moon Stephen Madonna Val Carleen Neal Liberty Jerold Lady Alejandro Billie Miles

  102. debt settlement in mission valley over 2 years later:

    Thanks for some other fantastic article. The place else could anyone get that type of info in such an ideal manner of writing? I have a presentation next week, and I'm at the search for such info.

  103. Iconia PC Tablet dengan Windows 8 over 2 years later:

    Hurrah, that's what I was looking for, what a stuff! existing here at this webpage, thanks admin of this website.

  104. Marguerite almost 3 years later:

    An impressive share! I've just forwarded this onto a coworker who was doing a little homework on this. And he in fact bought me lunch simply because I found it for him... lol. So allow me to reword this.... Thank YOU for the meal!! But yeah, thanks for spending some time to talk about this issue here on your internet site.

  105. click here for gay porn almost 3 years later:

    You are so awesome! I don't think I've truly read anything like that before. So wonderful to find somebody with a few unique thoughts on this topic. Really.. many thanks for starting this up. This web site is something that is needed on the internet, someone with a little originality!

  106. click here for gay porn almost 3 years later:

    You are so awesome! I don't think I've truly read anything like that before. So wonderful to find somebody with a few unique thoughts on this topic. Really.. many thanks for starting this up. This web site is something that is needed on the internet, someone with a little originality!

  107. http://Community.wikia.com almost 3 years later:

    You made some really good points there. I looked on the internet to learn more about the issue and found most people will go along with your views on this web site.

  108. wzjyjc.com almost 3 years later:

    Thanks a lot for sharing this with all of us you actually realize what you're speaking about! Bookmarked. Kindly also seek advice from my web site =). We will have a link exchange agreement between us

  109. Vickie almost 3 years later:

    I just couldn't go away your web site before suggesting that I extremely loved the usual information an individual supply on your guests? Is going to be again ceaselessly to check out new posts

  110. organic seo almost 3 years later:

    Great post.

Comments