背景:复宏汉霖项目尝试自己写接口.根据人员id获取数据库里的岗位列表.找后端要了复宏汉霖的项目包.安装环境运行起来后开始写接口.

数据库: sqlserver
语言: c#
框架: .net-framework


第一步先添加控制器Controllers

(1):鼠标移到WebApiControllers文件夹下,右键选择添加控制器
image.png
(2):选择 Web API 2 控制器 -空 (每家公司用的可能不一样)
image.png
(3):定义你的控制器名字
image.png
image.png
(4):新建好的控制器默认打开的样子
image.png

第二步添加model实体类

(1):新增model实体类
image.png
(2):定义model名字
image.png

第三步新建services逻辑层

(1):新增services逻辑层
image.png
(2):定义services名字
image.png

第四步 在控制器里面定义好接口地址返回值

TestStaffController.cs代码内容:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using WebApi.Infrastructure.Filters;
using Business.Models;
using Business.Services;

namespace WebApi.Controllers
{
    /// <summary>
    /// 测试获取岗位列表
    /// </summary>
    [Token]
    [RoutePrefix("api/TestStaff")]
    public class TestStaffController : ApiController
    {
        /// <summary>
        /// 根据人员id获取岗位列表
        /// </summary>
        /// <param name="OwnerID"></param>
        /// <returns></returns>
        [HttpGet]
        [Route("GetTestStaffList/{OwnerID}")]
        
        public IList<staffItem> GetTestStaffList(string OwnerID)
        {
            var business = new TestStaff();
            return business.GetTestStaffList(OwnerID);
        }

    }
}

解释:

  • using : 引用 (和前端的import用法一样)
  • namespace : 文件夹所在位置
  • /// : 注释
  • [Token] :授权过滤器,里面是否包含token.验证信息等.授权.
  • [RoutePrefix("api/TestStaff")] : 接口前缀
  • [HttpGet] : 定义请求类型
  • [Route("GetTestStaffList/{OwnerID}")] : 请求地址(接口后缀)
  • IList<staffItem> :返回值类型list类型
  • GetTestStaffList :方法名
  • (string OwnerID) :传参类型及参数名
  • var business = new TestStaff() 把services对象实例化
  • business.GetTestStaffList(OwnerID) 调用services层的方法
第五步 在实体类model里面定义所需字段

TestStaff.cs代码内容:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Business.Models
{
    public class staffItem
    {
        /// <summary>
        /// 构造函数
        /// </summary>
        public staffItem()
        {
            TerritoryID = "";
            TerritoryCode = "";
            TerritoryName = "";
            TerritoryLevel= "";
            OwnerID = "";
            OwnerName = "";
            RepName = "";
        }
        /// <summary>
        /// 岗位id
        /// </summary>
        public string TerritoryID { get; set; }
        /// <summary>
        /// 岗位编码
        /// </summary>
        public string TerritoryCode { get; set; }
        /// <summary>
        /// 岗位名称
        /// </summary>
        public string TerritoryName { get; set; }
        /// <summary>
        /// 岗位等级
        /// </summary>
        public string TerritoryLevel { get; set; }
        /// <summary>
        /// 人员id
        /// </summary>
        public string OwnerID { get; set; }
        /// <summary>
        /// 人员姓名
        /// </summary>
        public string OwnerName { get; set; }
        /// <summary>
        /// 人员岗位名字
        /// </summary>
        public string RepName { get; set; }
    }
}

解释:

  • 构造函数与类名要保持一致
第六步 在逻辑层services里面处理逻辑

TestStaff.cs代码内容:

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Business.Models;
using CommonUtil;
using DatabaseLayer;
using Entity;

namespace Business.Services
{
    /// <summary>
    /// 测试获取岗位列表
    /// </summary>
    public class TestStaff
    {
        /// <summary>
        /// 根据人员id获取岗位列表
        /// </summary>
        /// <param name="OwnerID"></param>
        /// <returns></returns>
        public IList<staffItem> GetTestStaffList(string OwnerID)
        {
            var strsql = $"select * from b_app_territory where OwnerID={OwnerID}";
            DataTable dt = Query.ExecuteSQLQuery(strsql, SystemEnvironment.Instance.DefaultDataSource);
            return dt.AsEnumerable().Select(x => new staffItem
            {
                TerritoryID = x["TerritoryID"].ToString(),
                TerritoryCode = x["TerritoryCode"].ToString(),
                TerritoryName = x["TerritoryName"].ToString(),
                TerritoryLevel = x["TerritoryLevel"].ToString(),
                OwnerID = x["OwnerID"].ToString(),
                OwnerName = x["OwnerName"].ToString(),
                RepName = x["RepName"].ToString(),
            }).ToList();
        }
    }
}

解释:

  • strsql : sql语句
  • Query.ExecuteSQLQuery把sql查出来的结果转换成DataTable对象
  • dt.AsEnumerable().Select( x => ...).ToList() : 转换成和你定义的model里面的返回值一样的参数
第七步 运用postman调用试试
  • 利用数据库,先查出来一条人员的id.然后把id当作参数直接贴到接口后面.
  • 这里遇到了一个小问题.不想去查token.然后在项目里找到了一个超级密码.在文件夹WebApi下面的TokenAttribute文件里面.
  • WebApi\Infrastructure\Filters\TokenAttribute.cs

image.png

image.png

  • 最后在调用的时候把这个超级密码当做token贴上去就好了.

image.png

总结:

因为之前写过一丢丢java.所以现在前端接触.net也不是那么的难受.
但是还是很多地方很懵逼.请教了很多同事.慢慢的写出来了这个接口.
后端对于面向对象需要很清晰的理解.无处不对象.好好加油!


Timor
37 声望20 粉丝