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進行測試吧,這個軟體還是特别好用的。
編寫接口後直接進行釋出部署即可了。
這裡POSTMAN 模拟的用戶端來通路部署的API。
這裡的資料傳輸是沒有走實體的,下一章我會講怎麼調用API。下一張的資料我是将JSON資料映射到實體類的。映射到實體才是最好的解析方式。像上文的解析方式過于呆闆。