c#业务逻辑的常用接口调用

一、前言

        此部分为业务代码中总结出的核心逻辑结构,包括三种常用接口的调用,以及其中的一些细节,内容还有待完善。

二、详细内容

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确认服务器正常再进行测试。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
负责业务逻辑的类都必须实现这个接口业务逻辑类BusinessImpl实现接口Business,BusinessImpl.java的示例代码如下: //******* Business.java************** public class BusinessImpl implement Business { private SaveData db; public void DiSaveDate (SaveData db) { this.db = db; } … //根据注入的存储类,存储数据 public void saveData() { … db.saveData(); … } } 编写测试类TestBusiness,TestBusiness.java的示例代码如下: //******* TestBusiness.java************** public class TestBusiness { private Business business = new BusinessImpl(); … //根据注入的存储类,存储数据 public void opraData() { … business. DiSaveDate (new XMLData()); business. saveData (); … } } 如果要完成依赖关系注入的对象,必须实现Business接口。 构造注入 构造注入是指在接受注入的类定义一个构造方法,并在参数定义需要注入的类。 (1)为了让类Business接受XMLData的注入,需要为它定义一个构造方法,来接受XMLData的注入。Business.java的示例代码如下: //******* Business.java************** public class Business { private SaveData db; public Business (SaveData db) { this.db = db; } … //根据注入的存储类,存储数据 public void saveData() { … db.saveData(); … } } (2)编写测试类TestBusiness,TestBusiness.java的示例代码如下: //******* TestBusiness.java************** public class TestBusiness { private Business business = new Business(new XMLData()); … //根据注入的存储类,存储数据 public void opraData() { … business. saveData (); … } } 即通过构造函数来完成依赖注入。 从前面对这三种依赖注入的方式可以看出:其实所有的依赖注入都离不开抽象的支持,也就是说只有"面向接口编程",才能够实现依赖注入。 读者可能还会有疑惑:虽然具体的存储方式和业务逻辑无关了,可不是还要在调用业务逻辑的类里来改变具体的存储方式吗?这样一来,不是还要改代码吗?看起来面向接口编程也挺简单的,那Spring又为开发人员提供了哪些帮助呢?其实,Spring为开发人员提供了调用业务逻辑类的具体方式,也就是说,Spring不再需要开发人员编写调用具体调用业务逻辑的类,而是通过配置文档来实现对业务逻辑调用,如果具体的存储方式发生了变化,开发人员只需要改变相应的配置文档即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值