Importance of Web API documentation

Web API documentation is really very helpful when two different team (Back end and Front end) are working on project and not sitting together so in that scenario you will send your API information through mail or call. What kind of parameter request contain. If you are making any changes in your web API every time you have to inform through mail or call.

So solution of above problem is generate web API documentation web page.

When you create a web API, it is often useful to create web API document web page, so that other developers will know how to call your API. You could create all the documentation manually, but it is better to autogenerate as much as possible.

So let us start with demo.
Step 1: In this step we will create empty web API project. So open Visual Studio press CTRL + SHIFT + N as in the following image,


Step 2:
Go to model folder add a class name as Student and it looks like this,
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. namespace WebApi.Models
  6. {
  7. public class Student
  8. {
  9. public int Id
  10. {
  11. get;
  12. set;
  13. }
  14. [Required]
  15. public string name
  16. {
  17. get;
  18. set;
  19. }
  20. public string city
  21. {
  22. get;
  23. set;
  24. }
  25. }
  26. }
Build the project.
Add the Entity Framework into project form Nuget Package Manger and open Package Manager Console (ALT+SHIFT +N + Enter). Then type
install-package EntityFramework
and press Enter key.
Step 3: Go to controller folder right click on it as in the following image,
Select the Student model class from dropdownlist and add a new Data Context and then click on add. This will generate the following code snippet,
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using System.Data.Entity;
  5. using System.Data.Entity.Infrastructure;
  6. using System.Linq;
  7. using System.Net;
  8. using System.Net.Http;
  9. using System.Web.Http;
  10. using System.Web.Http.Description;
  11. using WebApi.Models;
  12. namespace WebApi.Controllers
  13. {
  14. public class DemoController: ApiController
  15. {
  16. private WebApiContext db = new WebApiContext();
  17. // GET api/Demo
  18. public IQueryable < Student > GetStudents()
  19. {
  20. return db.Students;
  21. }
  22. // GET api/Demo/5
  23. [ResponseType(typeof(Student))]
  24. public IHttpActionResult GetStudent(int id)
  25. {
  26. Student student = db.Students.Find(id);
  27. if (student == null) {
  28. return NotFound();
  29. }
  30. return Ok(student);
  31. }
  32. // PUT api/Demo/5
  33. public IHttpActionResult PutStudent(int id, Student student)
  34. {
  35. if (!ModelState.IsValid)
  36. {
  37. return BadRequest(ModelState);
  38. }
  39. if (id != student.Id)
  40. {
  41. return BadRequest();
  42. }
  43. db.Entry(student).State = EntityState.Modified;
  44. try {
  45. db.SaveChanges();
  46. } catch (DbUpdateConcurrencyException)
  47. {
  48. if (!StudentExists(id))
  49. {
  50. return NotFound();
  51. } else
  52. {
  53. throw;
  54. }
  55. }
  56. return StatusCode(HttpStatusCode.NoContent);
  57. }
  58. // POST api/Demo
  59. [ResponseType(typeof(Student))]
  60. public IHttpActionResult PostStudent(Student student)
  61. {
  62. if (!ModelState.IsValid)
  63. {
  64. return BadRequest(ModelState);
  65. }
  66. db.Students.Add(student);
  67. db.SaveChanges();
  68. return CreatedAtRoute("DefaultApi", new
  69. {
  70. id = student.Id
  71. }, student);
  72. }
  73. // DELETE api/Demo/5
  74. [ResponseType(typeof(Student))]
  75. public IHttpActionResult DeleteStudent(int id)
  76. {
  77. Student student = db.Students.Find(id);
  78. if (student == null)
  79. {
  80. return NotFound();
  81. }
  82. db.Students.Remove(student);
  83. db.SaveChanges();
  84. return Ok(student);
  85. }
  86. protected override void Dispose(bool disposing)
  87. {
  88. if (disposing)
  89. {
  90. db.Dispose();
  91. }
  92. base.Dispose(disposing);
  93. }
  94. private bool StudentExists(int id)
  95. {
  96. return db.Students.Count(e => e.Id == id) > 0;
  97. }
  98. }
  99. }
CRUD operation created by scaffold.
Step 4: In this step we will create web API document page.
Open Package Manager Console (CTRL +SHIFT + N +Enter) and type the following command in console,
install-package Microsoft.AspNet.WebApi.HelpPage
Above command installs the necessary assemblies and adds the MVC views for the help pages (located in the Areas/HelpPage folder). Now open the Global.asax file and register. Add the following code to the Application_Start method if it not there already,
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.Http;
  6. using System.Web.Mvc;
  7. using System.Web.Routing;
  8. namespace WebApi
  9. {
  10. public class WebApiApplication: System.Web.HttpApplication
  11. {
  12. protected void Application_Start()
  13. {
  14. // Add this code, if not present.
  15. AreaRegistration.RegisterAllAreas();
  16. GlobalConfiguration.Configure(WebApiConfig.Register);
  17. }
  18. }
  19. }
  20. now open the file Areas / HelpPage / App_Start / HelpPageConfig.cs and go to Register method uncomment the following line:
  21. //Uncomment the following to use the documentation from XML documentation file.
  22. config.SetDocumentationProvider(new XmlDocumentationProvider(HttpContext.Current.Server.MapPath("~/App_Data/XmlDocument.xml")));
Now enable XML documentation. In Solution Explorer, right-click the project and select Properties. Select the Build page.

Now open the DemoController and add some documentation comments (that describe your method) to the controller methods like the following,
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using System.Data.Entity;
  5. using System.Data.Entity.Infrastructure;
  6. using System.Linq;
  7. using System.Net;
  8. using System.Net.Http;
  9. using System.Web.Http;
  10. using System.Web.Http.Description;
  11. using WebApi.Models;
  12. namespace WebApi.Controllers
  13. {
  14. public class DemoController: ApiController
  15. {
  16. private WebApiContext db = new WebApiContext();
  17. /// <summary>
  18. /// Get all Student
  19. /// </summary>
  20. /// <returns>List of Student</returns>
  21. public IQueryable < Student > GetStudents()
  22. {
  23. return db.Students;
  24. }
  25. /// <summary>
  26. /// Get student By ID
  27. /// </summary>
  28. /// <param name="id"> id</param>
  29. /// <returns>student object by id </returns>
  30. [ResponseType(typeof(Student))]
  31. public IHttpActionResult GetStudent(int id)
  32. {
  33. Student student = db.Students.Find(id);
  34. if (student == null)
  35. {
  36. return NotFound();
  37. }
  38. return Ok(student);
  39. }
  40. /// <summary>
  41. /// update the student
  42. /// </summary>
  43. /// <param name="id">id</param>
  44. /// <param name="student"></param>
  45. /// <returns>204</returns>
  46. public IHttpActionResult PutStudent(int id, Student student)
  47. {
  48. if (!ModelState.IsValid)
  49. {
  50. return BadRequest(ModelState);
  51. }
  52. if (id != student.Id)
  53. {
  54. return BadRequest();
  55. }
  56. db.Entry(student).State = EntityState.Modified;
  57. try {
  58. db.SaveChanges();
  59. } catch (DbUpdateConcurrencyException)
  60. {
  61. if (!StudentExists(id))
  62. {
  63. return NotFound();
  64. } else
  65. {
  66. throw;
  67. }
  68. }
  69. return StatusCode(HttpStatusCode.NoContent);
  70. }
  71. /// <summary>
  72. /// add student
  73. /// </summary>
  74. /// <param name="student">tsudent object</param>
  75. /// <returns>student object</returns>
  76. [ResponseType(typeof(Student))]
  77. public IHttpActionResult PostStudent(Student student)
  78. {
  79. if (!ModelState.IsValid)
  80. {
  81. return BadRequest(ModelState);
  82. }
  83. db.Students.Add(student);
  84. db.SaveChanges();
  85. return CreatedAtRoute("DefaultApi", new
  86. {
  87. id = student.Id
  88. }, student);
  89. }
  90. /// <summary>
  91. /// delete student
  92. /// </summary>
  93. /// <param name="id">id</param>
  94. /// <returns></returns>
  95. [ResponseType(typeof(Student))]
  96. public IHttpActionResult DeleteStudent(int id)
  97. {
  98. Student student = db.Students.Find(id);
  99. if (student == null)
  100. {
  101. return NotFound();
  102. }
  103. db.Students.Remove(student);
  104. db.SaveChanges();
  105. return Ok(student);
  106. }
  107. protected override void Dispose(bool disposing)
  108. {
  109. if (disposing)
  110. {
  111. db.Dispose();
  112. }
  113. base.Dispose(disposing);
  114. }
  115. private bool StudentExists(int id)
  116. {
  117. return db.Students.Count(e => e.Id == id) > 0;
  118. }
  119. }
  120. }
Step 5: Run the application, press F5 and type the url http://localhost:portno/help i.e. http://localhost:25316/help,
Click on post link you will see what parameters you have to pass. Here's the pic,
In same way you can see for all method.
Step 6: Suppose you want to hide all controller methods or particular method from document page then use the following code.
For hiding all controller method decorate the controller,
  1. [ApiExplorerSettings(IgnoreApi = true)]
  2. public class DemoController: ApiController {}
For particular method use the following code,
  1. public class DemoController: ApiController
  2. {
  3. private WebApiContext db = new WebApiContext();
  4. /// <summary>
  5. /// Get all Student
  6. /// </summary>
  7. /// <returns>List of Student</returns>
  8. ///
  9. [ApiExplorerSettings(IgnoreApi = true)]
  10. public IQueryable < Student > GetStudents()
  11. {
  12. return db.Students;
  13. }
  14. }