- 前端:ASP.NET MVC
- 后端:.NET WebAPI
在系統(tǒng)中萧锉,老是有客戶抱怨珊随,某某地方修改不了啊述寡、某某記錄刪不掉啊、……
經(jīng)過(guò) N 次測(cè)試叶洞,發(fā)現(xiàn)問(wèn)題主要集中在 Restful 的 PUT 或 DELETE 請(qǐng)求的時(shí)候鲫凶。
但是 Chrome 貌似全部功能都是可用的,看來(lái)衩辟,是瀏覽器支持的問(wèn)題螟炫,簡(jiǎn)單記錄一下解決方法吧,懶得去統(tǒng)計(jì)哪些瀏覽器不支持了艺晴。
先說(shuō)一句昼钻,如果是 Java 的童鞋,如果使用的是 SpringMVC封寞,那恭喜你了然评,該框架已經(jīng)帶了該兼容方法的支持了,具體的狈究,可以自行百度碗淌,也可以看這里。
方案:客戶端統(tǒng)一 POST 提交抖锥,API 端重寫 HTTP Method
首先亿眠,繼承 DelegatingHandler
,重寫方法磅废,代碼如下:
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
namespace Test.Web
{
/// <summary>
/// 兼容不支持 PUT/DELETE 方法的瀏覽器
/// </summary>
public class TestHTTPHandler : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
IEnumerable<string> methods;
// 在 ajax 的 header 中添加 _method 標(biāo)記纳像,標(biāo)明真實(shí)的請(qǐng)求方法
// 如果沒(méi)有該標(biāo)記或?yàn)榭眨褪褂迷镜恼?qǐng)求方法
if (request.Headers.TryGetValues("_method", out methods))
{
var method = methods.First();
if (!string.IsNullOrWhiteSpace(method))
{
request.Method = new HttpMethod(method);
}
}
return base.SendAsync(request, cancellationToken);
}
}
}
然后拯勉,在 Global.asax 中竟趾,注冊(cè)該方法,代碼如下:
// …… 其它 using
using System.Web.Http;
void Application_Start(object sender, EventArgs e)
{
// …… 其它代碼 ……
// 兼容不支持 PUT/DELETE 方法的瀏覽器
GlobalConfiguration.Configuration.MessageHandlers.Add(new TestHTTPHandler());
}
最后谜喊,在 Javascript 中潭兽,發(fā)送 ajax 請(qǐng)求如下(以 jQuery 為例):
// POST 請(qǐng)求
$.post('http://api.xxxx.com/xxxx', data, function (result) {
// 業(yè)務(wù)處理邏輯
});
// PUT 請(qǐng)求
$.ajax({
url: 'http://api.xxxx.com/xxxx',
type: 'POST', // 統(tǒng)一 POST 請(qǐng)求
headers: { _method: 'PUT' }, // 標(biāo)明真實(shí)的 PUT 方法
data: data,
success: function (result) {
// 業(yè)務(wù)處理邏輯
}
});
// DELETE 請(qǐng)求
$.ajax({
url: 'http://api.xxxx.com/xxxx/{id}',
type: 'POST', // 統(tǒng)一 POST 請(qǐng)求
headers: { _method: 'DELETE' }, // 標(biāo)明真實(shí)的 DELETE 方法
success: function (result) {
// 業(yè)務(wù)處理邏輯
}
});
至此,全部功能實(shí)現(xiàn)完畢斗遏。