讓Asp.net 的Restful Web API可以接收x-www-form-urlencoded格式的request

遇到的問題

在xxxController類別(繼承ApiController)中有一個Post method的API,
1. 使用Postman搭配json格式post資料時,該web API可以被正常觸發、解析Request內容。
2. 使用Postman搭配x-www-form-urlencoded格式post資料時,該web API可以被正常觸發、但無法正常解析Request內容。
3. 使用HTML Form submit資料,該web API可以被正常觸發、但無法正常解析Request內容。

確認HTML Form submit的content-Type格式

使用Fiddler取得本機HTML Form submit到該URL的request內容,確認其 content-Type是x-www-form-urlencoded格式。

解決方法

方法一:Client端的Form調整Request的格式為Json

尚未確認如何實現。友人提及可採用AJAX的方式送出Request,其好處為收到Response時不會和Form一樣有轉頁的動作。

方法二:Server端的API調整為相容格式為x-www-form-urlencoded的Request

在Client端不調整程式的情況下,Server端的API可以進行如下的調整,以正常解析 content-Type為x-www-form-urlencoded或Json的Request。

public void Post(HttpRequestMessage request)
{
switch (request.Content.Headers.ContentType.MediaType)
{
case "application/x-www-form-urlencoded":
var form = request.Content.ReadAsFormDataAsync().Result;
string[] Service = form.GetValues("Service");
serviceInfo = new ServiceInfo()
{
Service = Service != null ? form.GetValues("Service").FirstOrDefault() : string.Empty,
};
break;

case "application/json":
var json = request.Content.ReadAsStringAsync().Result;
serviceInfo = new JavaScriptSerializer().Deserialize<ServiceInfo>(json.ToString());
break;

default:
throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
}

參考資料

  1. Web API Routing by Content-Type
廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s