一、前言
此部分为业务代码中总结出的核心逻辑结构,包括三种常用接口的调用,以及其中的一些细节,内容还有待完善。
二、详细内容
1、CustomerBLL
该类主要为客户的逻辑结构,会根据不同客户的需求来实现不同的功能;其常用函数包括CheckPackage、GetSortPort、SendSortResult;
CheckPackage主要用于检查包裹的完整性,会依次检查包裹的条码、体积和重量;对于多条码的包裹而言,会将其用“_”连接并赋值给package.ExtraData.FinalBarCode;
GetSortPort的功能是获取分拣格口,但真正获取格口的逻辑将放在WebApi类中,而这里在大多数简单的情况下可直接调用WebApi类中的GetSortPort函数,特殊的像共配,则是通过判断包裹所属客户类型,来决定调用哪个客户的WebApi中的函数;该函数将返回格口数组,出现异常情况可返回默认分拣口,如共配中的PublicSortGdConfig.CommonConfig.PackageConfig.DefaultSortPort;
SendSortResult中的结构和GetSortPort非常类似,也是直接调用WebApi中的SendSortResult即可;
2、WebApi
1)常用接口介绍
这个类是专门定义调用http接口的类,常用的接口调用函数包括GetBarcodeRule、GetSortPort、SendSortResult;
GetBarcodeRule是用于获取条码正则,它将通过http接口请求来获取包含正则的响应报文,然后可从报文中提取正则;正则表达式的使用:
string ruleStr = GetRule();
Regex rule = new Regex(ruleStr);
bool isMatchCode = rule.IsMatch(Barcode);
GetSortPort和SendSortResult则和GetBarcodeRule一样调用http接口请求结果即可;
2)http接口请求详解
(1) 首先是使用通用类中封装好的方法,特点是非常的简便:
private JavaScriptSerializer _jss = new JavaScriptSerializer();
//使用一个字典来存储请求body中的信息
Dictionary<string, object> requestDic = new Dictionary<string, object>
{
{"item1",item1},
{"item2",item2}
};
requestDic.Add("item3",item3);
//http请求接口
string response = Request(requestDic, 10000, URL);
//将返回报文转换为字典
Dictionary<string, object> responseDic = _jss.Deserialize<Dictionary<string, object>>(response);
//从返回报文的字典中获取值
responseDic.TryGetValue("obj", out object objStr);
//返回报文字典中的obj对应的值是一个字典
//在将返回报文转换为字典时,也同时使它转为了字典,所以只需再加一个类型强制转换即可
Dictionary<string, object> objDictionary = (Dictionary<string, object>)objStr;
添加请求头同样采用封装好的方法,只需要重写BeforeRequest函数,那么在http接口执行请求之前都会先调用这个方法;
protected override void BeforeRequest(HttpWebRequest request)
{
request.Headers.Add("Authorization", Authorization);
}
(2)另外是不采用通用类中方法,全部自己手写,主要用于自定义请求头(当同一个包裹的多个接口请求需要不同的请求头时)
HttpWebRequest request = WebRequest.Create(URL) as HttpWebRequest;
request.Method = "POST";
request.Timeout = 10000;
//此处为特定接口所需请求头设置
request.ContentType = "application/x-www-form-urlencoded";
request.Headers["Token"] = "d864144325e60ac8";
using (Stream stream = request.GetRequestStream())
{
//这里采用raw格式,用json也是可以的
string bodyStr = $"uid={UID}&billno={BillNo}";
byte[] data = Encoding.UTF8.GetBytes(bodyStr);
stream.Write(data, 0, data.Length);
}
//获取返回报文
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
{
string result = reader.ReadToEnd();
Dictionary<string, object> responseDic =
_jss.Deserialize<Dictionary<string, object>>(result);
bool isSuccess = responseDic.ContainsKey("bno");
}
三、总结
http接口的调用都大同小异,写起来还是比较简单的,需要注意的是,请求报文的body中内容的请求字段,有时和需求文档所给的有些差异,需要与现场核对;部分接口可采用删除所有body内容的方式,此时返回报文中可能会提示所有需要请求的key值(但这种情况较少);另外需要注意请求报文的格式(常用的有json和raw text);在测试时,可以先使用postman确认服务器正常再进行测试。