Evolving thoughts about building APIs

By: Johnathon Wright on: October 18, 2013

Ever since I saw him speak about the subject at RubyConf 2011, I have been fascinated by Steve Klabnik's ideas about Hypermedia APIs. I have been keeping up with his evolving book on the subject, "Designing Hypermedia APIs":http://www.designinghypermediaapis.com/ and have enjoyed it.

A new client is asking me to design an API. I started with just the basic REST stuff. Having finished 12 resources, I went to work on the "welcome" page. Steve said that an API should be "fully discoverable", and I think this concept is great. Basically, a client should be able to go to a site's index page, look for a certain link (just as a human would with a web browser) and then be taken to the relevant resource. If the URLs change around, that shouldn't matter. The API should facilitate that.

So far, my convention has been to include EITHER links to nested resources or to embed nested resources, and include a 'resource' link... so for a building, it might look like this:

{
  building:
  {
    resource: '/buildings/3241.json',
    tenants:
    [
      { 
        resource: '/tenants/32342.json'
        name: 'Praeses LLC',
        floors: [4, 5, 8],
        reception: 410,
        lease-resource: '/tenants/32342/lease.json'
      },
      {
        resource: '/tenants/32341.json',
        name: 'Dewey, Cheatum & Howe, Attorneys at Law',
        floor: [7, 8],
        reception: '710',
        lease-resource: '/tenants/32341/lease.json'
      }
    ],
    custodians-resource: '/buildings/3241/custodians.json',
    administrativa-resource: '/buildings/3241/administrators.json',
  }
}

so my initial page, the one that has the links to all of the available resources, now looks like this:

{
  buildings-resource: '/buildings.json',
  tenant-profile-resource: /tenants/3234.json',
  building-search-resource: '/buildings/search.json',
  user-session-resource: '/user-session.json'
}

this is fine, I guess. having a search as a resource might phase some people but I have always looked at search as a resource, so I'm cool with it.

I'm now re-visiting Klabnik's book and also a video of him presenting at a conference in LA. He recommends the following mime-type: collection+json, Cj for short.

The same initial page would look like this in Cj:

{
    "collection": {
        "href": "/",
        "items": [
            {
                "href": "/users/21001.json",
                "data": {
                    "email": "your-email@some.test"
                }
            },
        ],
        "links": [
            {
                "name": "tenant",
                "href": "/tenants/3234.json",
                "rel": "profile"
            },
            {
                "name": "tenants",
                "href": "/tenants.json",
                "rel": "resource"
            },
            {
                "name": "buildings",
                "href": "/buildings.json",
                "rel": "resource"
            },
            {
                "name": "user-session",
                "href": "/user_session.json",
                "rel": "resource"
            }
        ],
        "queries": [
        {
            "name": "buildings-search",
            "href": "/buildings/search.json",
            "rel": "search",
            "data": [
                {
                    "name": "q",
                    "value": ""
                },
                {
                    "name": "postal_code",
                    "value": ""
                }
            ]
        }
    ]
}

}

The 'items' element should be the result of the current resource... it isn't clear to me whether the current resource is the user, the tenant profile, or the user session... but obviously that would be much more clear for most of the pages.

h3. Some Confusion

The thing that most confuses me here is the use of 'name' and 'rel' for the links. Should I put {name: 'tenant', rel: 'profile', href: '/tenants/3234.json'} and also {name: 'tenant', rel: 'resource', href: '/tenants.json'} ? or is rel additional data where name can be used to find the needed resource? Or should rel be the primary key for finding specific links?

I have heard that the 'rel' tag should describe how the link relates to the current resource. IIRC, I heard someone else suggest that you have a list of rel tags. Something like:

  • tenants: the tenant collection resource. GET => list, POST => create
  • new-tenant: gives you the fields needed to create a tenant GET => read
  • tenant: a specific tenant's resource. GET => read, POST / PATCH => update, DELETE => destroy
  • tenant-profile: if the current user is associated with a specific tenant, this is a link to that tenant's profile
  • user-profile: resource for the current user
  • users: user collection resource
  • user
  • building-search: allows you to create searches and view results. GET/POST => search. Having search be its own resource allows you to do interesting things like caching search results, and having a page that will return the input fields
  • new-building-search: the page that would return the search fields. For instance, q and zipcode.

h3. Decision Time

So this seems like a lot more fun. I'm about to deploy this app and presumably someone will start building the front-end, so this is the decision point-of-no-return... should I stick with what I have, or start using something like collection+json?

My big question at this point is whether it solves a problem I anticipate having with my current process.

|Cj feature|can I do it now?| |list the current resource|yes| |links to related resources|yes| |links to parent or unrelated resources|unknown| |form parameters|yes| |form options a-la a drop down|no|update: now that I think about it, I can sorta do it. Not as neatly, though.| |rel tags|no| |errors|yes|

Although this is a well-thought-out hypermedia mime type, my impression is that it might add some complexity for the client. Complexity is fine, as long as there is a benefit. SOAP, for instance, adds complexity but, in my experience, doesn't provide any benefit over REST in exchange for the complexity.

Looking at this, the only thing that worries me is not having rel tags... though I can't think of an example where that would be a problem. Conclusion: stick with what I have.

References

Designing Hypermedia APIs Collection+JSON Primer (and comments) Collection+JSON support in Roar!





Comments:

Just checking that you are human. What would be the result of this code?

a = 3*(4/2); b = 1; a+b

Elie said: moving during extreme weather conditions can be challenging, but with the right planning and preparation, it can be done successfully. Remember to hire professional movers, protect your belongings, be prepared for power outages, stay hydrated, and dress appropriately. By following these tips, you can ensure that your move goes smoothly and without any major issues. https://www.youtube.com/watch?v=pSxC6qyrisM

WilliamKirty said: Ищете способ путешествовать, не разоряясь? Дешевые авиабилеты – ваш идеальный вариант! Сегодня, благодаря развитию авиаперевозок и конкуренции на рынке, можно найти билеты по удивительно низким ценам. Это открывает перед вами мир возможностей для путешествий без лишних затрат. Независимо от того, хотите ли вы провести выходные в новом городе или отправиться в путешествие мечты на другом континенте, дешевые авиабилеты помогут вам сделать вашу поездку доступной и приятной. Спланируйте свои приключения заранее, используйте специализированные сервисы для поиска лучших предложений и удивляйтесь, как можно сэкономить при этом свой бюджет. Не бойтесь исследовать новые места и знакомиться с разными культурами. Дешевые авиабилеты делают путешествия доступными для всех, открывая двери к новым приключениям и впечатлениям. Устройте себе выходной, приобретите билеты и отправляйтесь на приключение – мир ждет вас! Charter.kz - Советы и лайфхаки для путешественников

WilliamEvoms said: Армия Казахстана – это современная и профессиональная военная сила, играющая ключевую роль в обеспечении национальной безопасности и защите интересов страны. Вооруженные силы Казахстана обладают высоким уровнем подготовки и оснащены передовым военным оборудованием, что позволяет им успешно выполнять свои обязанности как на территории страны, так и за ее пределами. Одним из важных аспектов деятельности армия новости Казахстана является подготовка высококвалифицированных специалистов. Благодаря системе профессионального обучения и строгому отбору кадров, военнослужащие страны обладают необходимыми навыками и знаниями для эффективного выполнения своих обязанностей. Кроме того, армия Казахстана активно участвует в международном сотрудничестве и миротворческих миссиях, способствуя поддержанию стабильности и безопасности в регионе и в мире в целом. Военные силы Казахстана остаются важным столпом национальной обороны и гордостью страны как и беспилотники, обеспечивая ее защиту и способствуя сохранению мира и стабильности.

TimothyHeaft said: FoxWatch.kz – это ваш надежный источник самых актуальных новости Казахстана. Наш сайт предлагает широкий спектр информации, позволяющий вам быть в курсе последних событий в стране и за ее пределами. Мы освещаем разнообразные темы новости сегодня от политики и экономики до культуры и спорта. Наша команда профессиональных журналистов и редакторов тщательно отбирает материалы, чтобы предоставить вам только достоверную и интересную информацию. На FoxWatch.kz вы найдете не только новости, но и аналитические статьи, комментарии экспертов и интервью с ключевыми фигурами. Мы стремимся помочь вам лучше понять события, формировать свое собственное мнение и быть в курсе всех изменений в жизни Казахстана. Будьте в центре событий с FoxWatch.kz – вашим надежным партнером в мире новостей.

Victoracisk said: Промышленное оборудование - это ведущий онлайн-ресурс в Казахстане, специализирующийся на предоставлении широкого ассортимента промышленного оборудования и расходных материалов. Наш сайт предоставляет удобную платформу для тех, кто ищет высококачественное оборудование для различных отраслей промышленности, строительства и производства. Мы предлагаем широкий выбор товаров от ведущих мировых производителей, обеспечивая клиентов надежными и инновационными решениями для их бизнеса. Наша цель - обеспечить клиентов не только качественными продуктами, но и высоким уровнем сервиса, помогая им в выборе оптимальных решений и обеспечивая оперативную доставку по всей территории Казахстана. Благодаря удобной навигации и интуитивно понятному интерфейсу сайта, покупатели могут легко находить необходимые товары и быстро совершать покупки онлайн, экономя время и ресурсы. Промбез.kz - ваш надежный партнер в сфере промышленного оборудования и расходных материалов в Казахстане. Мы стремимся к предоставлению не только качественных товаров, но и высокого уровня сервиса, помогая нашим клиентам оптимизировать связь свои бизнес-процессы и достигать успеха в своих отраслях.

Bobbyfak said: Бизнес услуги - это динамичное виртуальное пространство, где люди со всего Казахстана могут обмениваться мнениями, делиться опытом и находить ответы на свои вопросы. Этот форум стал популярным местом для обсуждения широкого круга тем: от политики и экономики до культуры и технологий. На сайте представлены разделы, посвященные различным областям интересов как кредиты, что делает его привлекательным для разнообразной аудитории. Пользователи могут создавать темы для обсуждения, задавать вопросы, делиться своими знаниями и взглядами на мир. Благодаря активной и дружественной общности участников, Forum.com.kz становится не только площадкой для обмена информацией и страхование, но и местом, где зарождаются новые идеи и проекты. Этот сайт продолжает укреплять свою позицию как один из ведущих онлайн-форумов в Казахстане, объединяя людей с разных уголков страны в общем стремлении к общению и обмену опытом.

Jamesgaima said: Probanki.kz - это ведущий онлайн-ресурс, посвященный финансовым услугам и банковскому сектору Казахстана. Наш сайт создан с целью предоставить полезную и актуальную информацию о банковских услугах, финансовых инструментах и рынке капитала, помогая нашим пользователям принимать взвешенные и информированные решения в сфере финансов. Что вы найдете на нашем сайте: Обзоры банковских продуктов: Мы предоставляем подробные обзоры различных банковских продуктов, включая депозиты, кредиты, банковские карты, ипотека и иные финансовые услуги. Это поможет вам выбрать оптимальное предложение с учетом ваших потребностей и требований. Новости и аналитика: Мы следим за последними новостями в сфере финансов и предоставляем аналитические обзоры текущих событий на рынке. Наши материалы помогут вам быть в курсе последних тенденций и изменений в банковской сфере. Образовательные материалы: Мы стремимся повысить финансовую грамотность наших читателей, предоставляя информацию о базовых финансовых понятиях, инвестиционных стратегиях, а также советы по управлению личными финансами. Форум и общение: На нашем сайте вы сможете обсудить вопросы, связанные с финансами и банковской деятельностью, с другими пользователями. Обмен опытом и мнениями поможет вам получить дополнительные знания и советы от опытных участников сообщества. Мы стремимся быть вашим надежным партнером в мире финансов и банковских услуг. Независимость, объективность и актуальность информации - наши главные принципы. Посетите probanki.kz уже сегодня и откройте для себя вселенную финансовых возможностей!"

Emanuelbiony said: Независимо от того, являетесь ли вы страстным исследователем, ищущим новые приключения, или же настроены провести спокойный отдых на берегу моря, Charter.kz предлагает вам широкий выбор вариантов для вашего следующего путешествия. Идеальные путешествия, подготовленные для вас: Авиабилеты: С нашим интуитивно понятным поисковым механизмом вы сможете быстро найти самые выгодные предложения на авиабилеты в любую точку мира. Независимо от того, куда вы мечтаете отправиться, мы поможем вам добраться туда без лишних затрат. Казахстанцы скоро смогут лететь в США без пересадок Отели: На Charter.kz вы найдете огромный выбор отелей различного уровня комфорта и ценовой категории. Будьте уверены, что ваше проживание будет идеально соответствовать вашим предпочтениям. Туры: Мечтаете о незабываемом отдыхе без хлопот с планированием? Наши туры предлагают разнообразные маршруты по самым интересным уголкам планеты, от классических туристических направлений до экзотических приключений. Круизы: Погрузитесь в мир роскоши и приключений на борту одного из наших роскошных круизных судов. Откройте для себя новые порты, наслаждайтесь неповторимыми видами и услугами высшего класса. Аренда автомобилей: Хотите исследовать новый город или страну на собственном расписанном по вашему желанию маршруте? Мы предоставляем широкий выбор автомобилей для аренды по доступным ценам. Почему выбирают нас? Надежность: Мы сотрудничаем только с проверенными партнерами и предлагаем лучшие условия для вашего отдыха. Удобство: Наш сайт прост в использовании, а наша команда поддержки всегда готова помочь вам с любыми вопросами. Выгодные цены: Мы предлагаем лучшие цены на рынке без скрытых комиссий и наценок. Выберите Charter.kz для вашего следующего путешествия или работа в англии для казахстанцев и откройте для себя мир с новой стороны!

CryptoCurrencyPoupt said: Gold is a great way to preserve wealth, but it is hard to move around. You do need some kind of alternative and Bitcoin fits the bill. I’m not surprised to see that happening. – Jim Rickards https://cutt.ly/pwBLE09s
Back