Express 使用 method-override 处理动词覆盖

本文被收录到:

Node.js 教程

本专题关于 Node.js 基础知识和模块

目录

什么是动词覆盖

我最初遇到不支持全部 HTTP 请求的时候,解决方案是修改 API 路径,比如 DELETE /user/:id 时,我的方案是 POST /user/:id/delete。后来看了阮一峰的《RESTful API 最佳实践实践 》,才明白有动词覆盖这回事儿,感觉动词覆盖确实更优雅,手动狗头。。。

有些客户端只能使用GET和POST这两种方法。服务器必须接受POST模拟其他三个方法(PUT、PATCH、DELETE)。

这时,客户端发出的 HTTP 请求,要加上X-HTTP-Method-Override属性,告诉服务器应该使用哪一个动词,覆盖POST方法。

POST /api/Person/4 HTTP/1.1  
X-HTTP-Method-Override: PUT

上面代码中,X-HTTP-Method-Override指定本次请求的方法是PUT,而不是POST。

 

使用标头覆盖

要使用标头覆盖该方法,请将标头名称指定为methodOverride函数的字符串参数。然后,要进行调用,请向URL发送一个POST请求,并将覆盖的方法作为该标头的值。对于不支持您尝试使用的方法的实现,这种使用标头的方法通常会与XMLHttpRequest结合使用。

var express = require('express')
var methodOverride = require('method-override')
var app = express()
 
// override with the X-HTTP-Method-Override header in the request
app.use(methodOverride('X-HTTP-Method-Override'))

前端请求:

var xhr = new XMLHttpRequest()
xhr.onload = onload
xhr.open('post', '/resource', true)
xhr.setRequestHeader('X-HTTP-Method-Override', 'DELETE')
xhr.send()
 
function onload () {
  alert('got response: ' + this.responseText)
}

 

使用查询值覆盖

要使用查询字符串值覆盖该方法,请将查询字符串键指定为methodOverride函数的字符串参数。然后,要进行调用,请向URL发送POST请求,并将重写的方法作为该查询字符串键的值。当试图支持旧版浏览器但仍使用较新的方法时,这种使用查询值的方法通常会与纯HTML<form>元素结合使用。

var express = require('express')
var methodOverride = require('method-override')
var app = express()
 
// override with POST having ?_method=DELETE
app.use(methodOverride('_method'))

使用HTML<form>进行查询覆盖的示例调用:

<form method="POST" action="/resource?_method=DELETE">
  <button type="submit">Delete resource</button>
</form>

 

模块地址:https://www.npmjs.com/package/method-override

声明:本站所有文章和图片,如无特殊说明,均为原创发布。商业转载请联系作者获得授权,非商业转载请注明出处。
真诚赞赏,手留余香
赞赏
搜神记
777 文章
4 教程
8 项目
随机推荐
MySQL的外键总结
JavaScript 引用类型
JavaScript 事件处理程序
Express 使用 method-override 处理动词覆盖
WordPress 后台添加菜单
Nginx 通过日志统计访问数据
视频剪辑软件 Shotcut 笔记
Debian11 安装笔记3:安装 MySQL 5.7