IT俱乐部 ASP.NET 使用HttpClient增删改查ASP.NET Web API服务

使用HttpClient增删改查ASP.NET Web API服务

本篇体验使用HttpClient对ASP.NET Web API服务实现增删改查。

创建ASP.NET Web API项目

新建项目,选择”ASP.NET MVC 4 Web应用程序”。

选择”Web API”。

在Models文件夹下创建Product类。

1
2
3
4
5
6
7
public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Category { get; set; }
    public decimal Price { get; set; }
}

在Models文件夹下创建IProductRepository接口。

1
2
3
4
5
6
7
8
public interface IProductRepository
{
    IEnumerable<product> GetAll();
    Product Get(int id);
    Product Add(Product item);
    void Remove(int id);
    bool Update(Product item);
}</product>

在Models文件夹下创建ProductRepository类,实现IProductRepository接口。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
public class ProductRepository : IProductRepository
 {
     private List<product> products = new List<product>();
     private int _nextId = 1;
     public ProductRepository()
     {
         Add(new Product() {Name = "product1", Category = "sports", Price = 88M});
         Add(new Product() { Name = "product2", Category = "sports", Price = 98M });
         Add(new Product() { Name = "product3", Category = "toys", Price = 58M });
     }
     public IEnumerable<product> GetAll()
     {
         return products;
     }
     public Product Get(int id)
     {
         return products.Find(p => p.Id == id);
     }
     public Product Add(Product item)
     {
         if (item == null)
         {
             throw new ArgumentNullException("item");
         }
         item.Id = _nextId++;
         products.Add(item);
         return item;
     }
     public bool Update(Product item)
     {
         if (item == null)
         {
             throw new ArgumentNullException("item");
         }
         int index = products.FindIndex(p => p.Id == item.Id);
         if (index == -1)
         {
             return false;
         }
         products.RemoveAt(index);
         products.Add(item);
         return true;
     }
     public void Remove(int id)
     {
         products.RemoveAll(p => p.Id == id);
     }
 }</product></product></product>

在Controllers文件夹下创建空的ProductController。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
public class ProductController : ApiController
 {
     static readonly IProductRepository repository = new ProductRepository();
     //获取所有
     public IEnumerable<product> GetAllProducts()
     {
         return repository.GetAll();
     }
     //根据id获取
     public Product GetProduct(int id)
     {
         Product item = repository.Get(id);
         if (item == null)
         {
             throw new HttpResponseException(HttpStatusCode.NotFound);
         }
         return item;
     }
     //根据类别查找所有产品
     public IEnumerable<product> GetProductsByCategory(string category)
     {
         return
             repository.GetAll().Where(p => string.Equals(p.Category, category, StringComparison.OrdinalIgnoreCase));
     }
     //创建产品
     public HttpResponseMessage PostProduct(Product item)
     {
         item = repository.Add(item);
         var response = Request.CreateResponse(HttpStatusCode.Created, item);
         string uri = Url.Link("DefaultApi", new {id = item.Id});
         response.Headers.Location = new Uri(uri);
         return response;
     }
     //更新产品
     public void PutProduct(int id, Product product)
     {
         product.Id = id;
         if (!repository.Update(product))
         {
             throw new HttpResponseException(HttpStatusCode.NotFound);
         }
     }
     //删除产品
     public void DeleteProduct(int id)
     {
         Product item = repository.Get(id);
         if (item == null)
         {
             throw new HttpResponseException(HttpStatusCode.NotFound);
         }
         repository.Remove(id);
     }
 }</product></product>

在浏览器中输入:

http://localhost:1310/api/Product   获取到所有产品
http://localhost:1310/api/Product/1   获取编号为1的产品

使用HttpClient查询某个产品

在同一个解决方案下创建一个控制台程序。

依次点击”工具”,”库程序包管理器”,”程序包管理器控制台”,输入如下:

Install-Package Microsoft.AspNet.WebApi.Client

在控制台程序下添加Product类,与ASP.NET Web API中的对应。

1
2
3
4
5
6
public class Product
{
    public string Name { get; set; }
    public double Price { get; set; }
    public string Category { get; set; }
}

编写如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
static void Main(string[] args)
{
    RunAsync().Wait();
    Console.ReadKey();
}
static async Task RunAsync()
{
    using (var client = new HttpClient())
    {
        //设置
        client.BaseAddress = new Uri("http://localhost:1310/");
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        //异步获取数据
        HttpResponseMessage response = await client.GetAsync("/api/Product/1");
        if (response.IsSuccessStatusCode)
        {
            Product product = await response.Content.ReadAsAsync<product>();
            Console.WriteLine("{0}t{1}元t{2}",product.Name, product.Price, product.Category);
        }
    }
}</product>

把控制台项目设置为启动项目。

HttpResponseMessage的IsSuccessStatusCode只能返回true或false,如果想让响应抛出异常,需要使用EnsureSuccessStatusCode方法。

1
2
3
4
5
6
7
8
9
try
{
    HttpResponseMessage response = await client.GetAsync("/api/Product/1");
    response.EnsureSuccessStatusCode();//此方法确保响应失败抛出异常
}
catch(HttpRequestException ex)
{
    //处理异常
}

另外,ReadAsAsync方法,默认接收MediaTypeFormatter类型的参数,支持 JSON, XML, 和Form-url-encoded格式,如果想自定义MediaTypeFormatter格式,参照如下:

1
2
3
4
5
6
var formatters = new List<mediatypeformatter>() {
    new MyCustomFormatter(),
    new JsonMediaTypeFormatter(),
    new XmlMediaTypeFormatter()
};
resp.Content.ReadAsAsync<ienumerable>>(formatters);</ienumerable></mediatypeformatter>

使用HttpClient查询所有产品

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
static void Main(string[] args)
 {
     RunAsync().Wait();
     Console.ReadKey();
 }
 static async Task RunAsync()
 {
     using (var client = new HttpClient())
     {
         //设置
         client.BaseAddress = new Uri("http://localhost:1310/");
         client.DefaultRequestHeaders.Accept.Clear();
         client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
         //异步获取数据
         HttpResponseMessage response = await client.GetAsync("/api/Product");
         if (response.IsSuccessStatusCode)
         {
             IEnumerable<product> products = await response.Content.ReadAsAsync<ienumerable>>();
             foreach (var item in products)
             {
                 Console.WriteLine("{0}t{1}元t{2}", item.Name, item.Price, item.Category);
             }
              
         }
     }
 }</ienumerable></product>

使用HttpClient添加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
static void Main(string[] args)
 {
     RunAsync().Wait();
     Console.ReadKey();
 }
 static async Task RunAsync()
 {
     using (var client = new HttpClient())
     {
         //设置
         client.BaseAddress = new Uri("http://localhost:1310/");
         client.DefaultRequestHeaders.Accept.Clear();
         client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
         //添加
         var myProduct = new Product() { Name = "myproduct", Price = 88, Category = "other" };
         HttpResponseMessage response = await client.PostAsJsonAsync("api/Product", myProduct);
         //异步获取数据
         response = await client.GetAsync("/api/Product");
         if (response.IsSuccessStatusCode)
         {
             IEnumerable<product> products = await response.Content.ReadAsAsync<ienumerable>>();
             foreach (var item in products)
             {
                 Console.WriteLine("{0}t{1}元t{2}", item.Name, item.Price, item.Category);
             }
              
         }
     }
 }</ienumerable></product>

使用HttpClient修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
static void Main(string[] args)
 {
     RunAsync().Wait();
     Console.ReadKey();
 }
 static async Task RunAsync()
 {
     using (var client = new HttpClient())
     {
         //设置
         client.BaseAddress = new Uri("http://localhost:1310/");
         client.DefaultRequestHeaders.Accept.Clear();
         client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
         //添加 HTTP POST
         var myProduct = new Product() { Name = "myproduct", Price = 100, Category = "other" };
         HttpResponseMessage response = await client.PostAsJsonAsync("api/product", myProduct);
         if (response.IsSuccessStatusCode)
         {
             Uri pUrl = response.Headers.Location;
             //修改 HTTP PUT
             myProduct.Price = 80;   // Update price
             response = await client.PutAsJsonAsync(pUrl, myProduct);
         }
         //异步获取数据
         response = await client.GetAsync("/api/Product");
         if (response.IsSuccessStatusCode)
         {
             IEnumerable<product> products = await response.Content.ReadAsAsync<ienumerable>>();
             foreach (var item in products)
             {
                 Console.WriteLine("{0}t{1}元t{2}", item.Name, item.Price, item.Category);
             }
              
         }
     }
 }</ienumerable></product>

使用HttpClient删除

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
static void Main(string[] args)
{
    RunAsync().Wait();
    Console.ReadKey();
}
static async Task RunAsync()
{
    using (var client = new HttpClient())
    {
        //设置
        client.BaseAddress = new Uri("http://localhost:1310/");
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        //添加 HTTP POST
        var myProduct = new Product() { Name = "myproduct", Price = 100, Category = "other" };
        HttpResponseMessage response = await client.PostAsJsonAsync("api/product", myProduct);
        if (response.IsSuccessStatusCode)
        {
            Uri pUrl = response.Headers.Location;
            //修改 HTTP PUT
            myProduct.Price = 80;   // Update price
            response = await client.PutAsJsonAsync(pUrl, myProduct);
            //删除 HTTP DELETE
            response = await client.DeleteAsync(pUrl);
        }
        //异步获取数据
        response = await client.GetAsync("/api/Product");
        if (response.IsSuccessStatusCode)
        {
            IEnumerable<product> products = await response.Content.ReadAsAsync<ienumerable>>();
            foreach (var item in products)
            {
                Console.WriteLine("{0}t{1}元t{2}", item.Name, item.Price, item.Category);
            }
             
        }
    }
}</ienumerable></product>

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对IT俱乐部的支持。如果你想了解更多相关内容请查看下面相关链接

本文收集自网络,不代表IT俱乐部立场,转载请注明出处。https://www.2it.club/code/asp-net/1255.html
上一篇
下一篇
联系我们

联系我们

在线咨询: QQ交谈

邮箱: 1120393934@qq.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部