接口
RestfulAPI 规范
RESTful 是目前最流行的 API 设计规范,用于 Web 数据接口的设计。
RESTful 的核心思想就是,客户端发出的数据操作指令都是"动词 + 宾语"的结构。
比如,GET /articles这个命令,GET是动词,/articles是宾语。
动词通常就是五种 HTTP 方法,对应 CRUD 操作
GET:读取(Read)
POST:新建(Create)
PUT:更新(Update)
PATCH:更新(Update),通常是部分更新
DELETE:删除(Delete)
根据 HTTP 规范,动词一律大写。
有些客户端只能使用GET和POST这两种方法。
服务器必须接受POST模拟其他三个方法(PUT、PATCH、DELETE)。
这时,客户端发出的 HTTP 请求,要加上X-HTTP-Method-Override属性,告诉服务器应该使用哪一个动词,覆盖POST方法。
编写api接口文档
正规的团队合作或者是项目对接,接口文档是非常重要的,一般接口文档都是通过开发人员写的。一个工整的文档显得是非重要
接口规范内容
* 接口名称
* 场景说明
* 接口说明
* 请求参数
* 响应参数
* 错误码
参数内容
* 字段名
* 变量名
* 是否必填
* 类型
* 示例值
* 描述
错误码内容
* 名称
* 描述
* 原因
* 解决方案
接口示例(来源:[聚合数据](https://www.juhe.cn/)新闻接口)
接口地址:http://v.juhe.cn/toutiao/index
返回格式:json
请求方式:get/post
请求示例:http://v.juhe.cn/toutiao/index?type=top&key=APPKEY
接口备注:返回头条,社会,国内,娱乐,体育,军事,科技,财经,时尚等新闻信息
>请求参数说明:
| 名称 | 必填 | 类型 | 说明 |
| :--- | :--- | :----- | :----------------------------------------------------------- |
| key | 是 | string | 应用APPKEY |
| type | 否 | string | 类型,top(头条,默认),shehui(社会),guonei(国内),guoji(国际),yule(娱乐),tiyu(体育)junshi(军事),keji(科技),caijing(财经),shishang(时尚) |
>返回参数说明:
| 名称 | 类型 | 说明 |
| :------------- | :--- | :--- |
| 见JSON返回示例 | - | - |
JSON返回示例:
{
"reason": "成功的返回",
"result": {
"stat": "1",
"data": [
{
"uniquekey": "6c4caa0c3ba6e05e2a272892af43c00e",
"title": "杨幂的发际线再也回不去了么?网友吐槽像半秃",
"date": "2017-01-05 11:03",
"category": "yule",
"author_name": "腾讯娱乐",
"url": "http://mini.eastday.com/mobile/170105110355287.html?qid=juheshuju",
"thumbnail_pic_s": "http://03.imgmini.eastday.com/mobile/20170105/20170105110355_ 806f4ed3fe71d04fa452783d6736a02b_1_mwpm_03200403.jpeg",
"thumbnail_pic_s02": "http://03.imgmini.eastday.com/mobile/20170105/20170105110355_ 806f4ed3fe71d04fa452783d6736a02b_2_mwpm_03200403.jpeg",
"thumbnail_pic_s03": "http://03.imgmini.eastday.com/mobile/20170105/20170105110355_ 806f4ed3fe71d04fa452783d6736a02b_3_mwpm_03200403.jpeg"
},
]
}
}
postman接口调试工具的使用
[postman](https://www.getpostman.com/downloads/)
用户在开发或者调试网络程序或者是网页B/S模式的程序的时候是需要一些方法来跟踪网页请求的,用户可以使用一些网络的监视工具比如著名的Firebug等网页调试工具。
1 先写一个获取用户信息的接口
复制routes文件夹为api文件夹,只保留user.js
api
-> user.js
修改api/user.js文件
> 前后端分离 res.send()
> 前后端不分离 res.render()
var express = require('express');
var router = express.Router();
const sql = require('./../sql');
const User = require('./../sql/model/users');
router.get('/', function(req, res, next) {
sql.find(User, {}, {_id: 0, __v: 0}, (data) => {
res.send(data)
})
});
// 查找某个用户的信息
router.post('/detail', function(req, res, next) {
sql.find(User, { tel: req.body.tel }, {_id: 0, __v: 0}, (data) => {
res.send(data)
})
});
module.exports = router;
app.js处引入并且注册接口
var apiuserRouter = require('./api/user');
app.use('/api/user', apiuserRouter);
以后就可以通过 /api/user访问api文件夹下的user.js所对应的接口
http://localhost:3000/api/user
2 postman测试接口
3 前端通过ajax调用接口
$.ajax({
url: 'http://localhost:3000/api/user',
success: function (data) {
console.log(data)
}
})
此时发现跨域问题
a) **jsonp 解决跨域问题**
后端代码
router.get('/', function(req, res, next) {
// 这一步JSONP必备
var _callback = req.query.callback;
sql.find(User, {}, {_id: 0, __v: 0}, (data) => {
// res.send(data)
if (_callback){
// 这两步设置发送也是NODE.JS发送JSONP必备
res.type('text/javascript');
res.send(_callback + '(' + JSON.stringify(data) + ')');
}
else{
res.json(data);
}
})
});
前端代码
```
$.ajax({
url: 'http://localhost:3000/api/user',
dataType: 'jsonp', // ***************
success: function (data) {
console.log(data)
}
})
b) **cors解决跨域问题**
app.js中加入如下代码
var allowCrossDomain = function (req, res, next) {
res.header('Access-Control-Allow-Origin', '*');//自定义中间件,设置跨域需要的响应头。
next();
};
app.use(allowCrossDomain) ////运用跨域的中间件
c) **利用 http-proxy-middleware 实现代理跨域** --- 服务器与服务器之间
假设有一个服务器http://localhost:4000/users,现在需要在服务器为http://localhost:3000的接口中访问,可以使用http-proxy-middleware进行反向代理
var proxy = require('http-proxy-middleware');
const proxyOption = {
target: 'http://localhost:4000',
pathRewrite: {
'^/api/' : '/' // 重写请求,api/解析为/
},
changeOrigoin:true
};
// 反向代理
app.use('/api/*', proxy(proxyOption));
这样就可以直接通过http://localhost:3000/api/users访问到http://localhost:4000/users接口了
如有错误请留言指出!