一、本文档的写作目的

  App需要跟产品、UI、后台、服务器、测试打交道,app的产出是其他端人员产出的综合体现。与其他端人员沟通就像是开发写接口,也就是面向接口编程的思想。

  本文档讲解针对的是服务端返回数据时使用的字段数据类型如何选择、iOS端将JSON数据转模型的时候用什么类型来定义对应的属性。

二、本文档的使用范围

  首先介绍下在本文档中使用的技术领域。

    1、服务端使用的是C#语言

    2、Api接口文档自动生成

    3、采用的是JSON数据传输格式

    4、iOS使用的是Objective-C语言举例

  上面提到的技术范围并不影响到本文档的推广。首先,在项目内部严格执行。后续可以在公司其他项目组中结合实际情况完成落地。  

三、正文

服务器返回的类型 使用领域 iOS端模型中属性类型 NSLog输出格式
integer 表示整型数据 NSInteger %ld
decimal number 数据相关的最好使用浮点型 CGFloat %f、%0.2f
boolean 判断是否的数据 BOOL %ld
string 文本信息 NSString %@
date 时间信息(要求服务器的dateFormat统一) NSDate %@
Enum 枚举 Enum %ld
对象 里面的内容多处使用,封装成对象 Model类 %@
Collection of string 基本数据类型的集合 NSArray<NSString *> %@
Collection of 对象 对象类型的集合 NSArray<类名 *> %@

  简单的表格罗列出来的信息总是意犹未尽,有几个重要的信息说明如下:

(1)使用NSInteger、CGFloat、BOOL,而不要使用int、float、double、bool甚至是NSNumber。

解释:

首先,不使用int而使用NSInteger等是属于语言特性逻辑,NSInterger对int多了处理,比如会结合运行平台使用int_32\int_64。

然后不使用NSNumber的原因是,NSNmuber采用的是类簇装箱拆箱,NSNumber只是中间量,表述不清楚。JSON转字典再转模型,OC语言中字典中的的元素必须是对象类型,因此使用NSNumber放置在字典中,但是在字典转模型的时候不还原它的装箱前的本来面目,对使用该模型的开发人员不友好。

(2)关于date类型的说明。

解释:

date类型通过JSON数据传输时是字符串类型。它的由来是,首先服务器用date类型表示时间类,时间类中包含着很多的信息,需要通过dateFormat时间表述格式转换成字符串类型返回。JSON转换成字典的时候,date在字典中是NSString类型,iOS端需要还原它的本来面目。但是在转换成NSDate的使用需要知道之前date转string的时候使用的dateFormat,因此关于dateFormat需要要求服务端开发人员统一规范(比如我们公司使用的是"YYYY-MM-dd HH:mm:ss")。

在开发过程中容易在date这块出现模糊出现动摇,比如产品上的要求是将两个时间合并在一起显示(2018年10月10日 6:00 - 18:00),这种情境下服务端是将两个date字段返回呢、还是将显示的内容拼接好之后使用string字段返回呢?其实,原则很简单:服务器返回数据到客户端的目的无非就是两个,第一个目的就是为了显示,另一个目的就是为了客户端做逻辑判断。在这里,如果客户端不需要使用“开始时间”或者“结束时间”做业务处理,那么就让服务端做好拼装用string返回,客户端拿到这个数据之间显示。相反,如果客户端需要使用“开始时间”或者“结束时间”做逻辑判断,那么就用两个date字段返回,拼接显示的事情交给客户端处理。

关于时间信息采用什么数据类型,另一种方案就是全部使用时间戳,采用integer类型返回。两种方案都可以,统一好就行。

(3)关于Enum类型的说明。

解释:enum类型本质上就是int类型。为了体现枚举字段的枚举性质,iOS端需要在模型上创建一个同样的枚举类型。这一点无需置疑,但是在实际的项目开发中依然会出现一些摇摆不定的方案。以下举例一起摇摆不定的例子,后面会给出一些建议方案:

比如,订单状态这个字段。

之前接口中使用的是枚举字段,iOS端通过enum定义枚举类型。

后面产品上的设计需要将订单状态对应的文本(比如1-“未支付”、2-“已支付”等)显示在界面中。iOS采用的是本地硬编码的方式,将枚举值与文本对应起来。

但是当产品上的设计需要将“已支付”改成“完成支付”显示的时候,硬编码肯定是不行的。所以接口中增加一个订单状态的string类型用来显示其对应的文本内容。

再后来,服务端同学觉得两个字段可以合并为一个对象模型(keyValueModel类,属性key:int,属性value:string),至于枚举的种类,在字段的说明区域显示。

使用keyValueModel类一段时间后发现,枚举的范围增加后,服务端同学容易忘记在字段的说明区域编辑了,或者是枚举值十多种之后,显示不下(显示不雅观)。

其实这个问题很好解决,还是使用上面提到的原则。使用两个字段,枚举字段用来供客户端的同学做逻辑判断、string字段用来供客户端的同学做界面展示。

四、总结

根据“服务器返回数据到客户端的目的无非就是两个,第一个目的就是为了显示,另一个目的就是为了客户端做逻辑判断”的原则,结合产品的设计需求,作出统一化的处理。

【规范建议】服务端接口返回字段类型与iOS端的解析的更多相关文章

  1. 移动端与PHP服务端接口通信流程设计(增强版)

    前面讲过:移动端与PHP服务端接口通信流程设计(基础版) 对于 api_token 的校验,其安全性还可再增强: 增强地方一: 再增加2张表,一个接口表,一个授权表,设计参考如下: 接口表 字段名 字 ...

  2. 移动端与PHP服务端接口通信流程设计(基础版)

    针对 --->非开放性平台 --->公司内部产品 接口特点汇总: 1.因为是非开放性的,所以所有的接口都是封闭的,只对公司内部的产品有效: 2.因为是非开放性的,所以OAuth那套协议是行 ...

  3. 移动端与PHP服务端接口通信流程设计(基础版)

    转载自:http://blog.snsgou.com/post-766.html --->非开放性平台 --->公司内部产品 接口特点汇总: 1.因为是非开放性的,所以所有的接口都是封闭的 ...

  4. api服务端接口安全

    api服务端接口安全性解析 http://blog.csdn.net/tenfyguo/article/details/8225279 常用的基于token的实现方案 http://blog.csdn ...

  5. 移动端与PHP服务端接口通信流程设计(增强版)

    增强地方一: 再增加2张表,一个接口表,一个授权表,设计参考如下: 接口表 字段名 字段类型 注释 api_id int 接口ID api_name varchar(120) 接口名,以"/ ...

  6. App架构设计经验谈:服务端接口的设计

    App与服务器的通信接口如何设计得好,需要考虑的地方挺多的,在此根据我的一些经验做一些总结分享,旨在抛砖引玉. 安全机制的设计 现在,大部分App的接口都采用RESTful架构,RESTFul最重要的 ...

  7. app微信支付-java服务端接口 支付-查询-退款

    个人不怎么看得懂微信的文档,看了很多前辈的写法,终于调通了,在这里做一下记录. 首先来定义各种处理类(微信支付不需要特殊jar包,很多处理需要自己封装,当然也可以自己写完打个jar包) 参数要用jdo ...

  8. 基于CXF框架下的SOAP Webservice服务端接口开发

    最近对webservice 进行入门学习,网上也是找了很多的学习资料.总得感觉就是这了解点,那了解点.感觉不够系统,不够容易入门.差不多断断续续看了一个星期了,今天小有成果,把客户端,服务端都搞定了. ...

  9. springboot(服务端接口)获取URL请求参数的几种方法

    原文地址:http://www.cnblogs.com/xiaoxi/p/5695783.html 一.下面为7种服务端获取前端传过来的参数的方法  常用的方法为:@RequestParam和@Req ...

随机推荐

  1. 一篇文章了解JsBridge

    链接:https://blog.csdn.net/duwen90/article/details/79389545

  2. ASA许可证

    每台安装了BASE license的ASA平台都自带了一些隐藏的特性和功能.根据不同国际出口规则,有些ASA上安装的有可能是NO Payload Encryption license.这种许可证会绑定 ...

  3. 【音乐欣赏】《Fake》 - The Tech Thieves

    曲名:Fake 作者:The Tech Thieves [01;12.092]I got wasted,learning how to let it out [01;24.009]Please don ...

  4. ARM架构Linux环境安装python2.7.9

    1.下载python # wget https://www.python.org/ftp/python/2.7.9/Python-2.7.9.tgz 2.解压.编译安装 # tar -zxvf Pyt ...

  5. JAVA基础学习(1)之计算

    1.0计算机与编程语言 1.0.1计算机与编程语言 计算机解决问题 人:What to do 计算机:How to do 编程语言 描述要求计算机如何做事情的过程或方法 算法 计算=算法—>编程 ...

  6. div 悬浮

    一个小需求,鼠标移动一个产品那, 显示这个产品的具体信息 代码如下: <a href="javascript:void(0);" onclick="frameSea ...

  7. 【PAT甲级】1098 Insertion or Heap Sort (25 分)

    题意: 输入一个正整数N(<=100),接着输入两行N个数,表示原数组和经过一定次数排序后的数组.判断是经过插入排序还是堆排序并输出再次经过该排序后的数组(数据保证答案唯一). AAAAAcce ...

  8. PCC值average pearson correlation coefficient计算方法

    1.先找到task paradise 的m1-m6: 2.根据公式Dy=D1* 1/P*∑aT ,例如 D :t*k1   a:k2*k1: Dy :t*k2 Dy应该有k2个原子,维度是t: 3.依 ...

  9. html解析のBeautifulSoup

    引子: 使用python爬虫对爬取网页进行解析的时候,如果使用正则表达式,有很多局限,比如标签中出现换行,或者标签的格式不规范,都有可能出现取不到数据,BeautifulSoup作为一个专门处理htm ...

  10. 使用js制作 下拉选择日期列表 (即日期选择器)

    上代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <tit ...