[关闭]
@Dale-Lin 2019-05-31T14:00:49.000000Z 字数 1756 阅读 664

构建 RESTful Web 服务

Node.js


创建标准的 REST 服务器需要实现 4 个请求方法:

例子:创建一个待办事项清单

处理请求

在 Node 中,可以通过检查 req.method 属性查看用的是哪个 HTTP 方法,从而执行相应的任务:

  1. const http = require('http')
  2. const url = require('url')
  3. const items = []
  4. const server = http.createServer((req, res) => {
  5. switch (req.method) {
  6. case 'POST':
  7. let body = ''
  8. req.setEncoding('utf8')
  9. req.on('data', (chunk) => {
  10. body += chunk
  11. })
  12. req.on('end', () => {
  13. items.push(body)
  14. res.end('OK\n')
  15. })
  16. break
  17. case 'GET':
  18. body = items.map((item, idx) => `${i+1}. ${item}`).join('\n')
  19. // 字节长度
  20. res.setHeader('Content-Length', Buffer.byteLength(body)
  21. res.setHeader('Content-Type', 'text/plain; charset="utf-8"')
  22. res.end(body)
  23. break
  24. case 'DELETE':
  25. const path = url.parse(req.url).pathname
  26. // pathname 有 '/' 开头
  27. const idx = parseInt(path.slice(1), 10)
  28. if (isNaN(idx)) {
  29. res.statusCode = 400
  30. res.end('Invalid item id')
  31. } else if (!item[idx - 1]) {
  32. res.statusCode = 404
  33. res.end('Item not found')
  34. } else {
  35. items.splice(i - 1, 1)
  36. res.end('Deleted\n')
  37. }
  38. break
  39. case 'PUT':
  40. const path = url.parse(req.url).pathname
  41. const idx = parseInt(path.slice(1), 10)
  42. if (isNaN(idx)) {
  43. res.statusCode = 400
  44. res.end('Invalid item id')
  45. } else if (!item[idx - 1]) {
  46. res.statusCode = 404
  47. res.end('Item not found')
  48. } else {
  49. let body = ''
  50. req.setEncoding('utf8')
  51. req.on('data', (chunk) => {
  52. body += chunk
  53. })
  54. req.on('end', () => {
  55. items[idx - 1] = body
  56. res.end('Changed\n')
  57. })
  58. }
  59. break
  60. }
  61. })
  62. server.listen(8888)

默认情况下,data 事件会提供 Buffer 对象。
对于文本对象最好将流编码设置为 utf8,这样 data 事件提供的是字符串。

用 POST 请求创建资源

  1. const body = '学习 Node'
  2. const options = {
  3. hostname: 'localhost',
  4. port: 8888,
  5. path: '/',
  6. method: 'POST',
  7. headers
  8. }
  9. const req = http.request(options, (res) => {
  10. console.log(`状态码: ${res.statusCode}`)
  11. console.log(`响应头:${JSON.stringify(res.headers)}`)
  12. res.setEncoding('utf8')
  13. res.on('data', (chunk) => {
  14. console.log(`响应主体:${chunk}`)
  15. })
  16. res.on('end', () => {
  17. console.log('响应结束')
  18. })
  19. })
  20. // 添加错误捕获,DNS/TCP/HTTP 解析错误等
  21. req.on('error', e => {
  22. console.error(`请求遇到问题:${e.message}`)
  23. })
  24. // 写入请求
  25. req.write(body)
  26. req.end()
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注