Express 使用 method-override 处理动词覆盖
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

声明:本站所有文章和图片,如无特殊说明,均为原创发布。商业转载请联系作者获得授权,非商业转载请注明出处。
随机推荐
JavaScript 私有方法和私有属性
Express.js CSRF 安全防护
Nginx 通过日志统计访问数据
HTML 对话框元素 dialog
Node.js url 模块
Node.js 安装第三方模块
WordPress 设置菜单
JavaScript 检查 Date 是否为 Invalid Date