<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: subramn</title>
    <description>The latest articles on DEV Community by subramn (@subramn).</description>
    <link>https://dev.to/subramn</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F109532%2F50599a49-11b3-4a5b-a406-f81f2302c1e5.jpg</url>
      <title>DEV Community: subramn</title>
      <link>https://dev.to/subramn</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/subramn"/>
    <language>en</language>
    <item>
      <title>How to Create a product backlog item using Azure Dev Ops Restful API</title>
      <dc:creator>subramn</dc:creator>
      <pubDate>Wed, 05 Jul 2023 02:17:35 +0000</pubDate>
      <link>https://dev.to/subramn/how-to-create-a-product-backlog-item-using-azure-dev-ops-restful-api-2lj0</link>
      <guid>https://dev.to/subramn/how-to-create-a-product-backlog-item-using-azure-dev-ops-restful-api-2lj0</guid>
      <description>&lt;p&gt;Why? — Sharing some of the lessons with developer community on how to automate repeatable tasks with Azure Dev Ops Rest API.&lt;/p&gt;

&lt;p&gt;You can apply this pattern to create work items, trigger builds, test cases etc.&lt;/p&gt;

&lt;p&gt;IDE: Visual Studio Code&lt;/p&gt;

&lt;p&gt;Tech Stack: C#, FlurlHttp, Azure Dev Ops Restful API&lt;/p&gt;

&lt;p&gt;Prerequisites:&lt;/p&gt;

&lt;p&gt;Account created in Azure Dev Ops: &lt;a href="https://azure.microsoft.com/en-us/products/devops/?nav=min"&gt;https://azure.microsoft.com/en-us/products/devops/?nav=min&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;API Reference : &lt;a href="https://learn.microsoft.com/en-us/rest/api/azure/devops/?view=azure-devops-rest-7.1"&gt;https://learn.microsoft.com/en-us/rest/api/azure/devops/?view=azure-devops-rest-7.1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Create a Team project with the name : DevOpsDemos with Version control as “Git” and Work item process as “Scrum”&lt;/p&gt;

&lt;p&gt;Go to User settings &amp;gt;&amp;gt; Personal access tokens and generate a new token so that it can be used for accessing the api.&lt;/p&gt;

&lt;p&gt;How the code is structed:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QEHzhVE0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/59mdvcqkyt4i2sgo957t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QEHzhVE0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/59mdvcqkyt4i2sgo957t.png" alt="Image description" width="270" height="540"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 1: Create a ASP.NET Core Minimal Web API with the following packages:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_hbuYTaW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/57fn2td68vlb9u0o0zvr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_hbuYTaW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/57fn2td68vlb9u0o0zvr.png" alt="Image description" width="763" height="92"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 2: Update appsettings.json as follows:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JA0v_UnI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/753wpxxjnp9kp1x0uo2l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JA0v_UnI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/753wpxxjnp9kp1x0uo2l.png" alt="Image description" width="713" height="159"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 3: Create a record with the name “AzureDevOpsSettings” to load the configuration from appsettings.json created in previous step.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--T8NpuUx7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2vmwnk51efi2ygsqc63c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--T8NpuUx7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2vmwnk51efi2ygsqc63c.png" alt="Image description" width="686" height="325"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 4: Create Azure Dev Ops Client Request class as follows:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PfJN7KtE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5z5d148f16vna6zbk5vv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PfJN7KtE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5z5d148f16vna6zbk5vv.png" alt="Image description" width="680" height="347"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 5: Create an Access Token Provider class with an interface as follows:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sHU8acnW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hcdb17jh9bh8mt4t8ssd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sHU8acnW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hcdb17jh9bh8mt4t8ssd.png" alt="Image description" width="657" height="114"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KsV3DwmY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b8bs6hdzor2kzj62klpv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KsV3DwmY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b8bs6hdzor2kzj62klpv.png" alt="Image description" width="800" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 6:&lt;/p&gt;

&lt;p&gt;Create a AzureDevOpsHttpClientAdapter class with an interface as follows:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TZK7hqoZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/izfa5fpr0t8ktj0ib31q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TZK7hqoZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/izfa5fpr0t8ktj0ib31q.png" alt="Image description" width="800" height="103"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Mym6c99h--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/shk56fik99td9rmsjuwm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Mym6c99h--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/shk56fik99td9rmsjuwm.png" alt="Image description" width="800" height="256"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---Q9V1rXo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y23qmu8zt62bax34khqx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---Q9V1rXo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y23qmu8zt62bax34khqx.png" alt="Image description" width="800" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RZH1k0xe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/udt6ntqys2ucao6gcwg4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RZH1k0xe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/udt6ntqys2ucao6gcwg4.png" alt="Image description" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cb2Q5UvE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/438se34jgrfu02jyo8ov.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cb2Q5UvE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/438se34jgrfu02jyo8ov.png" alt="Image description" width="631" height="217"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 7:&lt;/p&gt;

&lt;p&gt;Create an AzureDevOpsServicesManager class with an interface as follows:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_N3k4Civ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4asvgf059430eisdj4rm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_N3k4Civ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4asvgf059430eisdj4rm.png" alt="Image description" width="800" height="132"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pXAOI4B3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kxqrhb2p83x4kovwgkok.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pXAOI4B3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kxqrhb2p83x4kovwgkok.png" alt="Image description" width="800" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ry9WT6HB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/plpg9sk6m3kh1u5fs0an.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ry9WT6HB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/plpg9sk6m3kh1u5fs0an.png" alt="Image description" width="657" height="216"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 8:&lt;/p&gt;

&lt;p&gt;Create a ProductBacklog Controller with an HttpPost Attribute with 2 Parameters.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nk-YaLXq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/us816ib23htjxchukrkb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nk-YaLXq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/us816ib23htjxchukrkb.png" alt="Image description" width="800" height="341"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 9:&lt;/p&gt;

&lt;p&gt;Now update the program.cs to wire everything up and dependencies are injected.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2MR88WHc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7e13tv2ijx6i6cwji1xk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2MR88WHc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7e13tv2ijx6i6cwji1xk.png" alt="Image description" width="800" height="173"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 10: Now run the app using dotnet run command.&lt;/p&gt;

&lt;p&gt;Step 11:&lt;/p&gt;

&lt;p&gt;Now we can use any http clients to send a request to &lt;a href="http://localhost:5276/api/ProductBackLog?title=Test"&gt;http://localhost:5276/api/ProductBackLog?title=Test&lt;/a&gt; PBI&amp;amp;description=Test&lt;/p&gt;

&lt;p&gt;Hope this helps.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
