多平台统一管理软件接口,如何实现多平台统一管理软件接口
256
2023-01-27
用Node编写RESTful API接口的示例代码
前言
本文介绍了如何用Node开发web程序,并通过一个todo list练习来介绍如何创建符合RESTful风格的API接口。
创建HTTP服务器
用Node创建HTTP服务器是非常方便的。
创建HTTP服务器要调用http.createServer()函数,它只有一个参数,是个回调函数,服务器每次收到HTTP请求后都会调用这个回调函数。这个回调会收到两个参数,请求和响应对象,通常简写为req和res:
var http = require('http')
var server = http.createServer(function(req, res){
res.end('Hello World')
})
server.listen(3000, '127.0.0.1')
运行上面的代码,在浏览器中访问http://localhost:3000。然后你应该能看到一个包含“Hello World.”的普通文本页面。
服务器每收到一条HTTP请求,都会用新的req和res对象触发回调函数。
在触发回调函数之前,Node会解析请求的HTTP头,并将它们作为req对象的一部分提供给请求回调。但Node不会在回调函数被触发之前开始对请求体PajFRb的解析。这种做法跟某些服务端框架不同,比如php就是在程序逻辑运行前就把请求头和请求体都解析出来了。
Node不会自动往客户端写任何响应。在调用完请求回调函数之后,就要由你负责用res.end()方法结束响应了(见下图)。这样在结束响应之前,你可以在请求的生命期内运行任何你想运行的异步逻辑。如果你没能结束响应,http://请求会挂起,直到客户端超时,或者它会一直处于打开状态。
搭建HTTP服务器仅仅是个开始。接下来我们来看看如何设定响应状态码和响应头中的字段,如何正确处理异常。
设置响应头
可以用res.setHeader(field, value)来设置相应的响应头,下面是代码:
var http = require('http')
var server = http.createServer(function(req, res){
var body = '
res.setHeader('Content-Length', body.length)
res.setHeader('Content-Type', 'text/html')
res.end(body)
})
server.listen(3000)
设置状态码
我们经常需要返回默认状态码200之外的HTTP状态码。比较常见的情况是当所请求的资源不存在时返回一个404 Not Found状态码。
这可以通过设定res.statusCode属性来实现。在程序响应期间可以随时给这个属性赋值,但必须在第一次调用res.write()或res.end()之前。
var http = require('http')
var server = http.createServer(function(req, res) {
var body = '
页面丢失了
res.setHeader('Content-Type', 'text/html;charset=utf-8')
res.statusCode = 404
res.end(body)
})
server.listen(3000, '127.0.0.1')
Node的策略是提供小而强的网络API,不同于Rails或Django之类的框架。像会话这种高级概念以及HTTP cookies这样的基础组件都没有包括在Node的内核之中。那些都要由第三方模块提供。
构建 RESTful Web 服务
Roy Fielding博士在2000年提出了表征状态转移 (REST)。它是一种基于 HTTP 协议的网络应用的接口风格。
依照规定,比如GET、POST、PUT和DELETE,分别与资源的获取、创建、更新和删除相对应。
HTTP 协议定义了以下8种标准的方法:
GET:请求获取指定资源。
HEAD:请求指定资源的响应头。
POST:向指定资源提交数据。
PUT:请求服务器存储一个资源。
DELETE:请求服务器删除指定资源。
TRACE:回显服务器收到的请求,主要用于测试或诊断。
CONNECT:HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS:返回服务器支持的HTTP请求方法。
创建标准的REST服务需要实现四个HTTP谓词。每个谓词会覆盖一个http://操作:
GET:获取
POST:新增
PUT:更新
DELETE:删除
POST和GET请求
接下来,通过一个todo list练习来编写RESTful风格的GET和POST接口。
需求分析
项目采用前后端分离,交互数据格式约定为json,前端添加的数据提交到服务器后,由服务器存入服务器内存中。前端界面如下:
首先,我们先编写前端部分。
前端部分
前端采用vue.js作为框架,ajax请求采用axios库。代码如下:
new Vue({
el: '#app',
data: {
items: [],
item: ''
},
created () {
axios.get('http://localhost:3000/')
.then(response => {
this.items = response.data
})
.catch(function (error) {
console.log(error)
})
},
methods: {
postApi () {
axios.post('http://localhost:3000/', {
item: this.item
})
.then(response => {
this.items = response.data
})
.catch(function (error) {
console.log(error)
})
}
}
})
后端部分
var http = require('http')
var items = []
http.createServer(function(req, res) {
// 设置cors跨域
res.setHeader('Access-Control-Allow-Origin', '*')
res.setHeader('Access-Control-Allow-Headers', 'Content-Type')
res.setHeader('Content-Type', 'application/json')
switch (req.method) {
// 设置了cors跨域
// post请求时,浏览器会先发一次options请求,如果请求通过,则继续发送正式的post请求
case 'OPTIONS':
res.statusCode = 200
res.end()
break
case 'GET':
let data = JSON.stringify(items)
res.write(data)
res.end()
break
case 'POST':
let item = ''
req.on('data', function (chunk) {
item += chunk
})
req.on('end', function () {
// 存入
item = JSON.parse(item)
items.push(item.item)
// 返回到客户端
let data = JSON.stringify(items)
res.write(data)
res.end()
})
break
}
}).listen(3000)
console.log('http server is start...')
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~