1.新建webapi项目
2.配置WebApiConfig
public const string DEFAULT_ROUTE_NAME = "MyDefaultRoute"; public static void Register(HttpConfiguration config) { config.Routes.MapHttpRoute( name: DEFAULT_ROUTE_NAME, routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); // 取消注释下面的代码行可对具有 IQueryable 或 IQueryable<T> 返回类型的操作启用查询支持。 // 若要避免处理意外查询或恶意查询,请使用 QueryableAttribute 上的验证设置来验证传入查询。 // 有关详细信息,请访问 http://go.microsoft.com/fwlink/?LinkId=279712。 //config.EnableQuerySupport(); // 若要在应用程序中禁用跟踪,请注释掉或删除以下代码行 // 有关详细信息,请参阅: http://www.asp.net/web-api config.EnableSystemDiagnosticsTracing(); }
3.在models文件新建person模型
public class Person { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } }
4.在models文件中添加IPersonRepository
interface IPersonRepository { IEnumerable<Person> GetAll(); Person Get(int id); Person Add(Person person); void Remove(int id); bool Update(Person person); }
5.在models文件中添加仓库实现
public class PersonRepository : IPersonRepository { // We are using the list and _fakeDatabaseID to represent what would // most likely be a database of some sort, with an auto-incrementing ID field: private List<Person> _people = new List<Person>(); private int _fakeDatabaseID = 1; public PersonRepository() { // For the moment, we will load some sample data during initialization. this.Add(new Person { LastName = "Lennon", FirstName = "John" }); this.Add(new Person { LastName = "McCartney", FirstName = "Paul" }); this.Add(new Person { LastName = "Harrison", FirstName = "George" }); this.Add(new Person { LastName = "Starr", FirstName = "Ringo" }); } public IEnumerable<Person> GetAll() { return _people; } public Person Get(int id) { return _people.Find(p => p.Id == id); } public Person Add(Person person) { if (person == null) { throw new ArgumentNullException("person"); } person.Id = _fakeDatabaseID++; _people.Add(person); return person; } public void Remove(int id) { _people.RemoveAll(p => p.Id == id); } public bool Update(Person person) { if (person == null) { throw new ArgumentNullException("person"); } int index = _people.FindIndex(p => p.Id == person.Id); if (index == -1) { return false; } _people.RemoveAt(index); _people.Add(person); return true; } }
6.在controllers中添加apiController为PersonController
public class PersonController : ApiController { static readonly IPersonRepository databasePlaceholder = new PersonRepository(); public IEnumerable<Person> GetAllPeople() { return databasePlaceholder.GetAll(); } public Person GetPersonByID(int id) { Person person = databasePlaceholder.Get(id); if (person == null) { throw new HttpResponseException(HttpStatusCode.NotFound); } return person; } public HttpResponseMessage PostPerson(Person person) { person = databasePlaceholder.Add(person); string apiName = WebApi.WebApiConfig.DEFAULT_ROUTE_NAME; var response = this.Request.CreateResponse<Person>(HttpStatusCode.Created, person); string uri = Url.Link(apiName, new { id = person.Id }); response.Headers.Location = new Uri(uri); return response; } public bool PutPerson(Person person) { if (!databasePlaceholder.Update(person)) { throw new HttpResponseException(HttpStatusCode.NotFound); } return true; } public void DeletePerson(int id) { Person person = databasePlaceholder.Get(id); if (person == null) { throw new HttpResponseException(HttpStatusCode.NotFound); } databasePlaceholder.Remove(id); } }
以上就完成了webapi的简单搭建。接下来创建客户端来访问webapi。
7.新建console项目,添加webapi Core Library。
添加引用
using System.Net.Http;
using Newtonsoft.Json.Linq;
private const string url = "http://localhost:43571/"; static void Main(string[] args) { Console.WriteLine("Retreive All The People:"); JArray people = GetAllPerson(); foreach (var person in people) { Console.WriteLine(person); } // WRITE A SPECIFIC PERSON TO CONSOLE (JSON): Console.WriteLine(Environment.NewLine + "Retreive a Person by ID:"); JObject singlePerson = GetPerson(2); Console.WriteLine(singlePerson); // ADD NEW PERSON, THEN WRITE TO CONSOLE (JSON): Console.WriteLine(Environment.NewLine + "Add a new Person and return the new object:"); JObject newPerson = AddPerson("Atten", "John"); Console.WriteLine(newPerson); // UPDATE AN EXISTING PERSON, THEN WRITE TO CONSOLE (JSON): Console.WriteLine(Environment.NewLine + "Update an existing Person and return a boolean:"); // Pretend we already had a person's data: JObject personToUpdate = GetPerson(2); string newLastName = "Richards"; Console.WriteLine("Update Last Name of " + personToUpdate + "to " + newLastName); // Pretend we don't already know the Id: int id = personToUpdate.Value<int>("Id"); string FirstName = personToUpdate.Value<string>("FirstName"); string LastName = personToUpdate.Value<string>("LastName"); if (UpdatePerson(id, newLastName, FirstName)) { Console.WriteLine(Environment.NewLine + "Updated person:"); Console.WriteLine(GetPerson(id)); } // DELETE AN EXISTING PERSON BY ID: Console.WriteLine(Environment.NewLine + "Delete person object:"); DeletePerson(5); // WRITE THE UPDATED LIST TO THE CONSOLE: { // WRITE ALL PEOPLE TO CONSOLE Console.WriteLine("Retreive All The People using classes:"); people = GetAllPerson(); foreach (var person in people) { Console.WriteLine(person); } } Console.Read(); } /// <summary> /// get all Person /// </summary> /// <returns></returns> static JArray GetAllPerson() { HttpClient client = new HttpClient(); HttpResponseMessage response = client.GetAsync(url + "api/person").Result; return response.Content.ReadAsAsync<JArray>().Result; } static JObject GetPerson(int id) { HttpClient client = new HttpClient(); HttpResponseMessage response = client.GetAsync(url + "api/person/" + id).Result; return response.Content.ReadAsAsync<JObject>().Result; } static JObject AddPerson(string newLastName, string newFirstName) { var newPerson = new { LastName = newLastName, FirstName = newFirstName }; HttpClient client = new HttpClient(); client.BaseAddress = new Uri(url); var response = client.PostAsJsonAsync("api/person", newPerson).Result; return response.Content.ReadAsAsync<JObject>().Result; } // Sends HTTP PUT to Person Controller on API with Anonymous Object: static bool UpdatePerson(int personId, string newLastName, string newFirstName) { // Initialize an anonymous object representing a the modified Person record: var newPerson = new { id = personId, LastName = newLastName, FirstName = newFirstName }; HttpClient client = new HttpClient(); client.BaseAddress = new Uri(url); var response = client.PutAsJsonAsync("api/person/", newPerson).Result; return response.Content.ReadAsAsync<bool>().Result; } // Sends HTTP DELETE to Person Controller on API with Id Parameter: static void DeletePerson(int id) { HttpClient client = new HttpClient(); client.BaseAddress = new Uri(url); var relativeUri = "api/person/" + id.ToString(); var response = client.DeleteAsync(relativeUri).Result; client.Dispose(); }
参考地址:http://typecastexception.com/post/2013/07/01/Creating-a-Clean-Minimal-Footprint-ASPNET-WebAPI-Project-with-VS-2012-and-ASPNET-MVC-4.aspx
http://typecastexception.com/post/2013/07/03/Building-Out-a-Clean-REST-ful-WebApi-Service-with-a-Minimal-WebApi-Project.aspx
源码下载:webApiDemo