作者: xiaobo
查看: 3742|回复: 1

主题标签Tag

打印 上一主题 下一主题

[教程] 【泛型使用教程】用泛型减少重复代码,使代码更合理、...

[复制链接]
跳转到指定楼层
楼主
xiaobo 发表于 2015-7-28 16:38:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
查看: 3742|回复: 1
说明:
用泛型减少重复代码,使代码更合理、更优雅的API接口

主文:
有这样一个场景,需要对接接口,以获取取得数据。
例如获取订单列表
接口请求参数(json格式):
[C#] 纯文本查看 复制代码
{
  //公共头部
  "head":{
    "method":"getOrders",       //接口方法
    "sign":"xxxx"               //签名
  },
  //私有主体
  "body":{
    "userId":"1",               //用户ID
    "numPerPage":10,           //页大小
    "pageIdx":1             //页码
  }
}
接口响应结果(json格式):
[C#] 纯文本查看 复制代码
{
  "head":{
    "code":1,      //状态码
    "errMsg":"成功"  //消息
  },
  "body":{
    "pageCount":value,
    "pageIdx":value,
    "orders":[
      {
        "orderNo":value,
        "orderPrice":value,
        "orderTime":value,
      }
    ]
    "status":value,
    "orderStatus":value
    省略...
  }
}

通过观察请求参数和响应结果,会发现有部分字段是公共的,并且与接口交互的方法,大部分都是相同的,这里也可以提取封装,将不稳定容易出错的代码集中到一个地方;而如果对每个接口方法都进行一遍对接,重复的代码会不少,也很容易出错(对copy代码,吃过相当多的亏),所以对重复代码进行适当的封装,减少不必要的冗余,让代码结构更简单明了。

首先是提取公共的请求实体容器BaseWhere<T>:
[C#] 纯文本查看 复制代码
/// <summary>
/// 公共头部
/// <para>
/// 用于与接口通讯,发送请求数据的容器
/// 数据访问层使用
/// </para>
/// </summary>
/// <typeparam name="T"></typeparam>
public class BaseWhere<T> where T : new()
{
    private headBaseWhere _head = new headBaseWhere();

    /// <summary>
    /// 公共头部
    /// </summary>
    public headBaseWhere head { get; set; }

    private T _body = new T();

    /// <summary>
    /// 私有主体
    /// </summary>
    public T body { get; set; }
}

public class headBaseWhere
{
    /// <summary>
    /// 接口方法
    /// </summary>
    public String method { get; set; }

    /// <summary>
    /// 签名
    /// </summary>
    public String sign { get; set; }
}

接下来是提取公共的响应实体容器BaseResult<T>:
[C#] 纯文本查看 复制代码
/// <summary>
/// 返回报文报文头参数
/// <para>
/// 用于与接口通讯,接收返回数据的容器
/// 数据访问层使用
/// </para>
/// </summary>
/// <typeparam name="T"></typeparam>
public class BaseResult<T> where T : new()
{
    private headBaseResult _head = new headBaseResult();
    /// <summary>
    /// 公共头部
    /// </summary>
    public headBaseResult head { get; set; }

    private T _body = new T();
    /// <summary>
    /// 私有主体
    /// </summary>
    public T body { get; set; }
}

public class headBaseResult
{
        /// <summary>
    /// 状态码
    /// </summary>
    public String code { get; set; }

        /// <summary>
    /// 消息
    /// </summary>
    public String msg { get; set; }
}


然后定义订单列表的请求实体OrdersPara和响应实体OrdersResult:

[C#] 纯文本查看 复制代码
/// <summary>
/// 订单列表(请求实体)
/// </summary>
public class OrdersPara
{
    public string userId { get; set; }

    public int numPerPage { get; set; }

    public int pageIdx { get; set; }
}

/// <summary>
/// 订单列表(响应实体)
/// </summary>
public class OrdersResult
{
    private IList<Order> _orders = new List<Order>();

    public int pageCount { get; set; }
    public int pageIdx { get; set; }
    public IList<Order> orders { get { return _orders; } set { _orders = value; } }
}

public class Order 
{
    private IList<OrderDetail> _detail = new List<OrderDetail>();

    public string orderNo { get; set; }
    public decimal orderPrice { get; set; }
    public string orderTime { get; set; }
    public int status { get; set; }
    public int orderStatus { get; set; }
    public int activityID { get; set; }
    public string mobileNo { get; set; }
}

公共的请求方法WebAPIHelper<T>.POST(obj):
[C#] 纯文本查看 复制代码
public static class WebAPIHelper<T> where T : new()
{
    public static BaseResult<T> Post(Object postData)
    {
        StringBuilder strResult = new StringBuilder();

        //创建HttpWebRequest请求
        HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(Settings.APIURL);
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";
        //根据接口的要求序列化请求参数
        String strParams = JsonConvert.SerializeObject(postData);
        UTF8Encoding encoding = new UTF8Encoding();
        request.ContentLength = encoding.GetByteCount(strParams);
        request.Credentials = CredentialCache.DefaultCredentials;

        try
        {
            //创建字节流
            using (Stream reqStream = request.GetRequestStream())
            {
                reqStream.Write(encoding.GetBytes(strParams), 0, encoding.GetByteCount(strParams));
            }
            //获取回传信息
            using (WebResponse response = request.GetResponse())
            {
                Stream streamResult = response.GetResponseStream();
                using (StreamReader reader = new StreamReader(streamResult))
                {
                    strResult.Append(reader.ReadToEnd());
                }
            }
        }
        catch (Exception ex)
        {
        }

        BaseResult<T> result = new BaseResult<T>();
        try
        {
            result = JsonConvert.DeserializeObject<BaseResult<T>>(strResult.ToString());
        }
        catch (Exception ex)
        {
        }

        if (result == null)
        {
            result = new BaseResult<T>();
        }

        if(result.body == null)
        {
            result.body = new T();
        }

        return result;
    }
}

调用示例:
[C#] 纯文本查看 复制代码
public QueryOrdersResult Get(QueryOrdersPara para)
{
    BaseWhere<OrdersPara> where = new BaseWhere<OrdersPara>();
    where.head.method = "qryOrders";
    where.body.userId = para.userId;
    where.body.pageIdx = para.pageIdx;
    where.body.numPerPage = para.numPerPage;
    
    BaseResult<OrdersResult> result = WebAPIHelper<OrdersResult>.Post(where);
    return result.body;
}


本贴转自博客园:http://www.cnblogs.com/chen-yu/archive/2015/07/27/4680651.html

评分

参与人数 1金钱 +3 收起 理由
乔克斯 + 3 感谢LZ对论坛做出的贡献~

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播
回复 论坛版权

使用道具 举报

沙发
乔克斯 发表于 2015-7-28 17:07:20 | 只看该作者
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入CSkin博客

本版积分规则

QQ|申请友链|小黑屋|手机版|Archiver|CSkin ( 粤ICP备13070794号

Powered by Discuz! X3.2  © 2001-2013 Comsenz Inc.  Designed by ARTERY.cn
GMT+8, 2024-4-24 18:09, Processed in 1.495151 second(s), 32 queries , Gzip On.

快速回复 返回顶部 返回列表