一、本文档的写作目的

  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. windows 动态库导出

    以下内容来自博客:https://blog.csdn.net/fengbingchun/article/details/78825004 __declspec是Microsoft VC中专用的关键字, ...

  2. Python学习(七)——匿名函数、map函数、filter函数、reduce函数与其他内置函数

    匿名函数 lambda x: x + 1 # lambda:定义匿名函数的关键字 # x:形参 # x+1:程序处理逻辑 fun = lambda x: x + 1 print(fun(5)) #6 ...

  3. Atcoder Beginner Contest153F(模拟)

    应该也可以用线段树/树状数组区间更新怪兽的生命值来做 #define HAVE_STRUCT_TIMESPEC #include<bits/stdc++.h> using namespac ...

  4. 每天进步一点点------Alpha半透明图形叠加算法Matlab+Verilog实现

    Alpha图形叠加算法Matlab+Verilog实现 1.1. Alpha算法的研究 Alpha通道是一个8位的灰度通道,该通道用256级灰度来记录图像中的透明度信息,定义透明.不透明和半透明区域, ...

  5. knn 算法 k个相近邻居

    # 一个最基本的例子 #样本数据的封装 feature = [[170,70,42],[166,56,39],[188,90,44],[165,88,40],[170,66,40],[176,80,4 ...

  6. aarch64架构下安装tensorflow详细过程

    本人使用的是: EAIDK-610开发板,Redhat的Linux系统,arm64架构,python3.6环境. 重要的: 一定要下载符合自己环境架构相同的tensorflow安装包. 三种架构: x ...

  7. 读书小记--<态度>

    前言 前段时间再读了吴军老师的<态度>,分享的是和女儿的日常书信.觉得收获很多,同时推荐他的<浪潮之巅><数学之美><大学之路>系列书籍. 下面是个人的 ...

  8. oracle 12c pdb开启和关闭

    oracle 12c pdb开启和关闭 //开启数据库 sqlplus / as sysdba;                  //登录连接CDB,默认是root container;startu ...

  9. Linux 服务器作为Nginx web服务器常见优化参数

    内核参数调整cat /etc/sysctl.conf# sysctl settings are defined through files in # /usr/lib/sysctl.d/, /run/ ...

  10. 看 C++ Primer 的58页, 讲拷贝时不能忽略 底层const这里的说的原因有点牵强, 这里给出自己的理解

    extern const  int ci =42; const int * p2  = &ci; extern const  int *const p3= p2; int *p= p3;   ...