天天看點

C#Web Api編寫

API 的編寫

其實最近的幾篇文章相當于給自己的一個複盤總結把。我所從事的是工控行業。都是經過實際測試的。希望對大家有所幫助把。

項目背景:

這次項目中有6個AGV小車。AGV底層已經封裝了API。對于AGV的控制或者信号讀取,都是由上位機去通路API(例如添加任務,終止任務等)。但是當AGV有報警信号時(低電量報警,任務異常終止,前方有障礙等)。這個時候需要上位機作為服務端了。AGV作為用戶端講信号推送到上位機的 服務端(API)。一般API接口接收或傳送的是XML或者JSON。本次項目使用的JSON.

這個建立空項目這個點我就不說了。直接上代碼了。

API接口編寫

using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using Newtonsoft.Json;
using OperateSql;
using System.Windows.Forms;
using System.Data;


namespace AgvApiInterface.Controllers
{
    public class AgvController : ApiController
    {
        /// <summary>
        /// 初始化連接配接資料庫内容
        /// </summary>
        public void InialSql()
        {
            try
            {
                string IP = System.Configuration.ConfigurationManager.AppSettings["SqlServerIP"].ToString();//配置檔案中資料庫的IP (伺服器IP位址)
                Sql.ConnStr = @"server = "+IP+"; user = sa; pwd = 198296; database = TransPort"; 
            }
            catch (Exception ex)
            {                            
                return;
            }
        }
        /// <summary>
        /// 日志檔案
        /// </summary>
        AgvLog agvlog = new AgvLog();
        // GET api/<controller>
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }

        // GET api/<controller>/5
        public string Get(int id)
        {
            return "value";
        }

        // POST api/<controller>
        public void Post([FromBody]string value)
        {
        }

        // PUT api/<controller>/5
        public void Put(int id, [FromBody]string value)
        {
        }

        // DELETE api/<controller>/5
        public void Delete(int id)
        {
        }
        /// <summary>
        /// 低電量推送
        /// </summary>
        /// <param name="value">推送的JSON資料</param>
        /// <returns></returns>
        [HttpPost]
        public IHttpActionResult AgvBatteryLow(HttpRequestMessage value)//封裝了Json類
        {
            try
            {
                InialSql();
                var Msg = value.Content.ReadAsStringAsync().Result;//JSON資料
                string AgvID = string.Empty;
                string Battary = string.Empty;
                if (Msg == null)//判斷是否資訊為空
                {
                    return Json<dynamic>(new { resCode = 1, resMsg = "接收内容為空,接收失敗" }); 
                }
                else
                {                
                    string PushTime = DateTime.Now.ToString("yyyy:MM:dd HH:mm:ss");
                    JObject newObj1 = (JObject)JsonConvert.DeserializeObject(Msg);
                    if (newObj1.ToString().Contains("AgvId"))
                    {
                        AgvID = newObj1["AgvId"].Value<string>();
                    }
                    if (newObj1.ToString().Contains("AgvBattery"))
                    {
                        Battary = newObj1["AgvBattery"].Value<string>();
                    }
                    string FindSql = $"select *from AgvBattaryMsg where 小車編号='{AgvID}'";
                    DataTable dt = Sql.getDataTable(FindSql);
                    int Num = dt.Rows.Count;
                    if (Num == 1)
                    {
                        string DelSql = $"delete from AgvBattaryMsg where 小車編号='{AgvID}'";
                        if (Sql.GetSqlCom(DelSql))
                        {
                            string InsertMsgSql = $"insert into AgvBattaryMsg(小車編号,電池狀态,推送時間) values('{AgvID}','{Battary}','{PushTime}')";
                            if (Sql.GetSqlCom(InsertMsgSql))//将資料推送至資料庫
                            {
                                agvlog.Logger.WriteInfo("存入低電量資料入資料庫成功");
                            }
                            else
                            {
                                agvlog.Logger.WriteInfo("存入低電量資料入資料庫失敗");
                            }
                        }
                    }
                    else if (Num == 0)
                    {
                        string InsertMsgSql = $"insert into AgvBattaryMsg(小車編号,電池狀态,推送時間) values('{AgvID}','{Battary}','{PushTime}')";
                        if (Sql.GetSqlCom(InsertMsgSql))//将資料推送至資料庫
                        {
                            agvlog.Logger.WriteInfo("存入低電量資料入資料庫成功");
                        }
                        else
                        {
                            agvlog.Logger.WriteInfo("存入低電量資料入資料庫失敗");
                        }
                    }
                    return Json<dynamic>(new { resCode = 0, resMsg = "接收内容正常,接收成功" }); ;
                }
            }
            catch (Exception ex)
            {
                agvlog.Logger.WriteException("存入低電量資料入資料庫失敗,接口異常",ex);
                return Json<dynamic>(new { resCode = 2, resMsg = "本地接口異常"+ex.Message }); ;
            }
        }
        /// <summary>
        /// AGV異常資訊推送
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        [HttpPost]
        public IHttpActionResult AgvMessage(HttpRequestMessage value)//封裝了Json類
        {
            try
            {
                InialSql();
                var Msg = value.Content.ReadAsStringAsync().Result;//JSON資料
                string AgvId = string.Empty;
                string OrderId = string.Empty;
                string OrderStatus = string.Empty;
                string OrderMsg = string.Empty;
                string OrderTime = string.Empty;
                if (Msg == null)//判斷是否資訊為空
                {
                    agvlog.Logger.WriteInfo("收到異常推送資訊,但資訊内容為空");
                    return Json<dynamic>(new { resCode = 1, resMsg = "接收内容為空,推送失敗" }); 
                }
                else
                {
                    string PushTime = DateTime.Now.ToString("yyyy:MM:dd HH:mm:ss");
                    JObject newObj1 = (JObject)JsonConvert.DeserializeObject(Msg);
                    if (newObj1.ToString().Contains("AgvId"))
                    {
                        AgvId = newObj1["AgvId"].Value<string>();
                    }
                    if (newObj1.ToString().Contains("OrderId"))
                    {
                        OrderId = newObj1["OrderId"].Value<string>();
                    }
                    if (newObj1.ToString().Contains("OrderStatus"))
                    {
                        OrderStatus = newObj1["OrderStatus"].Value<string>();
                    }
                    if (newObj1.ToString().Contains("OrderMsg"))
                    {
                        OrderMsg = newObj1["OrderMsg"].Value<string>();
                    }
                    if (newObj1.ToString().Contains("OrderTime"))
                    {
                        OrderTime = newObj1["OrderTime"].Value<string>();
                    }
                    string InsertMsgSql = $"insert into AgvTaskErrorMsg(小車編号,訂單編号,任務狀态,異常資訊,完成時間) values('{AgvId}','{OrderId}','{OrderStatus}','{OrderMsg}','{OrderTime}')";
                    if (Sql.GetSqlCom(InsertMsgSql))//将資料推送至資料庫
                    {
                        agvlog.Logger.WriteInfo("接收異常内容成功");
                        return Json<dynamic>(new { resCode = 0, resMsg = "接收内容正常,推送成功" });
                    }
                    else
                    {
                        agvlog.Logger.WriteInfo("接收異常内容儲存資料庫失敗");
                        return Json<dynamic>(new { resCode = 0, resMsg = "接收内容正常,推送成功,但存入資料庫失敗" });
                    }                
                }
            }
            catch(Exception ex)
            {
                agvlog.Logger.WriteException("接收異常内容儲存資料庫失敗",ex);
                return Json<dynamic>(new { resCode = 1, resMsg = "接口解析錯誤,推送失敗" });
            }            
        }

        /// <summary>
        /// AGV掃碼推送
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        [HttpPost]
        public IHttpActionResult AgvScanCode(HttpRequestMessage value)//封裝了Json類
        {
            try
            {
                InialSql();
                var Msg = value.Content.ReadAsStringAsync().Result;//JSON資料
                string AgvID = string.Empty;
                string OrderId = string.Empty;
                string OrderCode = string.Empty;
                if (Msg == null)//判斷是否資訊為空
                {
                    agvlog.Logger.WriteInfo("接收到掃碼内容,但掃碼内容為空");
                    return Json<dynamic>(new { resCode = 1, resMsg = "接收内容為空,接收失敗" }); ;
                }
                else
                {
                    string PushTime = DateTime.Now.ToString("yyyy:MM:dd HH:mm:ss");
                    JObject newObj1 = (JObject)JsonConvert.DeserializeObject(Msg);
                    if (newObj1.ToString().Contains("AgvId"))
                    {
                        AgvID = newObj1["AgvId"].Value<string>();
                    }
                    if (newObj1.ToString().Contains("OrderId"))
                    {
                        OrderId = newObj1["OrderId"].Value<string>();
                    }
                    if (newObj1.ToString().Contains("OrderCode"))
                    {
                        OrderCode = newObj1["OrderCode"].Value<string>();
                    }
                    string FindSql = $"select *from AgvCodeMsg where 小車編号='{AgvID}'";
                    DataTable dt = Sql.getDataTable(FindSql);
                    int Num = dt.Rows.Count;
                    if (Num == 1)
                    {
                        string DelSql = $"delete from AgvCodeMsg where 小車編号='{AgvID}'";
                        if (Sql.GetSqlCom(DelSql))
                        {
                            string InsertMsgSql = $"insert into AgvCodeMsg(小車編号,訂單編号,物料資訊,推送時間) values('{AgvID}','{OrderId}','{OrderCode}','{PushTime}')";
                            if(Sql.GetSqlCom(InsertMsgSql))//将資料推送至資料庫
                            {
                                agvlog.Logger.WriteInfo("掃碼資訊儲存資料庫成功");
                            }
                        }
                    }
                    else if (Num == 0)
                    {
                        string InsertMsgSql = $"insert into AgvCodeMsg(小車編号,訂單編号,物料資訊,推送時間) values('{AgvID}','{OrderId}','{OrderCode}','{PushTime}')";
                        if (Sql.GetSqlCom(InsertMsgSql))//将資料推送至資料庫
                        {
                            agvlog.Logger.WriteInfo("掃碼資訊儲存資料庫成功");
                        }
                    }
                    return Json<dynamic>(new { resCode = 0, resMsg = "接收内容正常,接收成功" }); ;
                }
            }
            catch (Exception ex)
            {
                agvlog.Logger.WriteException("掃碼資訊儲存資料庫失敗",ex);
                return Json<dynamic>(new { resCode = 2, resMsg = "本地接口異常"+ex.Message }); ;
            }
        }

        /// <summary>
        /// AGV點位推送
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        [HttpPost]
        public IHttpActionResult AgvPointMsg(HttpRequestMessage value)//封裝了Json類
        {
            try
            {
                InialSql();
                var Msg = value.Content.ReadAsStringAsync().Result;//JSON資料
                string AgvID = string.Empty;
                string OrderId = string.Empty;
                string PosX = string.Empty;
                string PosY = string.Empty;
                string Pos = string.Empty;
                string Angle = string.Empty;
                if (Msg == null)//判斷是否資訊為空
                {
                    agvlog.Logger.WriteInfo("接收到點位推送,但掃碼内容為空");
                    return Json<dynamic>(new { resCode = 1, resMsg = "接收内容為空,接收失敗" }); ;
                }
                else
                {
                    string PushTime = DateTime.Now.ToString("yyyy:MM:dd HH:mm:ss");
                    JObject newObj1 = (JObject)JsonConvert.DeserializeObject(Msg);
                    if (newObj1.ToString().Contains("AgvId"))
                    {
                        AgvID = newObj1["AgvId"].Value<string>();
                    }
                    if (newObj1.ToString().Contains("OrderId"))
                    {
                        OrderId = newObj1["OrderId"].Value<string>();
                    }
                    if (newObj1.ToString().Contains("PosX"))
                    {
                        PosX = newObj1["PosX"].Value<string>();
                    }
                    if (newObj1.ToString().Contains("PosY"))
                    {
                        PosY = newObj1["PosY"].Value<string>();
                    }
                    if (newObj1.ToString().Contains("Pos"))
                    {
                        Pos = newObj1["Pos"].Value<string>();
                    }
                    if (newObj1.ToString().Contains("Angle"))
                    {
                        Angle = newObj1["Angle"].Value<string>();
                    }
                    string FindSql = $"select *from AgvPointMsg where 小車編号='{AgvID}'";
                    DataTable dt = Sql.getDataTable(FindSql);
                    int Num = dt.Rows.Count;
                    if (Num == 1)
                    {
                        string DelSql = $"delete from AgvPointMsg where 小車編号='{AgvID}'";
                        if (Sql.GetSqlCom(DelSql))
                        {
                            string InsertMsgSql = $"insert into AgvPointMsg(小車編号,訂單編号,X坐标,Y坐标,庫位名稱,角度,推送時間) values('{AgvID}','{OrderId}','{PosX}','{PosY}','{Pos}','{Angle}','{PushTime}')";
                            if (Sql.GetSqlCom(InsertMsgSql))//将資料推送至資料庫
                            {
                                agvlog.Logger.WriteInfo("點位推送成功");
                            }
                        }
                    }
                    else if (Num == 0)
                    {
                        string InsertMsgSql = $"insert into AgvPointMsg(小車編号,訂單編号,X坐标,Y坐标,庫位名稱,角度,推送時間) values('{AgvID}','{OrderId}','{PosX}','{PosY}','{Pos}','{Angle}','{PushTime}')";
                        if (Sql.GetSqlCom(InsertMsgSql))//将資料推送至資料庫
                        {
                            agvlog.Logger.WriteInfo("點位推送成功");
                        }
                    }
                    return Json<dynamic>(new { resCode = 0, resMsg = "接收内容正常,接收成功" }); ;
                }
            }
            catch (Exception ex)
            {
                agvlog.Logger.WriteException("點位推送失敗",ex);
                return Json<dynamic>(new { resCode = 2, resMsg = "本地接口異常" +ex.Message}); 
            }
        }
        /// <summary>
        /// 低電量推送
        /// </summary>
        /// <param name="value">推送的JSON資料</param>
        /// <returns></returns>
        [HttpPost]
        public IHttpActionResult Test(HttpRequestMessage value)//封裝了Json類
        {
            try
            {
                InialSql();
                var Msg = value.Content.ReadAsStringAsync().Result;//JSON資料
                Dictionary<string,string> T = new Dictionary<string,string>();
                //JsonModel.Item t= JsonConvert.DeserializeObject<JsonModel.Item>(Msg);
                JsonModel.GetOrder JsonMode = new JsonModel.GetOrder();
                JsonMode= JsonConvert.DeserializeObject<JsonModel.GetOrder>(Msg);
                string c = JsonMode.resData;
                JsonModel.Item T1 = new JsonModel.Item();
                T1 = JsonConvert.DeserializeObject<JsonModel.Item>(c);
                int aa = T1.ResultTaskDataList.Count;
                string id = T1.ResultTaskDataList[0].OrderID;
                //int a = JsonMode.resData.Count;
                //string aa = JsonMode.resData[0].ResultTaskDataList[0].OrderID;
                JObject newObj = (JObject)JsonConvert.DeserializeObject(Msg);
                //JArray Data= (JArray)JsonConvert.DeserializeObject(Msg);
                string str = newObj["resData"]["ResultTaskDataList"].ToString();
                if (newObj != null && newObj.Count > 0)
                {
                   
                }
                if (Msg == null)//判斷是否資訊為空
                {
                    agvlog.Logger.WriteInfo("接收到低電量,但内容為空");
                    return Json<dynamic>(new { resCode = 1, resMsg = "接收内容為空,接收失敗" });
                }
                else
                {
                    string PushTime = DateTime.Now.ToString("yyyy:MM:dd HH:mm:ss");
                    JObject newObj1 = (JObject)JsonConvert.DeserializeObject(Msg);
                    string ID = newObj1["resData"]["ResultTaskDataList"][1]["OrderID"].Value<string>();
                    string Status = newObj1["resData"]["ResultTaskDataList"][1]["Status"].Value<string>();
                    string CalledTime = newObj1["resData"]["ResultTaskDataList"][0]["CalledTime"].Value<string>();
                    string StartTime = newObj1["resData"]["ResultTaskDataList"][0]["StartTime"].Value<string>();
                    string EndTime = newObj1["resData"]["ResultTaskDataList"][0]["EndTime"].Value<string>();
                    string OtherOrderData = newObj1["resData"]["ResultTaskDataList"][0]["OtherOrderData"].Value<string>();
                    agvlog.Logger.WriteInfo("接收低電量");
                    return Json<dynamic>(new { resCode = 0, resMsg = "接收成功" });
                }
            }
            catch (Exception ex)
            {
                agvlog.Logger.WriteException("接收低電量推送失敗",ex);
                return Json<dynamic>(new { resCode = 2, resMsg = "本地接口異常" + ex.Message }); ;
            }
        }

    }
}
           

我這個是直接連上我的伺服器的。不需要用到資料庫的大家将資料庫部分删除即可。當然大家可能沒有我這樣的測試環境,推薦大家使用POSTMAN進行測試吧,這個軟體還是特别好用的。

編寫接口後直接進行釋出部署即可了。

C#Web Api編寫

這裡POSTMAN 模拟的用戶端來通路部署的API。

這裡的資料傳輸是沒有走實體的,下一章我會講怎麼調用API。下一張的資料我是将JSON資料映射到實體類的。映射到實體才是最好的解析方式。像上文的解析方式過于呆闆。

繼續閱讀