【个人笔记重点,不作为参考】主题:restify搭建模拟RESTful API
来源:互联网 发布:java怎么以分数形式 编辑:程序博客网 时间:2024/05/29 10:10
问题:
本地测试时,端口不同,涉及跨域。控制台提示, No 'Access-Control-Allow-Origin' header is present on the requested resource.
解决办法:(重点为: res.header("Access-Control-Allow-Origin", "*"); /*表示允许任意域*/)
方法1. 所有接口
server.use(
function crossOrigin(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "X-Requested-With");
return next();
});
方法2.某一个接口
server.get('/person', function(req, res){
res.send({user: 'root', password: '123qwe..'});
res.header("Access-Control-Allow-Origin", "*");
console.log('Get request from '+req.method);
});
什么是 RESTful 架构?
具象状态传输(英文:Representational State Transfer,简称REST)是Roy Thomas Fielding博士于2000年在他的博士论文 “Architectural Styles and the Design of Network-based Software Architectures” 中提出来的一种万维网软件架构风格。
目前在三种主流的Web服务实现方案中,因为REST模式与复杂的SOAP和XML-RPC相比更加简洁,越来越多的web服务开始采用REST风格设计和实现。例如,Amazon.com提供接近REST风格的Web服务执行图书查询;雅虎提供的Web服务也是REST风格的。
具体可以阅读 阮一峰 的日志 RESTful API 设计指南 ,或是参考 维基百科
什么是 restify 框架?
restify is a node.js module built specifically to enable you to build correct REST web services. It intentionally borrows heavily from express as that is more or less the de facto API for writing web applications on top of node.js.
restify 是专门帮助你建立正确的 REST Web 服务的 Node.js 模块,它有意地大量借鉴了Express。
安装使用 restify
安装
$ npm install restify
编写基于 REST 的 API
新建一个
app.js
文件$ touch app.js
引入
restify
模块var restify = require('restify');
创建服务
var server = restify.createServer();
配置
restify
的插件123server.use(restify.acceptParser(server.acceptable));server.use(restify.queryParser());server.use(restify.bodyParser());Accept Parser
Parses out the Accept header, and ensures that the server can respond to what the client asked for. You almost always want to just pass in server.acceptable here, as that’s an array of content types the server knows how to respond to (with the formatters you’ve registered). If the request is for a non-handled type, this plugin will return an error of 406.
解析 Accept 头部,确保服务器可以响应客户端的请求。一般来说,你只需要传递
server.acceptable
,这是一个包含所有服务器知道如何响应的内容类型的数组。如果请求一个未知类型,该插件会返回一个406
错误。QueryParser
Parses the HTTP query string (i.e., /foo?id=bar&name=mark). If you use this, the parsed content will always be available in req.query, additionally params are merged into req.params. You can disable by passing in mapParams: false in the options object:
解析 HTTP 传递的查询字符串(如,/foo?id=bar&name=mark )如果你使用这个插件,被处理的内容可以通过
req.query
访问,同时参数会被合并到req.params
中。你可以通过传递参数对象{mapParams: false}
来禁用它。当不传入参数时,请求返回的数据如图:
当传入参数
{mapParams: false}
时,请求返回的数据如图,可以发现,params
中已经不再带有参数:BodyParser
Blocks your chain on reading and parsing the HTTP request body. Switches on
Content-Type
and does the appropriate logic.application/json
,application/x-www-form-urlencoded
andmultipart/form-data
are currently supported.在读取和解析 HTTP 请求 body 的时候,改变
Content-Type
并执行相应的逻辑。支持application/json
,application/x-www-form-urlencoded
和multipart/form-data
类型。Options:
- maxBodySize - The maximum size in bytes allowed in the HTTP body. Useful for limiting clients from hogging server memory.
mapParams
- ifreq.params
should be filled with parsed parameters from HTTP body.mapFiles
- ifreq.params
should be filled with the contents of files sent through a multipart request. formidable is used internally for parsing, and a file is denoted as a multipart part with thefilename
option set in itsContent-Disposition
. This will only be performed ifmapParams
is true.overrideParams
- if an entry inreq.params
should be overwritten by the value in the body if the names are the same. For instance, if you have the route/:someval
, and someone posts anx-www-form-urlencoded
Content-Type with the bodysomeval=happy
to/sad
, the value will behappy
ifoverrideParams
istrue
,sad
otherwise.multipartHandler
- a callback to handle any multipart part which is not a file. If this is omitted, the default handler is invoked which may or may not map the parts intoreq.params
, depending on themapParams
-option.multipartFileHandler
- a callback to handle any multipart file. It will be a file if the part have aContent-Disposition
with thefilename
parameter set. This typically happens when a browser sends a from and there is a parameter similar to<input type="file" />
. If this is not provided, the default behaviour is to map the contents intoreq.params
.keepExtensions
- if you want the uploaded files to include the extensions of the original files (multipart uploads only). Does nothing ifmultipartFileHandler
is defined.uploadDir
- Where uploaded files are intermediately stored during transfer before the contents is mapped intoreq.params
. Does nothing ifmultipartFileHandler
is defined.multiples
- if you want to support html5 multiple attribute in upload fields.hash
- If you want checksums calculated for incoming files, set this to eithersha1
ormd5
.
编写 CRUD API
此处的 CRUD 仅作为演示使用,并不具备任何数据库操作功能
123456789101112131415161718192021//获取所有信息server.get('/person', function(req, res){res.send({message: 'Hello ,from GET!', data: 'All person'});console.log('Get request from '+req.method);})//获取某个person的信息server.get('/person/:id', function(req, res){res.send({message: 'Hello ,from GET!', data: {id: req.params.id}});console.log('Get request from '+req.method+', request id is '+req.params.id);})//修改person信息server.put('/person/:id', function(req, res){res.send({message: 'Hello ,from PUT!', data: {info: req.params, id: req.params.id}});console.log('Get request from '+req.method+', request id is '+req.params.id);})//新增personserver.post('/person', function(req, res){res.send({message: 'Hello ,from post!', data: {id: id++, info: req.params}});console.log('Get request from '+req.method+', new Person\'s info is :'+JSON.stringify(req.params));// console.log(req);})指定端口
server.listen(1234, function() { console.log('%s listening at %s', server.name, server.url);});
简易测试 API 是否可用
测试用的工具是
postman
,具体介绍可以移步至 官网测试
get
请求(不带参数 id)测试
get
请求(带参数 id = 2)测试
put
请求测试
post
请求
后语
使用 restify 框架搭建一个 RESTful API,比使用原生的 Node.js 搭建要方便,比使用 Express 框架要简单方便。
restify 框架还有很多实用的功能有待大家挖掘。
- 【个人笔记重点,不作为参考】主题:restify搭建模拟RESTful API
- 【个人笔记重点,不作为参考】主题:webpack
- 【个人笔记重点,不作为参考】主题:javascript笔记
- 【个人笔记重点,不作为参考】主题:angular2.0笔记
- 【个人笔记重点,不作为参考】主题:typescript笔记
- 【个人笔记重点,不作为参考】主题:linux小记
- 【个人笔记重点,不作为参考】主题:git杂文
- 【个人笔记重点,不作为参考】主题:docker常用命令
- 【个人笔记重点,不作为参考】主题:javascript垃圾收集
- 【个人笔记重点,不作为参考】主题:web优化
- 【个人笔记重点,不作为参考】主题:js数组
- 【个人笔记重点,不作为参考】主题:面向对象的程序设计
- 【个人笔记重点,不作为参考】主题:跨域通信
- 【个人笔记重点,不作为参考】主题:webpack入门
- 【个人笔记重点,不作为参考】主题:linux 解压 tar.xz
- 【个人笔记重点,不作为参考】主题:承诺与异步编程
- 【个人笔记重点,不作为参考】主题:升级nodejs版本
- 【个人笔记重点,不作为参考】主题:clear code
- 九度1028:继续畅通工程
- 高并发服务器架构笔记(3)——muduo_base 源码分析
- 根据多个索引高效删除python list中对应位置的元素
- pyhton 数据预处理 数据读取与存储 csv
- Struts 2基础入门
- 【个人笔记重点,不作为参考】主题:restify搭建模拟RESTful API
- MySQL数据库知识点总结
- Oracle12C--批量操作(三十四)
- Java接口和Java抽象类的存在价值
- 搜索专题 F
- 安卓开机引导(向导)页面,类似google开机设置引导
- Andrew Ng机器学习公开课01:机器学习动机与应用
- R语言_car_可视化
- set,list,Map,数组的注入