通过HttpClient 调用ASP.NET Web API示例

发布时间 - 2026-01-11 00:02:35    点击率:

在前面两篇文章中我们介绍了ASP.NET Web API的基本知识和原理,并且通过简单的实例了解了它的基本(CRUD)操作。我们是通过JQuery和Ajax对Web API进行数据操作。这一篇我们来介绍一下使用HttpClient的方式来对Web API进行数据操作。

这里我们还是继续使用对Product的操作实例来演示一下它的基本应用。

 创建ASP.NET Web API应用程序

在VS中选择创建一个ASP.NET Web Application应用程序,在向导的下一个窗口中选择Web API模板。

 创建Model

这里我们在Models文件夹下创建一个简单的Product model类,用来传递数据。

在Models文件夹上点击右键,选择Add -> Class

  public class Product
  {
    public int ProductID { get; set; }
    public string ProductName { get; set; }
    public decimal Price { get; set; }
    public int Count { get; set; }
    public string Description { get; set; }
  }

创建Cotroller

接着在Controllers文件夹下创建一个API Controller, 命名为"ProductsController"。

在Controllers文件夹上点击右键,选择Add -> Controller ,在弹出向导中选择Web API 2 Controller - Empty

在向导下一步中输入API Controller name为"ProductsController"。

因为我们需要通过HttpClient的方式来调用Web API,所以这里我们还需要创建一个MVC Controller。

同样在Controllers文件夹上点击右键,选择Add -> Controller ,在弹出向导中选择MVC 5 Controller - Empty

在向导下一步中输入MVC 5 Controller name为"ProductController"。

创建Web API方法(CRUD)

这里我们依然使用模拟的数据创建简单的CRUD Web API方法。前面的章节有详细讲解到,这里就不细说了。直接上代码。

  public class ProductsController : ApiController
  {
    // Mock product list
    public static List<Product> productList = initProductMockDataList();

    private static List<Product> initProductMockDataList()
    {
      return new List<Product>()
      {
        new Product {ProductID=1,ProductName="Product A",Price=1000000,Count=5,Description="Description A"},
        new Product {ProductID=2,ProductName="Product B",Price=200000,Count=2,Description="Description B"},
        new Product {ProductID=3,ProductName="Product C",Price=500000,Count=8,Description="Description C"},
        new Product {ProductID=4,ProductName="Product D",Price=80000,Count=10,Description="Description D"},
        new Product {ProductID=5,ProductName="Product E",Price=300000,Count=3,Description="Description E"}
      };
    }

    public IEnumerable<Product> Get()
    {
      return productList;
    }

    public Product Get(int id)
    {
      return productList.Where(p => p.ProductID == id).FirstOrDefault();
    }

    public void Post([FromBody]Product product)
    {
      var lastProduct = productList.OrderByDescending(p => p.ProductID).FirstOrDefault();
      int newProductID = lastProduct.ProductID + 1;
      product.ProductID = newProductID;

      productList.Add(product);
    }

    public void Put([FromBody]Product product)
    {
      var currentProduct = productList.Where(p => p.ProductID == product.ProductID).FirstOrDefault();
      if (currentProduct != null)
      {
        foreach (var item in productList)
        {
          if (item.ProductID.Equals(currentProduct.ProductID))
          {
            item.ProductName = product.ProductName;
            item.Price = product.Price;
            item.Count = product.Count;
            item.Description = product.Description;
          }
        }
      }
    }

    public void Delete(int id)
    {
      Product product = productList.Where(p => p.ProductID == id).FirstOrDefault();

      productList.Remove(product);
    }
  }

通过JQuery和Ajax调用MVC Controller,在MVC Controller中通过HttpClient调用Web API

Web API中的(CRUD)方法创建完成,接下来我们就分别来看看对各个方法的数据操作。

1.获取Product列表

打开我们创建好的MVC 5 Controller文件ProductController。使用HttpClient的方式来调用我们Web API中的列表方法。

首先需要引入System.Net.Http

using System.Net.Http;

接下来为我们的Web API地址定义一个公共静态变量。

public static readonly Uri _baseAddress = new Uri("http://localhost:21853/");

    //
    // GET: /Product/
    public ActionResult Index()
    {
      return View();
    }

    public JsonResult GetProductList()
    {
      List<Product> productList = null;
      Uri address = new Uri(_baseAddress, "/api/products");

      using (var httpClient = new HttpClient())
      {
        var response = httpClient.GetAsync(address).Result;

        if (response.IsSuccessStatusCode)
          productList = response.Content.ReadAsAsync<List<Product>>().Result;
      }

      return Json(productList, JsonRequestBehavior.AllowGet);
    }

这里我们需要通过点击按钮,通过Ajax调用来获取Product列表数据,所以这里我们使用JsonResult返回数据。

接下来,我们就来创建View。

文件夹Views->Product下创建一个View,名为"Index"。打开Index View,修改页面代码如下:

@{
  Layout = null;
}

<!DOCTYPE html>

<html>
<head>
  <meta name="viewport" content="width=device-width" />
  <title>Index</title>
  <script src="~/Scripts/jquery-1.10.2.min.js" type="text/javascript"></script>
</head>
<body>
  <div style="background-color: #008000; padding: 10px; margin: 5px; width: 45%;">
    <div style="font-weight: bold; margin-bottom: 5px;">Get Product List</div>
    <div style="padding-bottom:5px;"><input id="btnGetProductList" name="btnGetProductList" type="button" value="Get Product List" /></div>
    <div id="products"></div>
  </div>
  </body>
</html>

接着,我们要做的是,当点击Get Product List按钮是加载Product List,代码实现如下:

    $('#btnGetProductList').click(function () {
      $.ajax({
        url: '/Product/GetProductList',
        type: 'GET',
        dataType: 'json'
      }).success(function (result) {
        DisplayProductList(result);
      }).error(function (data) {
        alert(data);
      });
    });

    // Display product list
    function DisplayProductList(result) {
      var productTable = $("<table cellpadding='3' cellspacing='3'></table>");
      var productTableTitle = $("<tr><th>Product ID</th><th>Product Name</th><th>Price</th><th>Count</th><th>Description</th></tr>");
      productTableTitle.appendTo(productTable);

      for (var i = 0; i < result.length; i++) {
        var productTableContent = $("<tr><td>"
          + result[i].ProductID + "</td><td>"
          + result[i].ProductName + "</td><td>"
          + result[i].Price + "</td><td>"
          + result[i].Count + "</td><td>"
          + result[i].Description + "</td></tr>");

        productTableContent.appendTo(productTable);
      }

      $('#products').html(productTable);
    }

好了,运行代码。

点击Get Product List按钮之前如下:

点击Get Product List按钮之后如下:

Product数据列表加载成功。

 2.获取单条Product数据

这里我们的做法是在搜索框里输入Product ID,然后点击Get Product按钮,查找出这条Product信息。

首先,我们先完成在ProductController中使用HttpClient调用Web API中获取单条Product数据的方法。

    public JsonResult GetSingleProduct(int id)
    {
      Uri address = new Uri(_baseAddress, "/api/products/" + id);
      Product product = null;

      using (var httpClient = new HttpClient())
      {
        var response = httpClient.GetAsync(address).Result;

        if (response.IsSuccessStatusCode)
          product = response.Content.ReadAsAsync<Product>().Result;
      }

      return Json(product, JsonRequestBehavior.AllowGet);
    }

接着,来到Index View页面中添加一个搜索Product ID的textbox以及一个Get Product的按钮。

  <div style="background-color: #9ACD32; padding: 10px; margin: 5px; width: 45%; ">
    <div style="font-weight:bold;margin-bottom:5px;">Get Single Product</div>
    <div>Product ID:&nbsp;<input id="txtSearchProductID" name="txtSearchProductID" type="text" />&nbsp;<input id="btnGetProduct" name="btnGetProduct" type="button" value="Get Prdouct" /></div>
    <div id="product"></div>
  </div>

为按钮Get Product按钮添加Ajax方法

    $('#btnGetProduct').click(function () {
      if ($('#txtSearchProductID').val().trim() != "") {
        $.ajax({
          url: '/Product/GetSingleProduct?id=' + $('#txtSearchProductID').val(),
          type: 'GET',
          dataType: 'json'
        }).success(function (result) {
          if (result != null) {
            $('#product').html("Product ID: " + result.ProductID + "<br/>" + "Product Name: " + result.ProductName + "<br/>" + "Count: " + result.Count + "<br/>" + "Price: " + result.Price + " <br/>" + "Description: " + result.Description);
          } else {
            $('#product').html('');
          }
        }).error(function (data) {
          alert(data);
        });
      }
    });

运行程序,加载Product列表。

点击Get Product按钮前:

这里我们查找Product ID为1的数据

我们看到Product ID为1的数据成功获取。

 3.新增一条Product

这里我们创建4个textbox,用来输入Product Name,Count,Price,Description的信息以及一个Create Product按钮。

首先,我们先完成在ProductController中使用HttpClient调用Web API中新增一条Product数据的方法。

    public JsonResult CreateProduct(Product product)
    {
      bool createSuccess = true;
      Uri address = new Uri(_baseAddress, "/api/products");

      using(var httpClient=new HttpClient())
      {
        var response = httpClient.PostAsJsonAsync(address, product).Result;

        if (!response.IsSuccessStatusCode)
          createSuccess = false;
      }

      return Json(createSuccess, JsonRequestBehavior.AllowGet);
    }

接着,来到Index View页面中添加4个textbox用来输入Product Name,Count,Price,Description的信息以及一个Create Product按钮。

  <div style="background-color: #CA5100; padding: 10px; margin: 5px; width: 45%;">
    <div style="font-weight:bold;margin-bottom:5px;">Create Product</div>
    <div>
      <table>
        <tr><td> Product Name:</td><td><input id="txtCreateProductName" name="txtCreateProductName" type="text" /></td></tr>
        <tr><td>Count:</td><td><input id="txtCreateCount" name="txtCreateCount" type="text" /></td></tr>
        <tr><td> Price:</td><td><input id="txtCreatePrice" name="txtCreatePrice" type="text" /></td></tr>
        <tr><td> Description:</td><td><input id="txtCreateDescription" name="txtCreateDescription" type="text" /></td></tr>
      </table>
    </div>
    <div>
      <div id="createMessage" style="color:blue;"></div>
      <input id="btnCreateProduct" name="btnCreateProduct" type="button" value="Create Product" />
    </div>
  </div>

为按钮Create Produc按钮t添加Ajax方法

    $('#btnCreateProduct').click(function () {
      if ($('#txtCreateProductName').val().trim() != "" && $('#txtCreateCount').val().trim() != "" &&
        $('#txtCreatePrice').val().trim() != "" && $('#txtCreateDescription').val().trim() != "") {
        var product = {
          ProductID: 0, ProductName: $('#txtCreateProductName').val(),
          Count: $('#txtCreateCount').val(), Price: $('#txtCreatePrice').val(),
          Description: $('#txtCreateDescription').val()
        };

        $.ajax({
          url: '/Product/CreateProduct',
          type: 'GET',
          data: product,
          dataType: 'json'
        }).success(function (result) {
          if (result != null && result) {
            $('#createMessage').html('Product create success.');
            $("#btnGetProductList").trigger('click');
          }
        }).error(function (data) {
          alert(data);
        })
      }
    });

运行程序,加载Product列表。

点击Create Product按钮之前:

输入新增数据,点击Create Product按钮之后:

我们看到新增数据成功并显示到了Product列表中。

 4.修改Product信息

这里我们创建5个textbox,用来输入Product ID,Product Name,Count,Price,Description的信息以及一个Update Product按钮。

首先,我们先完成在ProductController中使用HttpClient调用Web API中修改一条Product数据的方法。

    public JsonResult UpdateProduct(Product product)
    {
      bool updateSuccess = true;
      Uri address = new Uri(_baseAddress, "/api/products");

      using (var httpClient = new HttpClient())
      {
        var response = httpClient.PutAsync<Product>(address, product, new JsonMediaTypeFormatter()).Result;

        if (!response.IsSuccessStatusCode)
          updateSuccess = false;
      }

      return Json(updateSuccess, JsonRequestBehavior.AllowGet);
    }

接着,来到Index View页面中添加5个textbox用来输入Product ID,Product Name,Count,Price,Description的信息以及一个Update Product按钮。

  <div style="background-color: #007ACC; padding: 10px; margin: 5px; width: 45%;">
    <div style="font-weight:bold;margin-bottom:5px;">Update Product</div>
    <div>
      <table>
        <tr><td>Product ID:</td><td><input id="txtUpdateProductID" name="txtUpdateProductID" type="text" /></td></tr>
        <tr><td> Product Name:</td><td><input id="txtUpdateProductName" name="txtUpdateProductName" type="text" /></td></tr>
        <tr><td>Count:</td><td><input id="txtUpdateCount" name="txtUpdateCount" type="text" /></td></tr>
        <tr><td> Price:</td><td><input id="txtUpdatePrice" name="txtUpdatePrice" type="text" /></td></tr>
        <tr><td> Description:</td><td><input id="txtUpdateDescription" name="txtUpdateDescription" type="text" /></td></tr>
      </table>
    </div>
    <div>
      <div id="updateMessage" style="color:white;"></div>
      <input id="btnUpdateProduct" name="btnUpdateProduct" type="button" value="Update Product" />
    </div>
  </div>

为按钮Update Product按钮添加Ajax方法

   $('#btnUpdateProduct').click(function () {
      if ($('#txtUpdateProductID').val().trim() != "" && $('#txtUpdateProductName').val().trim() != "" &&
        $('#txtUpdateCount').val().trim() != "" && $('#txtUpdatePrice').val().trim() != null && $('#txtUpdateDescription').val().trim() != "") {
        var product = {
          ProductID: $('#txtUpdateProductID').val(), ProductName: $('#txtUpdateProductName').val(),
          Count: $('#txtUpdateCount').val(), Price: $('#txtUpdatePrice').val(),
          Description: $('#txtUpdateDescription').val()
        };

        $.ajax({
          url: '/Product/UpdateProduct',
          type: 'GET',
          data: product,
          dataType: 'json'
        }).success(function (result) {
          if (result != null && result) {
            $('#updateMessage').html('Product update success.');
            $('#btnGetProductList').trigger('click');
          }
        }).error(function (data) {
          alert(data);
        })
      }
    });

运行代码,加载Product列表。

点击Update Create按钮之前:

这里我们修改第一条数据,输入修改信息,点击Update Product按钮之后:

我们看到Product ID为1的信息成功修改并显示到了Product列表中。

 5.删除Product

这里我们创建1个textbox,用来输入Product ID的信息以及一个Delete Product按钮。

首先,我们先完成在ProductController中使用HttpClient调用Web API中删除一条Product数据的方法。

    public JsonResult DeleteProduct(int id)
    {
      bool deleteSuccess = true;
      Uri address = new Uri(_baseAddress, "/api/products/" + id);

      using (var httpClient = new HttpClient())
      {
        var response = httpClient.DeleteAsync(address).Result;

        if (!response.IsSuccessStatusCode)
          deleteSuccess = false;
      }

      return Json(deleteSuccess, JsonRequestBehavior.AllowGet);
    }

接着,来到Index View页面中添加1个textbox用来输入Product ID的信息以及一个Delete Product按钮。

  <div style="background-color: #B572BA; padding: 10px; margin: 5px; width: 45%; ">
    <div style="font-weight:bold;margin-bottom:5px;">Delete Product</div>
    <div>Product ID:&nbsp;<input id="txtDeleteProductID" name="txtDeleteProductID" type="text" />&nbsp;<input id="btnDeleteProduct" name="btnDeleteProduct" type="button" value="Delete Prdouct" /></div>
    <div id="deleteMessage" style="color:blue;"></div>
  </div>

为按钮Delete Product按钮添加Ajax方法 

   $('#btnDeleteProduct').click(function () {
      if ($('#txtDeleteProductID').val().trim() != "") {
        $.ajax({
          url: '/Product/DeleteProduct?id=' + $('#txtDeleteProductID').val(),
          type: 'GET',
          dataType: 'json'
        }).success(function (result) {
          if (result != null && result) {
            $('#deleteMessage').html('Product delete success.');
            $('#btnGetProductList').trigger('click');
          }
        }).error(function (data) {
          alert(data);
        })
      }
    });

运行代码,加载Product列表。

点击Delete Product按钮之前。

这里我们输入Product ID为1的数据,点击Delete Product按钮之后:

我们看到Product ID为1的数据成功删除,并且Product列表中也没有了这条数据。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# httpclient调用webapi  # asp.net  # 调用webapi  # web  # api  # 调用  # 使用HttpClient增删改查ASP.NET Web API服务  # ASP.NET MVC Web API HttpClient简介  # 使用HttpClient消费ASP.NET Web API服务案例  # 创建一个  # 加载  # 右键  # 这条  # 应用程序  # 的是  # 单条  # 这一  # 是在  # 好了  # 在弹出  # 就不  # 列表中  # 要做  # 来看看  # 还需要  # 中也  # 就来  # 在前面  # 介绍一下 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何为API生成Swagger或OpenAPI文档  如何在建站主机中优化服务器配置?  Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】  Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】  JavaScript如何操作视频_媒体API怎么控制播放  Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  如何基于云服务器快速搭建个人网站?  lovemo网页版地址 lovemo官网手机登录  如何用JavaScript实现文本编辑器_光标和选区怎么处理  Laravel如何生成和使用数据填充?(Seeder和Factory示例)  html如何与html链接_实现多个HTML页面互相链接【互相】  如何在阿里云域名上完成建站全流程?  如何在阿里云完成域名注册与建站?  Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】  Python文件操作最佳实践_稳定性说明【指导】  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全  ChatGPT 4.0官网入口地址 ChatGPT在线体验官网  JS中页面与页面之间超链接跳转中文乱码问题的解决办法  Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法  如何彻底卸载建站之星软件?  Laravel如何实现API版本控制_Laravel API版本化路由设计策略  Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲  网站制作软件有哪些,制图软件有哪些?  网站制作壁纸教程视频,电脑壁纸网站?  香港服务器网站推广:SEO优化与外贸独立站搭建策略  Laravel如何记录自定义日志?(Log频道配置)  laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法  WordPress 子目录安装中正确处理脚本路径的完整指南  laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法  JavaScript模板引擎Template.js使用详解  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  Laravel Fortify是什么,和Jetstream有什么关系  bootstrap日历插件datetimepicker使用方法  Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】  Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权  青岛网站建设如何选择本地服务器?  如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)  PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)  如何在万网自助建站平台快速创建网站?  Laravel怎么使用artisan命令缓存配置和视图  Laravel的.env文件有什么用_Laravel环境变量配置与管理详解  Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率  jQuery 常见小例汇总  香港服务器租用每月最低只需15元?  简历在线制作网站免费版,如何创建个人简历?