客户端 API 开发总结

既然有人看,那咱就分享一下

## API 标准写法

摘抄:http://www.startupcto.com/backend-tech/building-an-api-best-practices

You‘ll generally want to wrap all your API responses in an ‘envelope‘ which specifies metadata about the APIcall.

```
// sample JSON envelope
{
"status": {
"code": 10000,
"message": ‘Success‘
},
"response": {
...results...
}
}
```

Doing this allows for client handler code to behave the same way for all API calls, since it gets a responses back in a universal format.

语义上再好一点,推荐:

```
// sample JSON envelope
{
"status": {
"code": 10000,
"message": ‘Success‘
},
"data": {
...results...
}
}
```

可视化编辑校验: http://jsoneditoronline.org/

## 注意事项

- json一定要规范,不然ios的json库无法读
- 如果支持jsonp,自己再加上一个callback就可以了。
- 状态码说明:code:10000类似的,要以业务或者功能模块来分类,以便debug的时候快速定位
- 尽量遵守rest

## 解释一个问题

http://ruby-china.org/topics/15164#reply5

```
xiaogui 7楼 , 19小时前 喜欢
#5楼 @lytsingsun
先说几点个人建议吧:
1、返回 json 数据,最好外面包一层校验,能让客户端快速知道,这数据合不合法、是否有错;
2、代码复用方面,主要看你项目的实际情况;
3、最好是能给客户端进行充分的沟通,怎么让双方都正规还方便;
4、性能方面,不外乎负载均衡、上缓存、数据库读写分离、代码优化;
```

第一点:就是说上面返回的status,要有code和message,根据code来判断问题,一般会直接alert出来code:message或者在日志里

这是xiaogui说的外面包一层校验的意思

其他的就没啥需要特殊说明的了

## 关于http的状态码和api里的status.code说明

**http的状态码是直接在request里的,这个一般指服务器的状态,api是假设每一个请求都是200的,在客户端非200的请求统一处理异常,而200的请求,首先解读status获取code是否为0(假设0是请求正确返回),如果是0就读取data,继而完成相应业务逻辑处理。**

- 职责单一,该是server的就是server,该是业务逻辑的就是业务逻辑的
- 少用http状态码,把http状态码统一封装到一个类,用于处理异常情况(ajax也好,ios的asi或afnetworking也好)
- 同样可以表示状态的,优先自定的状态码

## 为什么在response json里没有必要加http status code

每一个request都可以获得状态码,而上面我给出的json是在response里,那么在在http请求完成的时候我们仍然可以获得此request的所有信息

如果仍然在response里加入request里的东西,这样做是重复的,真的是没有必要的,not DRY

换个角度讲,一般我们使用http库的时候要自己封装处理http status code的,尽力减少每个请求的代码,是不可能每个request都去

```
判断code==200.。。。。。然后。。。。。
```

## 技术选项

- express or koa
- rails-api
- grape
- [sinatra](http://sinatrarb.com/)
- go的类似sinatra的框架[beego](http://beego.me/)

## 开发最佳实践

- api的code和msg可以写一个gem,直接继承到api里
- api测试和mock,最好是可以先mock出静态的,可以api和mobile端同时开发
- 根据测试生成api文档

**不过我还没有发现好的实现,还请各位指点**

## api的最佳实践

还是看open api吧

- http://developer.github.com/v3/
- [微博API](http://open.weibo.com/wiki/微博API)

----------------------

## 当。。。。

### 关联优先

比如获取新闻接口返回数据如下:

```
{
"data": [
{
"nid": 2,
"mid": 1,
"text": "this is a test.",
"images": [
"http://121.199.40.172:8086/images/news/12.png",
"http://121.199.40.172:8086/images/news/13.png",
...
],
"videos": [
"http://121.199.40.172:8086/videos/news/12.amr",
"http://121.199.40.172:8086/videos/news/13.amr",
...
],
"like": 0,
"comment": 0,
"publish_time": "2013-01-01 12:30:10"
},
...
],
"status": {
"code": "0",
"msg": "success"
}
}
```

返回的对象数组,乍看是合适的,但是我们发现1条新闻对应着多个评论,如果评论没有出现在此接口中,我就要发一个新的请求,这样问题就来了,该不该呢?

个人觉得,好的api,如果一次news的数据不是特别多,就应该最新评论,如5条,10条的带上

## 更新: 使用cors解决跨域问题

使用cors,解决跨域问题,实际中也是这样用,不过app.js里配置的路由还需要更严谨

```
// 支持跨域
app.use(require(‘cors‘)());
```

一般移动测试都要起一个server,然后访问api服务器的时候就要跨域,这样就可以在移动端浏览器里测试了。

而phonegap打包的时候是本地html所以不用跨域,但是为了测试方便,服务器还是建议加上cors。

- [best-practices-for-a-pragmatic-restful-api](http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api)

------------

这是去年我在ruby-china发的总结,转过来给大家看看

原文地址:https://ruby-china.org/topics/15173

欢迎关注我的公众号【node全栈】 ![node全栈.png](//dn-cnode.qbox.me/FtALxsauUkYDGdzcuA5y6BaIdUMC)

时间: 2024-10-06 19:02:28

客户端 API 开发总结的相关文章

API开发第四篇:定义客户端/服务端接口协议

在进行API开发的时候,需要事先定义好app与server交互的数据格式,这样前端人员与服务端人员才能够事先决定好如何获取数据.如何解析数据.如何传输协议. 在我看来目前接口协议无外乎这三种情况: 1. json数据进行交互 2. xml数据进行交互 3. 自定义数据格式交互 自定义数据格式进行前后端的数据交互,需要花费较大的精力,而且需要很有经验的人设计的协议才会确保各个平台的兼容以及良好的可阅读性.并且解析.封装都需要自己来用代码实现,很多第三方库都没办法用上.因为这里我不进行讨论.主要说说

API开发第一篇:关于session的APP服务端API开发

第一次做app的API开发,遇到的第一个问题就是:我的sessionid哪儿去了? 实现的一个功能是:短信验证功能,大体流程图如下: 问题的产生就发生在提交验证的时候,客户端并未通过header头带过来sessionid.那么这个时候,服务端就不知道该从哪一个session会话中取出值来进行判断.所以问题的解决核心点就是这个sessionid哪儿去了?以前只做PC端的时候,从来不怎么关心这个问题,因为浏览器自己就帮我们把这些事情搞完了. 解决办法一: 首先声明这个错误并不是由于服务端的错误,服务

浅谈php对api开发的作用

1 最近正在做一个手机APP的服务端API开发,虽然是基于Ruby on Rails的,做的也不太专业,不过大致相通,希望能够给你一些启发. 2 3 首先,如果是比较简单的手机APP,例如新闻客户端这样的不会涉及到长连接的服务,那么可以考虑直接使用http协议.因为该协议几乎被所有可以上网的设备支持,手机客户端那边也有大量相关的库可以调用,省掉不少麻烦. 4 5 这么说来其实用php基本也就等于用http协议了吧= =,php对其他协议的支持还真不怎么样. 6 7 确定完这个之后,就需要统一一下

数据库编程5 MySQL C API 开发

[本文谢绝转载原文来自http://990487026.blog.51cto.com] 数据库编程5 MySQL C API 开发 MySQL官方文档: MySQL  环境搭建 ubuntu搭建MySQL开发环境: MySQL服务命令 检查MySQL运行状态: MySQL SQL 登陆测试 创建一个数据库 显示数据库创建过程: 创建一个使用UTF8字符集的数据库 创建一个使用UTF8字符集的数据库,带校对规则 把数据库修改成UTF8字符集 选择数据库,创建表: 查表结构: mysql中的数据类型

GCM(谷歌云推送)客户端服务器端开发全指南(服务器篇)

今天我们按照之前所说的步骤介绍GCM云推送服务端的开发,因为服务端的开发比客户端的开发较简单,遵从由易到难,一步一步攻破的原则,所以我先于客户端讲服务端的开发,话不多说,让我们开始吧! 首先我们依旧来到首页 这次我们点击指南,进入到GCM开发Overview,这里概括了GCM客户端服务器端开发流程. 根据以下的流程图我们不难看出服务端和GCM的通信方式有两种 1.Http协议 2.Xmpp协议 Xmpp协议常用于双向通信,我们这里暂时不需要,因此果断选择Http协议来开发. 英语比较好的朋友可以

RabbitMQ系列教程之七:RabbitMQ的 C# 客户端 API 的简介

今天这篇博文是我翻译的RabbitMQ的最后一篇文章了,介绍一下RabbitMQ的C#开发的接口.好了,言归正传吧. Net/C# 客户端 API简介 1.主要的命名空间,接口和类 定义核心的API的接口和类被定义在RabbitMQ.Client这个命名空间下面: 所以要想使用RabbitMQ的功能,需要以下代码     using RabbitMQ.Client; [1].核心API的接口和类如下: IModel:表示一个符合AMQP 0-9-1 协议的通道,并且提供了很多的操作方法 ICon

循序渐进学.Net Core Web Api开发系列【13】:中间件(Middleware)

系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.概述 本篇介绍如何使用中间件(Middleware). 二.初步演练 先写几个中间件 public class DemoAMiddleware { private readonly RequestDelegate _next; private readonly ILogger _logger; public Dem

大数据技术之_04_Hadoop学习_01_HDFS_HDFS概述+HDFS的Shell操作(开发重点)+HDFS客户端操作(开发重点)+HDFS的数据流(面试重点)+NameNode和SecondaryNameNode(面试开发重点)

第1章 HDFS概述1.1 HDFS产出背景及定义1.2 HDFS优缺点1.3 HDFS组成架构1.4 HDFS文件块大小(面试重点)第2章 HDFS的Shell操作(开发重点)第3章 HDFS客户端操作(开发重点)3.1 HDFS客户端环境准备3.2 HDFS的API操作3.2.1 HDFS文件上传(测试参数优先级)3.2.2 HDFS文件下载3.2.3 HDFS文件夹删除3.2.4 HDFS文件名更改3.2.5 HDFS文件详情查看3.2.6 HDFS文件和文件夹判断3.3 HDFS的I/O

构建你的长寿命的API第1部分:规范驱动的API开发

构建你的长寿命的API第1部分:规范驱动的API开发 这篇文章是由MuleSoft的Mike Stowe在nginx.conf 2016公布的演示文稿改编的.第一部分重点是规范驱动的API开发. 第二部分讨论的最佳实践.你能够查看完整的呈现的记录的v=G8p4g3yYLBw">YouTube.详细信息例如以下: 0:00 介绍 1:52 API正在改变世界 2:32 API正在连接一切 3:36 API应该是持久的 4:01 构建一个持久的API的5个步骤 4:38 从长计议 6:03 你