@Dale-Lin
2019-05-31T06:00:49.000000Z
字数 1756
阅读 945
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')})breakcase '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)breakcase 'DELETE':const path = url.parse(req.url).pathname// pathname 有 '/' 开头const idx = parseInt(path.slice(1), 10)if (isNaN(idx)) {res.statusCode = 400res.end('Invalid item id')} else if (!item[idx - 1]) {res.statusCode = 404res.end('Item not found')} else {items.splice(i - 1, 1)res.end('Deleted\n')}breakcase 'PUT':const path = url.parse(req.url).pathnameconst idx = parseInt(path.slice(1), 10)if (isNaN(idx)) {res.statusCode = 400res.end('Invalid item id')} else if (!item[idx - 1]) {res.statusCode = 404res.end('Item not found')} else {let body = ''req.setEncoding('utf8')req.on('data', (chunk) => {body += chunk})req.on('end', () => {items[idx - 1] = bodyres.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()