ios APP的简单开发实例

学生一卡通消费查询app

关于本软件启发来源于校园一卡通,在学校官网我们也可以相应查询自己的一卡通在校园的消费状况,然而步骤比较繁琐(需要登录网站,找到相应区域等操作),所以以此构想出一款方便学生查询的app。

项目计划:

关于此款app的基本功能介绍:本软件可以实时记录学生在学校使用学生卡的消费情况,记录消费明细并及时显示余额。学生可以查询特定时间内的消费记录,自动生成每月账单总结报表。方便学生具体了解自己的消费状况并结合自身情况合理消费。

*阶段:需求分析

(1)首先要确定系统需要实现哪些功能?

要实现的功能:用户登录、记录消费(明细)、查询特定时间内的消费记录、账单总结(报表)、余额显示、退出

(2)构造整个app框架,再总结需要用到的知识,进行针对性的研究学习。

所用到的相关知识:数据库、图形与多媒体、操作栏等

关于数据库的设计:要确定表、视图的汇总以及各表的设计详解

本系统做简单开发只需要包含一个基本表,所含字段包括ID(主键)、年份、月份、金额、消费类别

(3)流程图

要画出系统的整体流程以便于直观地了解本系统。

第二阶段:界面设计

通过墨刀等软件可以先做出一个基本的用户界面,方便代码的编写。

第三阶段:代码实现

这是整个项目*核心的阶段,需要多方配合以及程序编写者耗费大量的时间:

虽然作为一个简易的app,但还是多个成员共同编写一段代码,这就造成了代码的融合问题,每个人编写属于自己的代码并作出详细的模块注释方便成员理解各人的代码。

第四阶段:调试以及真机运行

当阶段三完成就是进行调试和运行,再进一步地做出相应的改进。

本项目所需成员角色(共四人):
A项目经理:leader,整个项目的发起者,在一系列的项目计划、组织和控制活动中做好领导工作,从而实现项目目标。在我们的项目中,项目经理提出自己的idea,进行分工,监督每个人的职责贯穿在整个项目中。
B 程序员:编写代码,小组成员共同编写,遇到较大的问题时再集中讨论并解决。
C 测试员:小组成员共同完成。

合适的开发方法:

敏捷开发:敏捷开发以用户的需求进化为核心,采用迭代、循序渐进的方法进行软件开发。在敏捷开发中,软件项目在构建初期被切分成多个子项目,各个子项目的成果都经过测试,具备可视、可集成和可运行使用的特征。换言之,就是把一个大项目分为多个相互联系,但也可独立运行的小项目,并分别完成,在此过程中软件一直处于可使用状态。

 

iOS调用系统邮箱

/**

recipients:收件人

subject :主题

messageBody :内容

*/

+ (MFMailComposeViewController*)launchMailAppDelegateRecipients:(NSArray *)recipients subject:(NSString*)subject messageBody:(NSString*)messageBody delegate:(id)obj

{
MFMailComposeViewController *picker = nil;

if([MFMailComposeViewController canSendMail]) {// 判断设备是否支持发送邮件

// 创建对象

picker = [[MFMailComposeViewController alloc]init];

// 设置代理

picker.mailComposeDelegate= obj;

picker.navigationBar.tintColor= [UIColor blackColor];

// 设置收件人

[pickersetToRecipients:recipients];

// 设置主题

[pickersetSubject:subject];

// 设置邮件内容

[pickersetMessageBody:messageBodyisHTML:NO];

 

}

else{
[MBProgressHUD ll_showErrorMessage:@”请先设置登录邮箱号”];

}

 

returnpicker;

}

 

 

//调用系统打电话:

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@”telprompt:400-000-1110″]];

小公司都是怎么部署代码到生产环境服务器的?

据我所知,大公司的代码上线流程一般都会很规范,有专门的代码发布系统。但小公司的话,可能会没有实力去开发这种发布系统,所以想了解下这个问题。

如果是我的话,我的做法应该是: 首次部署使用 git clone,后续代码的变更则使用 git pull

这种做法好不好?或者有没有更好的做法呢?

代码 git 做法 clone118 条回复 • 2021-06-26 14:29:29 +08:00
1 2
2
❮ ❯
oneisall8955 101
oneisall8955 9 小时 28 分钟前 via Android
曾经小公司经历的版本:
v1:本地打包+sftp+手工命令
v2:上述封装成本地脚本命令一件执行
v3:项目多了,改 jenkins 发布,按钮点点点

现在:jenkins+docker 镜像
oneisall8955 102
oneisall8955 9 小时 25 分钟前 via Android
@yhxx 生产这样不怕进程没了吗?
madpecker009 103
madpecker009 6 小时 33 分钟前
Ctrl+c Ctrl+v
yumerdev93 104
yumerdev93 6 小时 25 分钟前
本地打包 docker image,push 到自己的仓库,然后 docker swarm 更新下 service?
xinJang 105
xinJang 6 小时 15 分钟前
看来这里需要先对小公司做个定义。比如我目前所在公司,就我一个人搞技术!!!
目前做法是:后端直接替换 class 跟 jsp(tomcat),公众号直接替换 npm build 之后的 dist(改名为 app)
盲人摸象的感觉,随时准备裸辞
bojackhorseman 106
bojackhorseman 6 小时 8 分钟前 via iPhone
@yhxx xs 哈哈哈
jeffh 107
jeffh 6 小时 7 分钟前
>> 阿里云云效 2020,30 人一下的团队可以申请免费;
包括云代码管理,项目管理,流水线部署等~~~

@xuxuxu123 感谢分享,*近一直在找阿里云 CICD 的有力工具
darrenfang 108
darrenfang 6 小时 0 分钟前
服务器上装 eclipse,代码在服务器上面写,写完在 eclipse 里面重启服务器 ?
creanme 109
creanme 5 小时 33 分钟前
早些年用过 scp 部署,后来用过 gitlab
weitch 110
weitch 5 小时 32 分钟前
svn co svn://xxxxx/app
service httpd restart

JingKeWu 111
JingKeWu 5 小时 19 分钟前
docker+k8s
anonymous256 112
anonymous256 5 小时 15 分钟前
@whileFalse git pull 容易自动合并或者卡在冲突. 那是因为你们工作在同一个分支上,每个人的改动不一。

*佳实实践每个人用自己的分支,*后再 PR 或 merge 代码到主分支,merge 的权限交给对代码*熟悉的人。
axzy 113
axzy 5 小时 3 分钟前
小公司啊?直接 FTP 上传呗,然后就完事了
byte10 114
byte10 3 小时 35 分钟前
都是太低端啦,直接 vscode 远程开发,改完之后,直接启动服务,nohup 命令即可,发布完成。随时有问题,随时改,改完发布完成。有问题直接开一个节点 debug 完后,重新发布。手动、狗头
yinxianwei 115
yinxianwei 3 小时 18 分钟前
Jenkins 配合 git flow
cp19890714 116
cp19890714 2 小时 45 分钟前
上家公司稍大, 用 jenkins + k8s
现在的小公司, 云效部署, 比 jenkins 省事多了.
30 人以下的公司, 真心推荐云效, 不用维护那么多的工具.
alsas 117
alsas 1 小时 40 分钟前
sftp 手动放上去
Torpedo 118
Torpedo 45 分钟前
底线就是完全自动化,可以回溯版本。

至于怎么搞,方法有很多

终于找到了在虚拟机下体积不超过 2G 的桌面 Linux 系统!同时有几个小问题

antiX linux,之前一直没尝试它是因为它的名字让我以为这个系统是没有桌面的….这两天用它的 net.iso 在虚拟机下面安装好一个将就能用的 xfce4 桌面,包含 vbox-guest-x11 在内体积只有 1.5G !这可是一个以 debian stable 为基础的、正常的 linux 桌面系统!比 alpine 、puppy 、slax 那些邪魔歪道好太多了!

不过太简陋的桌面就自然有一些小问题,先来两个:

1,普通用户登陆进桌面,无法关机和重启,shutdown 、suspend 、switch user 这三个按钮都是灰的,还需要安装哪些软件包后者设置哪些地方好让这三个按钮起作用?

2,虚拟机和主机之间共享剪切板是 OK 的,但是共享文件夹有问题,设置了主机的 /tmp 共享进虚拟机挂载为 /ttmp,普通用户登陆后可以在文件系统里面看到 /ttmp 文件夹,但是无法访问,“permission denied”,如果以 root 登陆的话可以进入这个 /ttmp,但是看不到任何文件,主机的 /tmp 里面可是很多临时文件和文件夹的,一个都看不到也太奇怪了吧?请问这是哪里的问题?
桌面 ttmp 文件 Linux11 条回复 • 2021-06-26 15:07:50 +08:00
hefish 1
hefish 7 小时 49 分钟前
arch 也超过 2G 了吗?确实没注意这个容量问题。
avastms 2
avastms 7 小时 4 分钟前 via Android
以前那些 live cd 哪个超过 700m 了
podel 3
podel 6 小时 46 分钟前
难道不是应该不要界面直接终端操作么?这样更小
oott123 4
oott123 6 小时 26 分钟前 via Android
我应该能回答 2:/tmp 目录比较特殊,有 sticky bit 权限在,虚拟化软件可能并非使用 root 启动进程,因而看不到文件也是正常的。
totoro625 5
totoro625 6 小时 25 分钟前
纯终端操作的 Debian 莫名其妙用掉了 3.65G
两台 VPS 分别用掉了 4.6G ; 5.4G
都是安装了 docker/frp/clash
终归就是莫名其妙的体积就上去了
mxalbert1996 6
mxalbert1996 4 小时 13 分钟前 via Android
@totoro625 试试 docker system prune
felixcode 7
felixcode 3 小时 57 分钟前 via Android
debian *小化安装,再装个 xfce 应该大不到哪去,2G 以内很正常
snoopyhai 8
snoopyhai 3 小时 54 分钟前
lubuntu 印象中这个也不大把?
kerro1990 9
kerro1990 3 小时 51 分钟前
Linux mint
hgjian 10
hgjian 1 小时 8 分钟前 via Android
Lubuntu 欢迎你

way2create 11
way2create 6 分钟前
既然虚拟机了 我都是*小化安装 桌面版占用太大了

SDK是什么?与API有什么关系?

SDK是一系列程序接口,文档,开发工具的集合,是的,集合,sdk即单单不是一个开发工具,也不是一个程序。一个完整的SDK应该包括以下内容:(1)接口文件和库文件(2)帮助文档(3)开发示例(4)实用工具。

SDK即“软体开发工具包”,一般是一些被软件工程师用于为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件的开发工具的集合。通俗点是指由第三方服务商提供的实现软件产品某项功能的工具包。

通常SDK是由专业性质的公司提供专业服务的集合,比如提供安卓开发工具、或者基于硬件开发的服务等。也有针对某项软件功能的SDK,如推送技术、图像识别技术、移动支付技术、语音识别分析技术等,在互联网开放的大趋势下,一些功能性的SDK已经被当作一个产品来运营。

开发者不需要再对产品的每个功能进行开发,选择合适稳定的SDK服务并花费很少的经历就可以在产品中集成某项功能。

接口文件和库文件就是API,将底层的代码进行封装保护,提供给用户一个调用底层代码的接口;
帮助文档解释接口文件和库文件功能,以及介绍相关的开发工具,操作示例等等;
开发示例就是做出来的一个DEMO展示,也要包括源代码;
实用工具是用来协助用户进行二次开发的工具,比如二次开发向导、API 搜索工具、软件打包工具等。

有过java编程经历的都知道,要运行java需要在电脑上安装jdk。jdk就是java SDK ,其安装过程就是下载一个EXE(Windows下)的应用程序,点一下就OK了,看起来好像jdk就是一个应用程序。实际上这个在网上下载下来的应用程序只是jdk的一个安装向导,它帮你在电脑上安装了Java的运行环境,一堆Java工具和Java基础的类库,这些东西组合起来才是JDK的核心内容。
通过上述的示例,相信你大概明白了sdk包含些什么东西了。

那么学c的同学又会问,为什么在windows下运行c语言,没见要下载什么’C  SDK’什么的啊?
因为C语言没有特定SDK,也不需要像Java一样在虚拟机上运行程序示例。但是C语言有丰富的API,同时C语言不需要像Java一样使用Java开发商提供的API,它可以直接调用系统本身的API。

实际开发中,可以轻松的获得多种多类的软件开发的工具(如keil uvision, eclipse,Visual C++等),这些工具集成了语言的开发环境、编译环境,还提供纠错功能。可以通过这些工具将SDK中的函数,框架类导入,使用别人写好的类,协助软件的开发。

 

=============== API ===============

(1)API的概念

API即“应用程序编程接口”,是一些预先定义的函数,目的是作为“介面”沟通两个不同的东西,提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

其实就是别人已经写好的可以实现特定功能的函数,而你只需要根据他提供好的接口,也就是调用他的方法,传入他规定的参数,然后这个函数就会帮你实现这些功能。

 

从接口interface来说,在计算机领域是指两个不同事物之间交互的地方,大可以到两个完整的不同系统,小可以到两段程序。所以这个I就这么理解。在这个基础上,人和程序交互的地方,叫做UI,user interface,所有人输入的包括鼠标键盘触摸屏声音输入都算。那么程序和程序交互的就叫做API,所有非人对非人交互都通过API进行交互,所谓交互,其实就是传递数据,触发功能。

(2)API应用案例

示例场景:假如你是一家小企业,公司网站上有一个表格是用来给客户注册预约的。你想要凭借这些预约细节信息,让客户能够自动在谷歌日程上创建活动。

API使用:这就意味着,你的网站服务器需要直接与谷歌服务器进行对话,在掌握既定细节信息的情况下,申请创建活动。之后,你的服务器就会接收到谷歌的响应并进行处理,然后将相关信息发送回浏览器,比如说向用户发送一个确认信息。

(3)API产品——现在也有公司将API包装成产品

案例:Weather Underground出售其天气数据API的访问权限给其他人。

(4)API的分类

API又分为(Windows、Linux、Unix等系统的)系统级API,及非操作系统级的自定义API。作为一种有效的代码封装模式,微软Windows的API开发模式已经为许多商业应用开发的公司所借鉴,并开发出某些商业应用系统的API函数予以发布,方便第三方进行功能扩展。如Google、苹果电脑公司,以及诺基亚等手机开发的API等等。

API又分为开放式API和私有API。顾名思义,开放式API即是向所有人公开的接口,允许任何人调用它并获取到它背后的数据,有时公司会将 API 作为其公共开放系统,也就是说,公司制定自己的系统接口标准,当需要执行系统整合、自定义和程序应用等操作时,公司所有成员都可以通过该接口标准调用源代码,该接口标准被称之为开放式API。私有API即接口未对外开放。

 

 

========== SDK 和 API 的关系 ==========

SDK相当于开发集成工具环境,API就是数据接口。在SDK环境下调用API数据。

实际上SDK包含了API的定义,API定义一种能力,一种接口的规范,而SDK可以包含这种能力、包含这种规范。但是SDK又不完完全全只包含API以及API的实现,它是一个软件工具包,它还有很多其他辅助性的功能。

SDK 包含了使用 API 的必需资料,所以人们也常把仅使用 API 来编写 Windows 应用程序的开发方式叫做“SDK编程”。

通俗语言解释

API

前端调用后端数据的一个通道,就是我们俗说的接口,通过这个通道,可以访问到后端的数据,但是又无需调用源代码。

SDK

工程师为辅助开发某类软件的相关文档、范例和工具的集合,使用SDK可以提高开发效率,更简单的接入某个功能。

举例说明:一个产品想实现某个功能,可以找到相关的SDK,工程师直接接入SDK,就不用再重新开发了。

 

========== 举个例子 ===========

在这里,一个简单的功能链条我将它分为三个组成部分:

1、客户端组装数据

2、客户端使用组装的数据来请求服务端(或者操作系统)的 api

3、服务端(或者操作系统)的 api 处理数据并返回处理结果

结合这个链条得出结论:

1、api为细粒度的功能接口

2、sdk包含第2、3步

3、sdk为api的集合

什么是API?

何为API?如果你在百度百科上搜索,你会得到如下结果:API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。那么再通俗一点来说,API究竟是什么呢?

在我学习软件开发之前,API听起来似乎像是一种啤酒。

而现在,我开始频繁使用这一术语,以至于我在酒吧里都想点一杯API来喝喝看了。

酒保发送的响应是:“查无此酒”——404:找不到该资源。

我碰见过很多人,有科技圈内的,也有圈外的。对于API这样一个常见术语的含义,他们的理解都存在些许偏差或不确定的成分。

从技术角度来说,API指的是应用程序编程接口。大多数大型企业都会为自己的客户建立应用程序编程接口,或供内部使用。

但是你该如何用大白话来解释API这个术语呢?除了在开发和业务中的含义,API是不是有更宽泛的含义呢?首先,让我们退后一步,来了解一下互联网究竟是如何工作的。

WWW和远程服务器

当我想到互联网的时候,我的脑海中浮现出了一个由互联服务器构成的大型网络。

互联网上的每一个界面都被存储在一个远程服务器里。远程服务器也没有大家想的那么神秘——它不过是用来优化处理需求的远程计算机罢了。

为了正确了解API,你可以在自己的笔记本电脑上启动一个能面向网络提供整个网站服务的服务器(事实上,在网站正式上线之前,工程师们就是通过本地服务器来开发网站的)。

当你在浏览器中输入www.facebook.com,一则请求会出现在Facebook的远程服务器上。一旦你的浏览器收到了响应,它就会解析代码、呈现出网页。

对于浏览器来说(这也是所谓的客户端),Facebook的服务器就是一个应用程序编程接口。这意味着每当你在互联网上访问一个页面的时候,你都在与某个远程服务器的API发生交互。

API并不完全等同于远程服务器——它其实是服务器的一部分,负责接收请求并发送响应。

API是一种为客户提供服务的方式

你也许听说过有公司将API包装成产品。举个例子,Weather Underground就会出售其天气数据API的访问权限给其他人。

示例场景:你是一家小企业,公司网站上有一个表格是用来给客户注册预约的。你想要凭借这些预约细节信息,让客户能够自动在谷歌日程上创建活动。

API使用:这就意味着,你的网站服务器需要直接与谷歌服务器进行对话,在掌握既定细节信息的情况下,申请创建活动。之后,你的服务器就会接收到谷歌的响应并进行处理,然后将相关信息发送回浏览器,比如说向用户发送一个确认信息。

此外,你的浏览器通常可以绕过自己的服务器,直接向谷歌服务器发送API请求。

那么谷歌日历的API与其他远程服务器的API存在什么区别呢?

从技术角度来说,不同之处在于请求和响应的形式。

为了提交整个页面,你的浏览器会期待得到HTML格式的响应,这就包括显示代码。而谷歌日历的API只会返回一些数据——大多是与JSON格式相同。

如果你的网站浏览器发出了API请求,之后网站服务器就成为了客户端(当你使用浏览器访问某一网站的时候,你的浏览器也相当于是一个客户端)。

从用户角度来说,API可以让他们无需离开网站就能完成原先的操作。

现今大多数网站至少都会使用一些第三方API。

存在的问题都有了第三方解决方案,但是是以库或服务的形式。使用现有的解决方案已经变得更加方便且可靠了。

开发团队将自己的应用分解到多个可以通过API进行互通的服务器上,这已经是司空见惯的做法了。这些为主应用服务器提供辅助功能的服务器通常被称作是微服务架构。

总结一下,当一家公司为客户提供API的时候,这仅仅意味着它们建立了一组专用的URL通道,用来返回纯数据响应——也就是说,响应内容不会包含图形用户界面(例如网站)中的显示开销。

你能够用自己的浏览器发送这种请求吗?通常都是可以的。由于实际的HTTP传输都是以文本的形式进行的,你的浏览器可以一直达到显示响应的*佳状态。

举个例子,你可以直接通过浏览器访问GitHub的API,而无需访问令牌。如下是你在浏览器中访问GitHub用户API路径时得到的JSON响应:

浏览器似乎可以很好地显示出JSON响应结果。像这样的JSON响应,你就可以直接用在代码中了。从这些文本中,你很容易可以提取出数据,之后你就可以基于这些数据做自己想要做的事情了。

A指的是“应用”(Application)

作为结束,我就再给出几个API的实例吧。

“应用”(Application)可以指代很多事物。如下是它在API语境下的含义:

API:

  1. 一个提供特定功能的软件
  2. 整个服务器、整个应用或一款应用的很小一部分

从本质上来说,任何能从自身环境中分离出来的软件都可以成为API中的“A”,且很可能它本身也是某种API。就这么说吧,你在代码中使用的是第三方库。一旦该库与你的代码整合在了一起,那么这个库也就成为了整体应用的一部分。作为软件中特殊的一部分,库很有可能也拥有一个API,使其与剩余代码进行交互。

还有一个例子:在Object Oriented Design(面向对象编程)中,代码被编成了对象。你的应用程序也许拥有数百个能够实现交互的对象。

每一个对象都有一个API——这是一组公共方法和属性,对象可以用它来与应用中的其他对象进行交互。

对象也许还拥有私有的内部逻辑,这就意味着它在躲避外界环境(那它也就不是一个API)。

从上述讨论的内容来看,我希望你能掌握API的广义,也能了解现今这一术语的常见含义。

web项目API接口设计与开发总结

当前公司自主开发的一个AI图片识别项目,需要对外开放提供接口,领导二话没说把这个任务交给我来做,算是对我的一次考验。虽然以前自己没有设计过接口,但是调用过别人写的接口,如百度提供的接口,还有以前在项目中调用别人的接口等等。感觉调用别人的接口还挺方便的,自己来设计的时候,真不知道如何下手。然后去查看学习各种教程,开始进行接口的设计与开发工作。

 

设计原则

鉴于目前的网络环境形式,设计的首要原则是安全*原则,如果设计的接口不能保证其安全性,其他的活都相当于白干了。其次是简单原则,我认为调用接口的方式越简单越好,因为现在的人都很懒,这一点百度做得很好,调用他们的接口非常简单。如调用百度地图API,一个key就够了。目前只考虑到这两点,其他的还没有总结出来。

 

开发环境

Node.js + WebStorm + MySQL//说明:公司选择JavaScript作为后台开发的主要语言,开发难度估计只有Java的一半,可是现在使用的公司却非常少,搞不懂为什么。据统计NPM上面包的下载量和MAVEN的包下载量不是一个量级的,使用NPM的人超多,比用MAVEN的人多多了。

 

整体设计

这个接口的*终成型不是一下子全部就实现了,而是在工作中不断地改进,在每次改动中不断地变得越来越好,才算完成一个初步的版本。写代码就好比谈恋爱,两个人不可能一下子熟悉起来,立刻热恋,然后马上结婚,特例除外。在开发的过程中需要一直不停的更改,即使是上线了也有可能还需要修改,没有*终版本,因为需求的变动是不确定的。

这个接口是于一个独立的项目,为了在部署时方便,也为了调用时不和正式项目发生冲突,所以单独进行开发。所有的请求分为两大类,一类是获取用户token的请求,一类是进行业务操作的请求。

请求处理的先后顺序:请求拦截器—>获取用户token—->其他业务操作。如下图:
%title插图%num

 

开发过接口的人都知道,一般来说接口是没有页面的,只有后台;并且出于安全起见,所有的请求全部为POST请求。按照上面的设计来进行开发,获取用户token的请求不会被拦截器拦截,这步操作有些类似于用户登录的操作。其他的业务操作全部需要先经过拦截器先处理,验证通过后才放行,验证不通过则返回错误信息。

获取用户token时,需要传递三个参数,用户名、用户密码和一个秘钥key(UUID生成),其中用户密码和秘钥key都使用MD5加密。MD5加密不可逆,为了防止敏感信息被别人窃取,所以采取加密传输。验证通过则返回用户token和私钥,有效时间都是一个小时。秘钥key没有采用特殊的生成规则,比如用户ID+日期+项目名称+随机数字。使用简单的UUID生成32位长度的随机字符,我觉得很low,可是破解的概率*小,既简单又安全还实用。

返回的状态码和消息只有三种:接口调用失败,业务操作成功,业务操作失败。*开始设计时还加了一种接口调用成功,可后来转念一想,这一步有些多余。如果接口调用成功,那一定会进行业务操作,剩下的则是业务操作的事情了,所以把接口调用成功这一状态取消了。

所有操作分为三种情况:

接口调用失败—->返回错误信息;

业务操作成功—>返回操作成功信息;

业务操作失败—->返回业务操作失败信息。
%title插图%num

拦截器设计实现。拦截器用来拦截业务操作的所有请求,进行安全验证。验证的主要内容有:请求IP地址验证—->用户token验证—>rsa签名验证—>秘钥key验证。只有全部通过验证后才放行,否则返回错误信息。如果不清楚rsa加密方式的朋友可以先去百度百科里面了解一下rsa加密方式。

至于业务操作的设计则没有什么特别之处,和平常的增、删、改、查差不多。写一点,关于参数处理,如果可以的话,*好要在后台进行参数校验,我坚信一点,永远不要相信用户会按照你设计的方式来进行操作。所以对于用户输入的所有参数自己会严格验证,验证通过后才让程度进行下一步操作。

 

接口测试

由于接口没有页面,测试时不像一般的页面那样方便,只能采取其他方式来进行测试。同事建议我使用谷歌的一个专业测试软件Postman,自己使用后觉得还将就,不过我认为还是不太方便。然后换用了另外一种本人认为更简单的方式,使用WebStorm 创建一个新项目,只需要导入可以发送POST请求的包即可,然后一个test.js文件搞定所有测试。

秘钥key使用rsa(私钥)加密,token原样传输,参数使用aes加密,然后在在使用rsa(私钥)进行签名操作生成签名字符串。签名主要是为了防止数据在传输过程中被串改,敏感数据则使用rsa私钥加密,然后用公钥解密,也可以使用公钥加密,私钥解密,主要是为了防止被窃取。但是我了解到的是rsa签名只能使用私钥,再使用公钥验证签名。

%title插图%num

   自己创建一个新项目来进行测试,一个接口接着一个接口的测试,很快全部测试完毕,Word文档也同步写好。测试工作完成则表明接口开发的初步版本完成。
遇到的问题
       开发和测试中肯定会遇到各种各样的问题,在此只写几个有代表性的问题。
       *个问题,rsa加密有长度限制,网上说只能加密117个字节,当我加密的数据太长时果然出现问题,比如加密Base64格式的图片信息出问题。为了解决这个问题,所以使用aes来进行加密和解密数据,图片信息也不受影响。
        第二个问题,使用rsa加密的数据中可能会含有加号,开始时我是放在URL中进行传输,之后在解析时会将加号解析为空格,这个问题是采了很久的坑才知道的。左思右想才想到一个很好的解决办法是在解析URL参数后,使用正则表达式将字符串中的空格全部替换为加号,测试完全可行。
       这种方式对于有单个加号的数据可行,可是后面测试时,问题来了。一次数据验证签名一直没有通过,我很奇怪,刚才还好好的,怎么一下子就不行了呢。仔细查找原因才知道,在使用rsa进行数据签名操作时,字符串中出现了三个连续加号如下:
FayA44XDO5jeqDbafkMqzogMZHvJ+l3CX3myjiPYrsyyXV7KJvgjgNeVf+++m/UDNrcTuFQ2DnzR+rngygfJ0Q==  这是我意识到问题的严重性,rsa操作生成的数据*好不要拼接在url中传输,否则会出问题。如果一定要拼接在URL中进行传输,则对加号一定要特殊处理。我的处理方式是所有参数全部放在body中进行传输,这样解析时就不会出问题。
        第三个问题,数据在传输前是JavaScript中的一个对象,不便于传输,为了解决这个问题尝试过不少方法,*终决定采用JSON.stringify()//JSON.parse()这一对函数来解决。因为数据加密只能加密字符串,可以使用JSON.stringify()函数将JSON对象转换为字符串,然后进行加密传输。对字符串进行解密后在使用JSON.parse()函数将字符串转换为JSON对象。测试可行,圆满解决这个问题。
        第四个问题,获取token的请求和其他大的业务请求操作不太一样,在拦截器中我做了一次请求地址的判断,如果请求地址是获取token则直接跳转到对应的方法,否则放行进行其他业务操作。这样做虽然每一次都需要做一次请求判断,可是代码量大大滴减少了,因为每一个请求都需要做IP地址验证,如果不这样处理,则需要把请求地址验证的方法单独写到一个文件中,放在*前面,我没有这样做,感觉这样做比较麻烦,还是使用一个拦截器方便、简单些。
总结
      从这次设计、开发、测试接口中学到不少的东西,虽然这个接口项目还在不断地完善,不过我知道我肯定会做得越来越好。比如关于安全方面,后期肯定还会添加验证,用于防止攻击,如防止频繁的请求攻击,只限制post请求进入等等。
      真实的项目开发中学习到的这些东西印象都会非常深刻,不容易忘记。自己平时也在学习其他的编程语言比如Python,学习完后没有使用起来会很快忘记。在工作中则不一样,可以做到真正的学以致用,学习到的东西需要马上使用,这时印象会非常的深刻。
      学到老,活到老是我一贯坚持的信条,写这篇博文分享出来也算是对自己工作的一种总结,一种学习。如果各位开发的朋友有不懂的或者是有更好建议,欢迎留言。