收录了这篇文章
什么是动词覆盖
我最初遇到不支持全部 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
声明:本站所有文章和图片,如无特殊说明,均为原创发布。商业转载请联系作者获得授权,非商业转载请注明出处。