@Dale-Lin
2019-05-31T14:00:49.000000Z
字数 1756
阅读 664
Node.js
创建标准的 REST 服务器需要实现 4 个请求方法:
在 Node 中,可以通过检查 req.method
属性查看用的是哪个 HTTP 方法,从而执行相应的任务:
const http = require('http')
const url = require('url')
const items = []
const server = http.createServer((req, res) => {
switch (req.method) {
case 'POST':
let body = ''
req.setEncoding('utf8')
req.on('data', (chunk) => {
body += chunk
})
req.on('end', () => {
items.push(body)
res.end('OK\n')
})
break
case 'GET':
body = items.map((item, idx) => `${i+1}. ${item}`).join('\n')
// 字节长度
res.setHeader('Content-Length', Buffer.byteLength(body)
res.setHeader('Content-Type', 'text/plain; charset="utf-8"')
res.end(body)
break
case 'DELETE':
const path = url.parse(req.url).pathname
// pathname 有 '/' 开头
const idx = parseInt(path.slice(1), 10)
if (isNaN(idx)) {
res.statusCode = 400
res.end('Invalid item id')
} else if (!item[idx - 1]) {
res.statusCode = 404
res.end('Item not found')
} else {
items.splice(i - 1, 1)
res.end('Deleted\n')
}
break
case 'PUT':
const path = url.parse(req.url).pathname
const idx = parseInt(path.slice(1), 10)
if (isNaN(idx)) {
res.statusCode = 400
res.end('Invalid item id')
} else if (!item[idx - 1]) {
res.statusCode = 404
res.end('Item not found')
} else {
let body = ''
req.setEncoding('utf8')
req.on('data', (chunk) => {
body += chunk
})
req.on('end', () => {
items[idx - 1] = body
res.end('Changed\n')
})
}
break
}
})
server.listen(8888)
默认情况下,data 事件会提供 Buffer 对象。
对于文本对象最好将流编码设置为utf8
,这样 data 事件提供的是字符串。
const body = '学习 Node'
const options = {
hostname: 'localhost',
port: 8888,
path: '/',
method: 'POST',
headers
}
const req = http.request(options, (res) => {
console.log(`状态码: ${res.statusCode}`)
console.log(`响应头:${JSON.stringify(res.headers)}`)
res.setEncoding('utf8')
res.on('data', (chunk) => {
console.log(`响应主体:${chunk}`)
})
res.on('end', () => {
console.log('响应结束')
})
})
// 添加错误捕获,DNS/TCP/HTTP 解析错误等
req.on('error', e => {
console.error(`请求遇到问题:${e.message}`)
})
// 写入请求
req.write(body)
req.end()