一、本文档的写作目的

  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. PHP导出身份证号科学计数法

    最近在做PHP的数据导入和导出,到处身份证号的时候,直接变成了科学计算法,找了一个很简单的方法就是这样 $obj= " ".$v['idcard']; 但是这样有空格啊,网上搜了一 ...

  2. 移动端适配rem为单位的rem.js及个别设备设置了大字体模式,导致页面变形的处理方式

    这段时间内,涉及到的都是移动端开发,说到移动端开发,我们就会思考到,目前分辨率的问题,如果用px为单位的话,在不同移动设备和不同分辨率下,页面的效果可能会有所不同,甚至导致页面变形.所以在次我们就用到 ...

  3. MySQL命令行脚本

    1. 命令行连接 打开终端,运行命令 mysql -uroot -p 回车后输入密码,当前设置的密码为mysql 退出登录 quit 和 exit 或 ctrl+d 查看版本:select versi ...

  4. JDK动态代理+反射实现动态修改注解属性值

    这是最近朋友的一个需求,正好闲来无聊有些时间,跟着研究一下,如有不正确的地方,欢迎大家指正~ 一.准备自定义注解 注:如何实现自定义注解,请移步百度. 二.实现 1.实现方式1:通过反射+动态代理动态 ...

  5. JEECG笔记

    一.修改默认主题 找到SysThemesEnum.java类,路径为:\src\org\jeecgframework\core\enums\SysThemesEnum.java,在toEnum(Str ...

  6. Centos610-Nginx-TCP代理配置

    1.安装Nginx 详见<nginx>安装 2.下载nginx_tcp_proxy_module模块 下载  wget https://github.com/yaoweibin/nginx ...

  7. Hadoop3.1.1源码Client详解 : 入队前数据写入

    该系列总览: Hadoop3.1.1架构体系——设计原理阐述与Client源码图文详解 : 总览 紧接着上一篇: Hadoop3.1.1源码Client详解 : 写入准备-RPC调用与流的建立 先给出 ...

  8. Anaconda"无法定位程序输入点 OPENSSL_sk_new_reserve 于动态链接库Anaconda3\Library\bin\libssl-1_1-x64.dll上"的解决办法

    Anaconda"无法定位程序输入点 OPENSSL_sk_new_reserve 于动态链接库Anaconda3\Library\bin\libssl-1_1-x64.dll上" ...

  9. Spring Boot 框架 - 快速创建Spring Boot应用

    使用Spring的项目创建向导创建一个Spring Boot项目 创建完成目录 目录文件说明: 主启动程序已生成 resources文件夹中目录结构 static:保存所有的静态资源,例如js,css ...

  10. 1022_Digital_Library (30分)

    这里提供两种写法, 其实都是一样的,第一种比较快. #include <bits/stdc++.h> using namespace std; map<string,set<s ...