c# WebAPIにajaxでclassをPOSTする(RoutePrefix付き)
c# WebAPIにajaxでclassをPOSTする(RoutePrefix付き)
いつも忘れてしまって何故404?と悩むのでメモ。
まず、WebAPIの引数に渡したいクラスを定義する
適当に。EMail、Nameというプロパティを持ったクラスを用意する。
とりあえず、/Models/Users.csを追加。
using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace WebAPIPostSample.Models { public class User { public string EMail { get; set; } public string Name { get; set; } } }
WebAPIの中身
/Controllers/Api/UsersController.csを追加。
Userを受け取って、何か処理をするという想定。
RoutePrefixを使って、URLにバージョンを埋め込む。
HttpPostを付加しているので、Routeは""になる。
これで
/api/v1/users
にPOSTすると、Postが呼び出される。
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http; using WebAPIPostSample.Models; namespace WebAPIPostSample.Controllers.Api { [RoutePrefix("api/v1/users")] public class UsersController : ApiController { [HttpPost] [Route("")] public void Post([FromBody]User value) { var inputEmail = value.EMail; var inputName = value.Name; /* Do Anything */ } } }
ajaxを使用するview
/Views/Home/Index.cshtml
を編集する。
@{
ViewBag.Title = "Home Page";
}
<div class="row">
<div class="col-md-12">
<h2>Ajax Postサンプル</h2>
<div class="form-group">
<label for="email">Email address:</label>
<input type="email" class="form-control" id="email">
</div>
<div class="form-group">
<label for="name">Name:</label>
<input type="text" class="form-control" id="name">
</div>
<div class="form-group">
<button id="btnDoPost" class="btn btn-primary">送信</button>
</div>
</div>
</div>
@section scripts {
<script type="text/javascript">
$(document).ready(function () {
$("#btnDoPost").on({
click: function () {
var user = { 'EMail': $("#email").val(), 'Name': $("#name").val() };
$.ajax({
type: "post",
contentType: "application/json; charset=utf-8",
url: "/api/v1/users",
data: JSON.stringify(user),
cache: false,
async: true,
});
return false;
},
});
});
</script>
}
ポイント
JSON.stringifyがポイント。
例えば、
data = { EMail: "hoge@fuga.com", "Name": "Hatena太郎" }
なんてしちゃうと、POSTした時に404になってしまうので注意!!