接口

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接口了

 

如有错误请留言指出!

posted on 2019-10-19 17:53  s-cream  阅读(220)  评论(0编辑  收藏  举报

导航