{"id":6227,"date":"2020-09-30T13:12:43","date_gmt":"2020-09-30T07:42:43","guid":{"rendered":"https:\/\/www.innovationm.com\/blog\/?p=6227"},"modified":"2020-09-30T13:12:43","modified_gmt":"2020-09-30T07:42:43","slug":"versioning-your-api","status":"publish","type":"post","link":"https:\/\/www.innovationm.com\/blog\/versioning-your-api\/","title":{"rendered":"Versioning your API"},"content":{"rendered":"<p><span style=\"font-weight: 400;\">Versioning of APIs is a decent practice. Versioning helps make your API more adaptable and versatile to changes while keeping the functionality intact. It also helps you manage changes to the code better and more easily revert <\/span><span style=\"font-weight: 400;\">back <\/span><span style=\"font-weight: 400;\">to old code if the new code causes problems. <\/span>You ought to have an alternate form of your RESTful API with each significant delivery.<\/p>\n<p><span style=\"font-weight: 400;\">Versioning an API \u00a0<\/span>permits us to help diverse usefulness for a similar asset.<\/p>\n<p>For instance, consider a blog application that offers an API for dealing with its centre information, for example, clients, blog entries, classes, and so on. Suppose the principal cycle has an endpoint that makes a client with the accompanying information:<\/p>\n<p>name, email, and a secret key. A half-year later, we conclude that each record presently should incorporate a job (administrator, manager, creator, and so on). What would it be advisable for us to do with the current API?<\/p>\n<p><span style=\"font-weight: 400;\">We essentially have two options:<\/span><\/p>\n<ol>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Update the user API to require a role with every request.<\/span><\/li>\n<li style=\"font-weight: 400;\">At the same time uphold the old and new client APIs.<\/li>\n<\/ol>\n<p><span style=\"font-weight: 400;\">There are three primary ways to implement API versioning:<\/span><\/p>\n<p><b>(1) URL<\/b><\/p>\n<p><span style=\"font-weight: 400;\">This is the easiest and most common way and can be achieved using either the path:<\/span><\/p>\n<p><span style=\"font-weight: 400;\">POST : Http<\/span><span style=\"font-weight: 400;\">\u00a0:\/\/localhost:8080 \/v2\/ielts_new\/users<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Or by using query parameters:<\/span><\/p>\n<p><span style=\"font-weight: 400;\">POST:\u00a0 <\/span><span style=\"font-weight: 400;\">\/blog\/users?version=2<\/span><\/p>\n<p><span style=\"font-weight: 400;\">URLs are convenient because they\u2019re a required part of every request, so your consumers have to deal with it. Most frameworks log URLs with every request, so it\u2019s easy to trace which consumers are using which versions.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">It\u2019s best for <\/span><span style=\"font-weight: 400;\">the <\/span><span style=\"font-weight: 400;\">Client.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Note<\/span> <span style=\"font-weight: 400;\">:\u00a0 <\/span><span style=\"font-weight: 400;\">It disrupts the RESTful compliance: URIs should represent resources and not <\/span><b>versions<\/b><span style=\"font-weight: 400;\"> (one URI = one resource\/resource <\/span><b>version<\/b><span style=\"font-weight: 400;\">).<\/span><\/p>\n<h4><b>(2) Headers<\/b><\/h4>\n<p><span style=\"font-weight: 400;\">You can do this with a custom header name that your services understand:<\/span><\/p>\n<p><span style=\"font-weight: 400;\">API-Version: 2<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Using headers for versioning is more in line with RESTful practices. After all, the URL should represent the resource, not some version of it. Additionally, headers are already great at passing what is essentially metadata between clients and servers, so adding in version seems like a good fit.<\/span><\/p>\n<p><b>Note<\/b><span style=\"font-weight: 400;\">: Headers are cumbersome to work <\/span><span style=\"font-weight: 400;\">within<\/span><span style=\"font-weight: 400;\">\u00a0some frameworks, more difficult to test, and not feasible to log for every request. Some internet proxies may remove unknown headers, meaning we\u2019d lose our custom header before it reaches the service.\u00a0<\/span><\/p>\n<h4><b>(3) Message body\u00a0<\/b><\/h4>\n<p><span style=\"font-weight: 400;\">We could wrap the message body with some metadata that includes the version:<\/span><\/p>\n<pre class=\"lang:default decode:true \">{\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0metadata: {\r\n\r\n\u00a0\u00a0\u00a0\u00a0version: 2\r\n\r\n\u00a0\u00a0},\r\n\r\n\u00a0\u00a0message: {\r\n\r\n\u00a0\u00a0\u00a0\u00a0name: \u201cJohn Doe\u201d,\r\n\r\n\u00a0\u00a0\u00a0\u00a0email: \u201cjohn@stackoverflow.com\u201d,\r\n\r\n\u00a0\u00a0\u00a0\u00a0password: \u201cP@assword123\u201d,\r\n\r\n\u00a0\u00a0\u00a0\u00a0role: \u201ceditor\u201d\r\n\r\n\u00a0\u00a0}\r\n\r\n}<\/pre>\n<p><span style=\"font-weight: 400;\">From a RESTful perspective, this violates the idea that message bodies are representations of resources, not a version<\/span><span style=\"font-weight: 400;\">\u00a0of the resource. We also have to wrap all our domain objects in a common wrapper class, which doesn\u2019t feel great\u2014if that wrapper class ever needs to change, all of our APIs potentially have to change with it.<\/span><\/p>\n<h3><b>Breaking Changes<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">Examples:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Delete path(URL changes)<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Rename path operationId<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Delete\/Rename parameters<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Add a constraint on a parameter (like isRequired)<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Modify a response item<\/span><\/li>\n<\/ul>\n<h3><b>Smooth Changes<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">Examples:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Add a path<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Add a param<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Add response item<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Add\/Update descriptions<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">Note<\/span> <span style=\"font-weight: 400;\">: <\/span><span style=\"font-weight: 400;\">consider using something beyond a simple counting scheme (v1, v2, etc). You can provide some more context to your users by using a date format (i.e. \u201c201911\u201d) or even <\/span><a href=\"https:\/\/semver.org\/\"><span style=\"font-weight: 400;\">semantic versioning<\/span><\/a><span style=\"font-weight: 400;\">.<\/span><\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Versioning of APIs is a decent practice. Versioning helps make your API more adaptable and versatile to changes while keeping the functionality intact. It also helps you manage changes to the code better and more easily revert back to old code if the new code causes problems. You ought to have an alternate form of [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":6231,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[256],"tags":[14,540],"class_list":["post-6227","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-java-application","tag-innovationm","tag-versioning-your-api"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Versioning your API - InnovationM - Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.innovationm.com\/blog\/versioning-your-api\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Versioning your API - InnovationM - Blog\" \/>\n<meta property=\"og:description\" content=\"Versioning of APIs is a decent practice. Versioning helps make your API more adaptable and versatile to changes while keeping the functionality intact. It also helps you manage changes to the code better and more easily revert back to old code if the new code causes problems. You ought to have an alternate form of [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.innovationm.com\/blog\/versioning-your-api\/\" \/>\n<meta property=\"og:site_name\" content=\"InnovationM - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2020-09-30T07:42:43+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/09\/Versioning-API.png\" \/>\n\t<meta property=\"og:image:width\" content=\"960\" \/>\n\t<meta property=\"og:image:height\" content=\"540\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"InnovationM Admin\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"InnovationM Admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/versioning-your-api\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/versioning-your-api\\\/\"},\"author\":{\"name\":\"InnovationM Admin\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#\\\/schema\\\/person\\\/a831bf4602d69d1fa452e3de0c8862ed\"},\"headline\":\"Versioning your API\",\"datePublished\":\"2020-09-30T07:42:43+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/versioning-your-api\\\/\"},\"wordCount\":538,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/versioning-your-api\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/09\\\/Versioning-API.png\",\"keywords\":[\"InnovationM\",\"Versioning your API\"],\"articleSection\":[\"Java Application\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/versioning-your-api\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/versioning-your-api\\\/\",\"url\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/versioning-your-api\\\/\",\"name\":\"Versioning your API - InnovationM - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/versioning-your-api\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/versioning-your-api\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/09\\\/Versioning-API.png\",\"datePublished\":\"2020-09-30T07:42:43+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#\\\/schema\\\/person\\\/a831bf4602d69d1fa452e3de0c8862ed\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/versioning-your-api\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/versioning-your-api\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/versioning-your-api\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/09\\\/Versioning-API.png\",\"contentUrl\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/09\\\/Versioning-API.png\",\"width\":960,\"height\":540},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/versioning-your-api\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Versioning your API\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/\",\"name\":\"InnovationM - Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#\\\/schema\\\/person\\\/a831bf4602d69d1fa452e3de0c8862ed\",\"name\":\"InnovationM Admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g\",\"caption\":\"InnovationM Admin\"},\"sameAs\":[\"http:\\\/\\\/www.innovationm.com\\\/\"],\"url\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/author\\\/innovationmadmin\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Versioning your API - InnovationM - Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.innovationm.com\/blog\/versioning-your-api\/","og_locale":"en_US","og_type":"article","og_title":"Versioning your API - InnovationM - Blog","og_description":"Versioning of APIs is a decent practice. Versioning helps make your API more adaptable and versatile to changes while keeping the functionality intact. It also helps you manage changes to the code better and more easily revert back to old code if the new code causes problems. You ought to have an alternate form of [&hellip;]","og_url":"https:\/\/www.innovationm.com\/blog\/versioning-your-api\/","og_site_name":"InnovationM - Blog","article_published_time":"2020-09-30T07:42:43+00:00","og_image":[{"width":960,"height":540,"url":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/09\/Versioning-API.png","type":"image\/png"}],"author":"InnovationM Admin","twitter_misc":{"Written by":"InnovationM Admin","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.innovationm.com\/blog\/versioning-your-api\/#article","isPartOf":{"@id":"https:\/\/www.innovationm.com\/blog\/versioning-your-api\/"},"author":{"name":"InnovationM Admin","@id":"https:\/\/www.innovationm.com\/blog\/#\/schema\/person\/a831bf4602d69d1fa452e3de0c8862ed"},"headline":"Versioning your API","datePublished":"2020-09-30T07:42:43+00:00","mainEntityOfPage":{"@id":"https:\/\/www.innovationm.com\/blog\/versioning-your-api\/"},"wordCount":538,"commentCount":0,"image":{"@id":"https:\/\/www.innovationm.com\/blog\/versioning-your-api\/#primaryimage"},"thumbnailUrl":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/09\/Versioning-API.png","keywords":["InnovationM","Versioning your API"],"articleSection":["Java Application"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.innovationm.com\/blog\/versioning-your-api\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.innovationm.com\/blog\/versioning-your-api\/","url":"https:\/\/www.innovationm.com\/blog\/versioning-your-api\/","name":"Versioning your API - InnovationM - Blog","isPartOf":{"@id":"https:\/\/www.innovationm.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.innovationm.com\/blog\/versioning-your-api\/#primaryimage"},"image":{"@id":"https:\/\/www.innovationm.com\/blog\/versioning-your-api\/#primaryimage"},"thumbnailUrl":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/09\/Versioning-API.png","datePublished":"2020-09-30T07:42:43+00:00","author":{"@id":"https:\/\/www.innovationm.com\/blog\/#\/schema\/person\/a831bf4602d69d1fa452e3de0c8862ed"},"breadcrumb":{"@id":"https:\/\/www.innovationm.com\/blog\/versioning-your-api\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.innovationm.com\/blog\/versioning-your-api\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.innovationm.com\/blog\/versioning-your-api\/#primaryimage","url":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/09\/Versioning-API.png","contentUrl":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/09\/Versioning-API.png","width":960,"height":540},{"@type":"BreadcrumbList","@id":"https:\/\/www.innovationm.com\/blog\/versioning-your-api\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.innovationm.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Versioning your API"}]},{"@type":"WebSite","@id":"https:\/\/www.innovationm.com\/blog\/#website","url":"https:\/\/www.innovationm.com\/blog\/","name":"InnovationM - Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.innovationm.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.innovationm.com\/blog\/#\/schema\/person\/a831bf4602d69d1fa452e3de0c8862ed","name":"InnovationM Admin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g","caption":"InnovationM Admin"},"sameAs":["http:\/\/www.innovationm.com\/"],"url":"https:\/\/www.innovationm.com\/blog\/author\/innovationmadmin\/"}]}},"_links":{"self":[{"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/posts\/6227","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/comments?post=6227"}],"version-history":[{"count":0,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/posts\/6227\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/media\/6231"}],"wp:attachment":[{"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/media?parent=6227"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/categories?post=6227"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/tags?post=6227"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}