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数据映射到实体类的。映射到实体才是最好的解析方式。像上文的解析方式过于呆板。