{"id":3201,"date":"2018-08-16T10:32:12","date_gmt":"2018-08-15T22:32:12","guid":{"rendered":"http:\/\/www.zoyinc.com\/?p=3201"},"modified":"2018-08-16T10:34:33","modified_gmt":"2018-08-15T22:34:33","slug":"send-json-requests-to-a-vsts-service-hook-using-soapui","status":"publish","type":"post","link":"http:\/\/www.zoyinc.com\/?p=3201","title":{"rendered":"Send JSON requests to a VSTS service hook using SoapUI"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3241\" src=\"http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooksHeader04.jpg\" alt=\"\" width=\"1500\" height=\"629\" srcset=\"http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooksHeader04.jpg 1500w, http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooksHeader04-150x63.jpg 150w, http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooksHeader04-300x126.jpg 300w, http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooksHeader04-768x322.jpg 768w, http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooksHeader04-500x210.jpg 500w\" sizes=\"auto, (max-width: 1500px) 100vw, 1500px\" \/><\/p>\n<p>When I was creating a VSTS Git post-commit service hook it became clear fairly quickly that I needed to be able to simulate calls from VSTS using SoapUI. This is what I did.<\/p>\n<p><strong>SoapUI<\/strong>: <a  href=\"https:\/\/www.soapui.org\/downloads\/soapui.html\">https:\/\/www.soapui.org\/downloads\/soapui.html<\/a><\/p>\n<h2>Python script to capture VSTS requests<\/h2>\n<p>First thing needed is a basic Python script to log the incoming request so that we can copy these requests to SoapUI to mimic various commit scenarios. Obviously before you can do this you need to setup Python to run on Apache, see my notes: <a  href=\"http:\/\/www.zoyinc.com\/?p=3163\">Enable python scripts in Apache<\/a><\/p>\n<p>I created the below Python script that creates a logging file that will include a dump of the http request.<\/p>\n<p>Script: \/srv\/www\/webhooks\/log_request.py<br \/>\nLog: \/var\/log\/webhooks\/webhooks.log<br \/>\nRequests log: \/var\/log\/webhooks\/webhooks_requests.log<\/p>\n<pre class=\"lang:python decode:true \">#!\/usr\/bin\/env python\r\nimport cgi;\r\nimport cgitb;cgitb.enable()\r\nimport logging\r\nimport sys, json\r\n\r\n# Logging config\r\nlogging.basicConfig(level=logging.DEBUG,\r\n                    format='%(asctime)s %(levelname)s %(message)s',\r\n                    filename='\/var\/log\/webhooks\/webhooks.log',\r\n                    filemode='a')\r\n\r\n# Print headers\r\nprint \"Content-Type: text\/html\"\r\nprint \"\"\r\n\r\n# Print page\r\nprint(\"&lt;html&gt;\")\r\nprint(\"&lt;title&gt;Webhook Capture JSON Request&lt;\/title&gt;\")\r\nprint(\"&lt;body&gt;Capture JSON request by Zoyinc.&lt;\/body&gt;\")\r\nprint(\"&lt;\/html&gt;\")\r\n\r\nreceived_json_data = sys.stdin.read()\r\nrequestLogFile = open('\/var\/log\/webhooks\/webhooks_requests.log',\"a+\")\r\nparsed = json.loads(received_json_data)\r\nrequestLogFile.write( '============ Start JSON request ===============\\n')\r\nrequestLogFile.write( json.dumps(parsed, sort_keys=True, indent=4) + '\\n')\r\nrequestLogFile.write( '============ End JSON request =================\\n\\n\\n')\r\nrequestLogFile.close()\r\n<\/pre>\n<h2>Adding a web hook VSTS service hook<\/h2>\n<p>Next thing is to send a test request from VSTS to this script. Login to VSTS, select your project, click on &#8220;Project settings&#8221; then &#8220;Service hooks&#8221; and add a new &#8220;Subscription&#8221;:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-3206\" src=\"http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks01.jpg\" alt=\"\" width=\"650\" height=\"397\" srcset=\"http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks01.jpg 779w, http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks01-150x92.jpg 150w, http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks01-300x183.jpg 300w, http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks01-768x469.jpg 768w, http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks01-491x300.jpg 491w\" sizes=\"auto, (max-width: 650px) 100vw, 650px\" \/><\/p>\n<p>From the &#8220;Service&#8221; dialog select &#8220;Web Hooks&#8221; and click &#8220;Next&#8221;:<\/p>\n<figure id=\"attachment_3209\" aria-describedby=\"caption-attachment-3209\" style=\"width: 350px\" class=\"wp-caption aligncenter\"><a  href=\"http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks02.jpg\" class=\"thickbox no_icon\" title=\"\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-3209\" src=\"http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks02.jpg\" alt=\"\" width=\"350\" height=\"349\" srcset=\"http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks02.jpg 602w, http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks02-150x150.jpg 150w, http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks02-300x300.jpg 300w, http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks02-301x300.jpg 301w\" sizes=\"auto, (max-width: 350px) 100vw, 350px\" \/><\/a><figcaption id=\"caption-attachment-3209\" class=\"wp-caption-text\">+Enlarge<\/figcaption><\/figure>\n<p>This takes you to the &#8220;Trigger&#8221; screen from which you can see that should you want this web hook can be restricted to only one specific Git repo and even down to only a particular branch or team. Set your options and click on &#8220;Next&#8221;:<\/p>\n<figure id=\"attachment_3210\" aria-describedby=\"caption-attachment-3210\" style=\"width: 500px\" class=\"wp-caption aligncenter\"><a  href=\"http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks03.jpg\" class=\"thickbox no_icon\" title=\"\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-3210\" src=\"http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks03.jpg\" alt=\"\" width=\"500\" height=\"430\" srcset=\"http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks03.jpg 588w, http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks03-150x129.jpg 150w, http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks03-300x258.jpg 300w, http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks03-349x300.jpg 349w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/a><figcaption id=\"caption-attachment-3210\" class=\"wp-caption-text\">+Enlarge<\/figcaption><\/figure>\n<p>The next screen allows you to define the action to take. For our purposes we accept the defaults and put in the URL of:<\/p>\n<p style=\"padding-left: 30px;\">http:\/\/www.zoyinc.com\/webhooks\/log_request.py<\/p>\n<figure id=\"attachment_3214\" aria-describedby=\"caption-attachment-3214\" style=\"width: 450px\" class=\"wp-caption aligncenter\"><a  href=\"http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks04.jpg\" class=\"thickbox no_icon\" title=\"\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-3214\" src=\"http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks04.jpg\" alt=\"\" width=\"450\" height=\"538\" srcset=\"http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks04.jpg 588w, http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks04-125x150.jpg 125w, http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks04-251x300.jpg 251w\" sizes=\"auto, (max-width: 450px) 100vw, 450px\" \/><\/a><figcaption id=\"caption-attachment-3214\" class=\"wp-caption-text\">+Enlarge<\/figcaption><\/figure>\n<p>The important thing about this section is that you can send a test message. At the bottom of the &#8220;Action&#8221; dialog click on the &#8220;Test&#8221; button and it will send a test commit message to your Python script:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3217\" src=\"http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks05.jpg\" alt=\"\" width=\"411\" height=\"318\" srcset=\"http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks05.jpg 411w, http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks05-150x116.jpg 150w, http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks05-300x232.jpg 300w, http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks05-388x300.jpg 388w\" sizes=\"auto, (max-width: 411px) 100vw, 411px\" \/><\/p>\n<p>Our test Python script, detailed earlier, will output the requests to a file &#8220;\/var\/log\/webhooks\/webhooks.log&#8221;. Have a look at this file now and you will see the test we sent from VSTS. It will now look something like:<\/p>\n<pre class=\"crayon:false;\">============ Start JSON request ===============\r\n{\r\n    \"createdDate\": \"2018-08-12T06:44:45.3420112Z\",\r\n    \"detailedMessage\": {\r\n        \"html\": \"Jamal Hartnett pushed a commit to &lt;a href=\\\"https:\/\/fabrikam-fiber-inc.visualstudio.com\/DefaultCollection\/_git\/Fabrikam-Fiber-Git\/\\\"&gt;Fabrikam-Fiber-Git&lt;\/a&gt;:&lt;a href=\\\"https:\/\/fabrikam-fiber-inc.visualstudio.com\/DefaultCollection\/_git\/Fabrikam-Fiber-Git\/#version=GBmaster\\\"&gt;master&lt;\/a&gt;.\\n&lt;ul&gt;\\n&lt;li&gt;Fixed bug in web.config file &lt;a href=\\\"https:\/\/fabrikam-fiber-inc.visualstudio.com\/DefaultCollection\/_git\/Fabrikam-Fiber-Git\/commit\/33b55f7cb7e7e245323987634f960cf4a6e6bc74\\\"&gt;33b55f7c&lt;\/a&gt;\\n&lt;\/ul&gt;\",\r\n        \"markdown\": \"Jamal Hartnett pushed a commit to [Fabrikam-Fiber-Git](https:\/\/fabrikam-fiber-inc.visualstudio.com\/DefaultCollection\/_git\/Fabrikam-Fiber-Git\/):[master](https:\/\/fabrikam-fiber-inc.visualstudio.com\/DefaultCollection\/_git\/Fabrikam-Fiber-Git\/#version=GBmaster).\\n* Fixed bug in web.config file [33b55f7c](https:\/\/fabrikam-fiber-inc.visualstudio.com\/DefaultCollection\/_git\/Fabrikam-Fiber-Git\/commit\/33b55f7cb7e7e245323987634f960cf4a6e6bc74)\",\r\n        \"text\": \"Jamal Hartnett pushed a commit to Fabrikam-Fiber-Git:master.\\n - Fixed bug in web.config file 33b55f7c\"\r\n    },\r\n    \"eventType\": \"git.push\",\r\n    \"id\": \"03c164c2-8912-4d5e-8009-3707d5f83734\",\r\n    \"message\": {\r\n        \"html\": \"Jamal Hartnett pushed updates to Fabrikam-Fiber-Git:master.\",\r\n        \"markdown\": \"Jamal Hartnett pushed updates to `Fabrikam-Fiber-Git`:`master`.\",\r\n        \"text\": \"Jamal Hartnett pushed updates to Fabrikam-Fiber-Git:master.\"\r\n    },\r\n    \"notificationId\": 9,\r\n    \"publisherId\": \"tfs\",\r\n    \"resource\": {\r\n        \"commits\": [\r\n            {\r\n                \"author\": {\r\n                    \"date\": \"2015-02-25T19:01:00Z\",\r\n                    \"email\": \"fabrikamfiber4@hotmail.com\",\r\n                    \"name\": \"Jamal Hartnett\"<\/pre>\n<pre class=\"crayon:false;\">        },\r\n        \"collection\": {\r\n            \"id\": \"c12d0eb8-e382-443b-9f9c-c52cba5014c2\"\r\n        },\r\n        \"project\": {\r\n            \"id\": \"be9b3917-87e6-42a4-a549-2bc06a7a878f\"\r\n        }\r\n    },\r\n    \"resourceVersion\": \"1.0\",\r\n    \"subscriptionId\": \"00000000-0000-0000-0000-000000000000\"\r\n}\r\n============ End JSON request =================<\/pre>\n<p>Thus the section between &#8220;<em>============ Start JSON request ===============<\/em>&#8221; and &#8220;<em>============ End JSON request =================<\/em>&#8221; is the actual request that we will use with SoapUI to sent test requests.<\/p>\n<p>Now finish the VSTS service hook by closing the test dialog and then clicking on the &#8220;Finish&#8221; button.<\/p>\n<h2>Create SoapUI Project<\/h2>\n<p>I am using SoapUI 5.4.0 and it keeps freezing on me. Following a suggestion from Ahmet Aksoy: <a  href=\"https:\/\/aaxoy.wordpress.com\/2011\/02\/02\/soapui-gui-freeze-in-windows-7\/\">Soapui GUI freeze in 64 bit\u00a0Windows<\/a>\u00a0, I would suggest <strong>prior to starting SoapUI<\/strong> add &#8220;-Dsoapui.jxbrowser.disable=true&#8221; to the bottom of the file:<\/p>\n<p style=\"padding-left: 30px;\">C:\\Program Files\\SmartBear\\SoapUI-5.4.0\\bin\\SoapUI-5.4.0.vmoptions<\/p>\n<p>Moving on &#8230;<\/p>\n<p>So now we have our test SoapUI message so open up SoapUI and select:<\/p>\n<p style=\"padding-left: 30px;\">File | New REST Project<\/p>\n<p>You will be prompted for the URI, enter the URL for your test Python script and click &#8220;OK&#8221;:<\/p>\n<p style=\"padding-left: 30px;\">http:\/\/www.zoyinc.com\/webhooks\/log_request.py<\/p>\n<p>You should now see something like below<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3223\" src=\"http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks06.jpg\" alt=\"\" width=\"901\" height=\"291\" srcset=\"http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks06.jpg 901w, http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks06-150x48.jpg 150w, http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks06-300x97.jpg 300w, http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks06-768x248.jpg 768w, http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks06-500x161.jpg 500w\" sizes=\"auto, (max-width: 901px) 100vw, 901px\" \/>Change the &#8220;Method&#8221;, highlighted, from &#8220;GET&#8221; to &#8220;POST&#8221;. This will open up a dialog at the bottom where you can paste your request that you captured earlier &#8211; ensure you include the start and end curly brackets &#8220;{&#8221; and &#8220;}&#8221; as the first and last characters.<\/p>\n<p>Note if you don&#8217;t see the &#8220;Request 1&#8221; panel above then right click on &#8220;Request 1&#8221; and from the popup menu select &#8220;Show Request Editor&#8221;:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3224\" src=\"http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks07.jpg\" alt=\"\" width=\"462\" height=\"178\" srcset=\"http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks07.jpg 462w, http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks07-150x58.jpg 150w, http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks07-300x116.jpg 300w\" sizes=\"auto, (max-width: 462px) 100vw, 462px\" \/><\/p>\n<p>You should now see something like the below:<\/p>\n<figure id=\"attachment_3226\" aria-describedby=\"caption-attachment-3226\" style=\"width: 600px\" class=\"wp-caption aligncenter\"><a  href=\"http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks08.jpg\" class=\"thickbox no_icon\" title=\"\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-3226\" src=\"http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks08.jpg\" alt=\"\" width=\"600\" height=\"437\" srcset=\"http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks08.jpg 823w, http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks08-150x109.jpg 150w, http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks08-300x218.jpg 300w, http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks08-768x559.jpg 768w, http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks08-412x300.jpg 412w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a><figcaption id=\"caption-attachment-3226\" class=\"wp-caption-text\">+Enlarge<\/figcaption><\/figure>\n<p>Looking at the highlighted section, you should have &#8220;Media Type&#8221; set to the default of &#8220;application\/json&#8221; and the text box should be where you pasted the request.<\/p>\n<h2>Run the test<\/h2>\n<p>To send this test message to your Python test script simply click on the SoapUI &#8220;Play&#8221; button:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-3228 aligncenter\" src=\"http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks09.jpg\" alt=\"\" width=\"156\" height=\"102\" srcset=\"http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks09.jpg 156w, http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks09-150x98.jpg 150w\" sizes=\"auto, (max-width: 156px) 100vw, 156px\" \/><\/p>\n<p>This should send the request which will appear in the file &#8220;webhooks_requests.log&#8221; as it did earlier when you conducted the test from VSTS. You should compare the contents of the request sent from SoapUI to that sent by VSTS, as recorded in\u00a0&#8220;webhooks_requests.log&#8221; &#8211; they should be identical.<\/p>\n<p>You should also see the response from the Python script in the results pane:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3230\" src=\"http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks10.jpg\" alt=\"\" width=\"828\" height=\"279\" srcset=\"http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks10.jpg 828w, http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks10-150x51.jpg 150w, http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks10-300x101.jpg 300w, http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks10-768x259.jpg 768w, http:\/\/www.zoyinc.com\/wp-content\/uploads\/2018\/08\/SendJSONRequestsToServiceHooks10-500x168.jpg 500w\" sizes=\"auto, (max-width: 828px) 100vw, 828px\" \/><\/p>\n<h2>Done<\/h2>\n<p>Now you can mimic VSTS requests and can capture standard commit messages to your repo. Then use these as test requests from SoapUI &#8211; meaning you can send the same commit message to your service hook endpoint without having to go through the hassle of actually creating commit after commit after commit.<\/p>\n<p>The sort of tests you might want to run would likely include things like a push which included multiple commits.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>When I was creating a VSTS Git post-commit service hook it became clear fairly quickly that I needed to be able to simulate calls from VSTS using SoapUI. This is what I did. SoapUI: https:\/\/www.soapui.org\/downloads\/soapui.html Python script to capture VSTS requests First thing needed is a basic Python script to log the incoming request so [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":3244,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[442],"tags":[447,446,448,444,445,449,443],"class_list":["post-3201","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-vsts","tag-git","tag-hook-script","tag-service-hook","tag-soapui","tag-test","tag-visualstudio","tag-vsts"],"_links":{"self":[{"href":"http:\/\/www.zoyinc.com\/index.php?rest_route=\/wp\/v2\/posts\/3201","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.zoyinc.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.zoyinc.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.zoyinc.com\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/www.zoyinc.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3201"}],"version-history":[{"count":31,"href":"http:\/\/www.zoyinc.com\/index.php?rest_route=\/wp\/v2\/posts\/3201\/revisions"}],"predecessor-version":[{"id":3248,"href":"http:\/\/www.zoyinc.com\/index.php?rest_route=\/wp\/v2\/posts\/3201\/revisions\/3248"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/www.zoyinc.com\/index.php?rest_route=\/wp\/v2\/media\/3244"}],"wp:attachment":[{"href":"http:\/\/www.zoyinc.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3201"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.zoyinc.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3201"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.zoyinc.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3201"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}