{"id":22496,"date":"2016-09-14T08:00:01","date_gmt":"2016-09-14T15:00:01","guid":{"rendered":"https:\/\/www.jamasoftware.com\/?p=22496"},"modified":"2023-01-12T16:54:56","modified_gmt":"2023-01-13T00:54:56","slug":"testing-rest-clients-with-restito","status":"publish","type":"post","link":"https:\/\/www.jamasoftware.com\/legacy\/blog\/2016\/09\/14\/testing-rest-clients-with-restito\/","title":{"rendered":"Testing REST Clients with Restito"},"content":{"rendered":"<p>I&#8217;m excited about this new library I ran into and I would like to share the excitement. It&#8217;s called Restito, it&#8217;s on <a href=\"https:\/\/github.com\/mkotsur\/restito\">GitHub<\/a>, and I actually found it on <a href=\"https:\/\/antoniogoncalves.org\/2012\/12\/19\/test-your-jax-rs-2-0-web-service-uris-without-mocks\/\">a blog from 2012<\/a>, so&#8230; <em>where were you all this time?<\/em><\/p>\n<p>Restito is a Java library to mock out REST APIs. It&#8217;s self-described as the complement of REST Assured. REST Assured is also a library used for testing REST APIs (like Restito), but it mimics the client (while Restito mimics the server), it has a fluent API (like Restito), and it&#8217;s very popular (no shame in aspiring for popularity). In fact, I see REST Assured as the gold standard for testing REST APIs. Restito, on the other hand, is new to me.<\/p>\n<p><img decoding=\"async\" class=\"aligncenter wp-image-22497 size-full\" src=\"https:\/\/static.jamasoftware.com\/www\/imports\/2016\/09\/Sander-w.png\" alt=\"Restito\" width=\"268\" height=\"325\" \/><\/p>\n<h3>Problem<\/h3>\n<p>What problem are we trying to solve here? We are building a service that&#8217;s chatting with a remote instance of our Jama application, using Jama&#8217;s REST API.<\/p>\n<p><img decoding=\"async\" class=\"aligncenter wp-image-22498 size-full\" src=\"https:\/\/static.jamasoftware.com\/www\/imports\/2016\/09\/Sander-2.png\" alt=\"Restito\" width=\"376\" height=\"151\" \/><\/p>\n<p>Inside the service there is a whole chain of classes, that are dependent on each other. There is a class <code>JamaProxy<\/code>, which has some business level methods in the context of our Jama application. It calls into <code>JamaRestClient<\/code>, which understands how to form request URLs and payloads compliant with Jama&#8217;s REST API. It uses <code>javax.ws.rs.client.WebTarget<\/code> and friends to set up the actual connection with the remote Jama application.<\/p>\n<p><img decoding=\"async\" class=\"aligncenter wp-image-22499 size-full\" src=\"https:\/\/static.jamasoftware.com\/www\/imports\/2016\/09\/Sander-3.png\" alt=\"Restito\" width=\"1214\" height=\"160\" \/><\/p>\n<p>Concerns are separated, and when it comes to unit testing, each concern can also be unit tested separately. <code>IntegrationHandler<\/code> has a corresponding <code>IntegrationHandlerTest<\/code>, which uses a mocked version of <code>JamaProxy<\/code>. The same for <code>JamaProxy<\/code>, which uses a mocked version of <code>JamaRestClient<\/code>. But how do we unit test <code>JamaRestClient<\/code>?<\/p>\n<p><code>JamaRestClient<\/code> is strongly tied to <code>WebTarget<\/code> (in fact, its only purpose in life is transformation into and out from <code>WebTarget<\/code>); it makes no sense to abstract <code>WebTarget<\/code> out of <code>JamaRestClient<\/code>. I have tried to mock <code>WebTarget<\/code> in unit tests before, and found it notoriously hard to mock (hard meaning annoying and ugly). The way a lot of its method calls are chained (fluent API, builder pattern) doesn&#8217;t lead to very pretty unit test code. Also, mocking out a request library is scary because there are so many ways you can end up with a mock that doesn&#8217;t behave like the real thing.<\/p>\n<p>It would be more realistic if we used real communication to the real REST API. It would allow us to use the real request library. Restito lets us use real communication, without the need to set up a real Jama application to talk to. (If you are going to tell me that this is not real unit testing, please<em> talk to the hand<\/em>: we have narrowed the scope of the test to the smallest unit that makes sense, and we&#8217;re doing it in a way that increases confidence in our product.)<\/p>\n<p>When it comes to integration testing, you might have the same problem. Depending on how you define<em> integration testing<\/em>, it may be undesirable to create real Jama application to communicate with. Restito can help in the same way as for unit testing. It&#8217;s not a full substitute for &#8220;the real thing&#8221;, so we likely desire a system test that involves a real Jama application, but Restito will help boost confidence in earlier phases of development.<\/p>\n<h3>Including Restito<\/h3>\n<p>Restito is available as a Maven artifact, so you add it to the POM file as follows:<\/p>\n<pre class=\"lang:default decode:true \">&lt;dependencies&gt;  \n...  \n    &lt;dependency&gt;  \n        &lt;groupId&gt;com.xebialabs.restito&lt;\/groupId&gt;  \n        &lt;artifactId&gt;restito&lt;\/artifactId&gt;  \n        &lt;version&gt;0.8.2&lt;\/version&gt;  \n        &lt;scope&gt;test&lt;\/scope&gt;  \n    &lt;\/dependency&gt;<\/pre>\n<p>Your POM would also have dependencies on the client library, for example <code>javax.ws.rs-api<\/code> for <code>WebTarget<\/code>, but that&#8217;s beside the point here.<\/p>\n<h3>How It Works<\/h3>\n<p>Restito sets up a little web server, on a random available port. It is then possible to set up expectations, before exercising the test subject. Then even verifications can be done to make sure that calls to the REST API actually happened, in the way expected. Here is some example code &#8212; some non-essential constants and methods, as well as imports omitted for brevity:<\/p>\n<pre class=\"lang:default decode:true \">public class JamaRestClientTest {  \n    private StubServer server = new StubServer();  \n    private ObjectMapper objectMapper = new ObjectMapper();  \n  \n    @Before  \n    public void setUp() {  \n        server.run();  \n    }  \n  \n    @Test  \n    public void testGetItem() throws JsonProcessingException {  \n        Item expected = someItem(SOME_ITEM_ID);  \n  \n        whenHttp(server)  \n                .match(get(format(\"\/contour\/rest\/v1\/items\/%d\", SOME_ITEM_ID)))  \n                .then(ok(), jsonContent(expected), contentType(\"application\/json\"));  \n  \n        JamaRestClient subject\n            = new JamaRestClient(baseUrl(), MY_USER_NAME, MY_PASSWORD, null);  \n        Item actual = subject.get(\"items\", SOME_ITEM_ID, Item.class);  \n  \n        assertEquals(SOME_ITEM_ID, actual.getId());  \n    }  \n  \n    private Action jsonContent(Object object) throws JsonProcessingException {  \n        return stringContent(objectMapper.writeValueAsString(object));  \n    }  \n  \n    private String baseUrl() {  \n        return format(\"http:\/\/localhost:%d\/contour\", server.getPort());  \n    }  \n}<\/pre>\n<p>Some things to note in the above code fragment: I have also introduced some usage of Jackson&#8217;s <code>ObjectMapper<\/code>, so that I don&#8217;t need to deal with literal JSON here, but can just pass an object in. I&#8217;ve not seen support for that in Restito, and I find that unfortunate.<\/p>\n<p>The code is fairly easy to read, thanks to the fluent API of Restito, and without the need to mock out all the nested objects returned by WebTarget&#8217;s fluent API. I find it interesting how that almost sounds at odds: using a nice fluent API for a mock <em>because<\/em> fluent APIs are so hard to mock.<\/p>\n<p>An example of a verification that could be added to the above example would be like this:<\/p>\n<pre class=\"lang:default decode:true \">verifyHttp(server)  \n    .once(method(Method.GET),\n        parameter(\"documentKey\", \"DOC-KEY-123\"),\n        not(withHeader(\"x-some-header\")));<\/pre>\n<p>The above code fragment shows how we verify that the server actually received an HTTP <code>GET<\/code> request<em> once<\/em>, with a certain query parameter, and specifically without a header called <code>x-some-header<\/code>.<\/p>\n<h3>Conclusion<\/h3>\n<p>I observe that Restito does not have the richness and cleanness on its fluent API, as REST Assured does, which it seems to aspire to. But I&#8217;ve fallen in love with it nonetheless, because I can see the void it&#8217;s filling. I was able to create a working test with Restito in under 15 minutes from the moment I started Googling. (It actually was 14 minutes, I time myself.) I know I will be using it a lot in the future.<\/p>\n<input class=\"fooboxshare_post_id\" type=\"hidden\" value=\"22496\"\/>","protected":false},"excerpt":{"rendered":"<p>I&#8217;m excited about this new library I ran into and I would like to share the excitement. It&#8217;s called Restito, it&#8217;s on GitHub, and I actually found it on a blog from 2012, so&#8230; where were you all this time? Restito is a Java library to mock out REST APIs. It&#8217;s self-described as the complement [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[847],"tags":[207,172,266],"industry":[],"class_list":["post-22496","post","type-post","status-publish","format-standard","hentry","category-ecosystem","tag-java","tag-rest-api","tag-restito"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v28.1 (Yoast SEO v28.1) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Testing REST Clients with Restito - Jama Software<\/title>\n<meta name=\"description\" content=\"Where were you all this time? I&#039;m excited about this new library I ran into and I would like to share the excitement. It&#039;s on GitHub and on a 2012 blog.\" \/>\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.jamasoftware.com\/blog\/2016\/09\/14\/testing-rest-clients-with-restito\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Testing REST Clients with Restito\" \/>\n<meta property=\"og:description\" content=\"Where were you all this time? I&#039;m excited about this new library I ran into and I would like to share the excitement. It&#039;s on GitHub and on a 2012 blog.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.jamasoftware.com\/blog\/2016\/09\/14\/testing-rest-clients-with-restito\/\" \/>\n<meta property=\"og:site_name\" content=\"Jama Software\" \/>\n<meta property=\"article:published_time\" content=\"2016-09-14T15:00:01+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-01-13T00:54:56+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/static.jamasoftware.com\/www\/imports\/2016\/09\/Sander-w.png\" \/>\n<meta name=\"author\" content=\"Jama Software\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jama Software\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.jamasoftware.com\\\/blog\\\/2016\\\/09\\\/14\\\/testing-rest-clients-with-restito\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.jamasoftware.com\\\/blog\\\/2016\\\/09\\\/14\\\/testing-rest-clients-with-restito\\\/\"},\"author\":{\"name\":\"Jama Software\",\"@id\":\"https:\\\/\\\/www.jamasoftware.com\\\/#\\\/schema\\\/person\\\/59a942565a528aa5f56b240c9342fc7f\"},\"headline\":\"Testing REST Clients with Restito\",\"datePublished\":\"2016-09-14T15:00:01+00:00\",\"dateModified\":\"2023-01-13T00:54:56+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.jamasoftware.com\\\/blog\\\/2016\\\/09\\\/14\\\/testing-rest-clients-with-restito\\\/\"},\"wordCount\":875,\"image\":{\"@id\":\"https:\\\/\\\/www.jamasoftware.com\\\/blog\\\/2016\\\/09\\\/14\\\/testing-rest-clients-with-restito\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/static.jamasoftware.com\\\/www\\\/imports\\\/2016\\\/09\\\/Sander-w.png\",\"keywords\":[\"Java\",\"REST API\",\"Restito\"],\"articleSection\":[\"Ecosystem\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.jamasoftware.com\\\/blog\\\/2016\\\/09\\\/14\\\/testing-rest-clients-with-restito\\\/\",\"url\":\"https:\\\/\\\/www.jamasoftware.com\\\/blog\\\/2016\\\/09\\\/14\\\/testing-rest-clients-with-restito\\\/\",\"name\":\"Testing REST Clients with Restito - Jama Software\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.jamasoftware.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.jamasoftware.com\\\/blog\\\/2016\\\/09\\\/14\\\/testing-rest-clients-with-restito\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.jamasoftware.com\\\/blog\\\/2016\\\/09\\\/14\\\/testing-rest-clients-with-restito\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/static.jamasoftware.com\\\/www\\\/imports\\\/2016\\\/09\\\/Sander-w.png\",\"datePublished\":\"2016-09-14T15:00:01+00:00\",\"dateModified\":\"2023-01-13T00:54:56+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.jamasoftware.com\\\/#\\\/schema\\\/person\\\/59a942565a528aa5f56b240c9342fc7f\"},\"description\":\"Where were you all this time? I'm excited about this new library I ran into and I would like to share the excitement. It's on GitHub and on a 2012 blog.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.jamasoftware.com\\\/blog\\\/2016\\\/09\\\/14\\\/testing-rest-clients-with-restito\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.jamasoftware.com\\\/blog\\\/2016\\\/09\\\/14\\\/testing-rest-clients-with-restito\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.jamasoftware.com\\\/blog\\\/2016\\\/09\\\/14\\\/testing-rest-clients-with-restito\\\/#primaryimage\",\"url\":\"https:\\\/\\\/static.jamasoftware.com\\\/www\\\/imports\\\/2016\\\/09\\\/Sander-w.png\",\"contentUrl\":\"https:\\\/\\\/static.jamasoftware.com\\\/www\\\/imports\\\/2016\\\/09\\\/Sander-w.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.jamasoftware.com\\\/blog\\\/2016\\\/09\\\/14\\\/testing-rest-clients-with-restito\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.jamasoftware.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Testing REST Clients with Restito\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.jamasoftware.com\\\/#website\",\"url\":\"https:\\\/\\\/www.jamasoftware.com\\\/\",\"name\":\"Jama Software\",\"description\":\"Jama Connect\u00ae #1 in Requirements Management\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.jamasoftware.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.jamasoftware.com\\\/#\\\/schema\\\/person\\\/59a942565a528aa5f56b240c9342fc7f\",\"name\":\"Jama Software\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/6e1172c5d380b2a20a9e5b5a4c0fb4e38bc497dc27ce100567da29abe37001af?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/6e1172c5d380b2a20a9e5b5a4c0fb4e38bc497dc27ce100567da29abe37001af?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/6e1172c5d380b2a20a9e5b5a4c0fb4e38bc497dc27ce100567da29abe37001af?s=96&d=mm&r=g\",\"caption\":\"Jama Software\"},\"description\":\"Subject matter experts from Jama Software provide guidance and best practices on requirements management, test management, compliance and regulation, risk management, and complex product and software development.\",\"url\":\"https:\\\/\\\/www.jamasoftware.com\\\/blog\\\/author\\\/jama-software\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Testing REST Clients with Restito - Jama Software","description":"Where were you all this time? I'm excited about this new library I ran into and I would like to share the excitement. It's on GitHub and on a 2012 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.jamasoftware.com\/blog\/2016\/09\/14\/testing-rest-clients-with-restito\/","og_locale":"en_US","og_type":"article","og_title":"Testing REST Clients with Restito","og_description":"Where were you all this time? I'm excited about this new library I ran into and I would like to share the excitement. It's on GitHub and on a 2012 blog.","og_url":"https:\/\/www.jamasoftware.com\/blog\/2016\/09\/14\/testing-rest-clients-with-restito\/","og_site_name":"Jama Software","article_published_time":"2016-09-14T15:00:01+00:00","article_modified_time":"2023-01-13T00:54:56+00:00","og_image":[{"url":"https:\/\/static.jamasoftware.com\/www\/imports\/2016\/09\/Sander-w.png","type":"","width":"","height":""}],"author":"Jama Software","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Jama Software","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.jamasoftware.com\/blog\/2016\/09\/14\/testing-rest-clients-with-restito\/#article","isPartOf":{"@id":"https:\/\/www.jamasoftware.com\/blog\/2016\/09\/14\/testing-rest-clients-with-restito\/"},"author":{"name":"Jama Software","@id":"https:\/\/www.jamasoftware.com\/#\/schema\/person\/59a942565a528aa5f56b240c9342fc7f"},"headline":"Testing REST Clients with Restito","datePublished":"2016-09-14T15:00:01+00:00","dateModified":"2023-01-13T00:54:56+00:00","mainEntityOfPage":{"@id":"https:\/\/www.jamasoftware.com\/blog\/2016\/09\/14\/testing-rest-clients-with-restito\/"},"wordCount":875,"image":{"@id":"https:\/\/www.jamasoftware.com\/blog\/2016\/09\/14\/testing-rest-clients-with-restito\/#primaryimage"},"thumbnailUrl":"https:\/\/static.jamasoftware.com\/www\/imports\/2016\/09\/Sander-w.png","keywords":["Java","REST API","Restito"],"articleSection":["Ecosystem"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.jamasoftware.com\/blog\/2016\/09\/14\/testing-rest-clients-with-restito\/","url":"https:\/\/www.jamasoftware.com\/blog\/2016\/09\/14\/testing-rest-clients-with-restito\/","name":"Testing REST Clients with Restito - Jama Software","isPartOf":{"@id":"https:\/\/www.jamasoftware.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.jamasoftware.com\/blog\/2016\/09\/14\/testing-rest-clients-with-restito\/#primaryimage"},"image":{"@id":"https:\/\/www.jamasoftware.com\/blog\/2016\/09\/14\/testing-rest-clients-with-restito\/#primaryimage"},"thumbnailUrl":"https:\/\/static.jamasoftware.com\/www\/imports\/2016\/09\/Sander-w.png","datePublished":"2016-09-14T15:00:01+00:00","dateModified":"2023-01-13T00:54:56+00:00","author":{"@id":"https:\/\/www.jamasoftware.com\/#\/schema\/person\/59a942565a528aa5f56b240c9342fc7f"},"description":"Where were you all this time? I'm excited about this new library I ran into and I would like to share the excitement. It's on GitHub and on a 2012 blog.","breadcrumb":{"@id":"https:\/\/www.jamasoftware.com\/blog\/2016\/09\/14\/testing-rest-clients-with-restito\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.jamasoftware.com\/blog\/2016\/09\/14\/testing-rest-clients-with-restito\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.jamasoftware.com\/blog\/2016\/09\/14\/testing-rest-clients-with-restito\/#primaryimage","url":"https:\/\/static.jamasoftware.com\/www\/imports\/2016\/09\/Sander-w.png","contentUrl":"https:\/\/static.jamasoftware.com\/www\/imports\/2016\/09\/Sander-w.png"},{"@type":"BreadcrumbList","@id":"https:\/\/www.jamasoftware.com\/blog\/2016\/09\/14\/testing-rest-clients-with-restito\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.jamasoftware.com\/"},{"@type":"ListItem","position":2,"name":"Testing REST Clients with Restito"}]},{"@type":"WebSite","@id":"https:\/\/www.jamasoftware.com\/#website","url":"https:\/\/www.jamasoftware.com\/","name":"Jama Software","description":"Jama Connect\u00ae #1 in Requirements Management","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.jamasoftware.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.jamasoftware.com\/#\/schema\/person\/59a942565a528aa5f56b240c9342fc7f","name":"Jama Software","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/6e1172c5d380b2a20a9e5b5a4c0fb4e38bc497dc27ce100567da29abe37001af?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/6e1172c5d380b2a20a9e5b5a4c0fb4e38bc497dc27ce100567da29abe37001af?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/6e1172c5d380b2a20a9e5b5a4c0fb4e38bc497dc27ce100567da29abe37001af?s=96&d=mm&r=g","caption":"Jama Software"},"description":"Subject matter experts from Jama Software provide guidance and best practices on requirements management, test management, compliance and regulation, risk management, and complex product and software development.","url":"https:\/\/www.jamasoftware.com\/blog\/author\/jama-software\/"}]}},"_links":{"self":[{"href":"https:\/\/www.jamasoftware.com\/legacy\/wp-json\/wp\/v2\/posts\/22496","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.jamasoftware.com\/legacy\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.jamasoftware.com\/legacy\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.jamasoftware.com\/legacy\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.jamasoftware.com\/legacy\/wp-json\/wp\/v2\/comments?post=22496"}],"version-history":[{"count":0,"href":"https:\/\/www.jamasoftware.com\/legacy\/wp-json\/wp\/v2\/posts\/22496\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.jamasoftware.com\/legacy\/wp-json\/wp\/v2\/media?parent=22496"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.jamasoftware.com\/legacy\/wp-json\/wp\/v2\/categories?post=22496"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.jamasoftware.com\/legacy\/wp-json\/wp\/v2\/tags?post=22496"},{"taxonomy":"industry","embeddable":true,"href":"https:\/\/www.jamasoftware.com\/legacy\/wp-json\/wp\/v2\/industry?post=22496"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}