C#でレスポンスをJSONで返すAPIを作っていたのですが、認証エラーの場合「401(Unauthorized)」を返さなければならず、調べてもパッと解決策が出なかったので、ここにメモしておきます。
作成するAPIのコントローラー
テスト用として作成したコントローラーは以下の形
public class UpdateMemberController : ApiController
{
public IHttpActionResult Post(MemberRequestModel param)
{
// 更新処理をする
var response = new MemberResponseModel() { Message = "更新完了" };
return Json(response);
}
}
public class MemberResponseModel
{
public string Message { get; set; }
}
正常応答の場合、Jsonの形でレスポンスを返すようにしています
とりあえず401(Unauthorized)を返すなら
とりあえず「401(Unauthorized)」を返すだけいいならば、「Unauthorized()」を使えば一発です
public class UpdateMemberController : ApiController
{
public IHttpActionResult Post(MemberRequestModel param)
{
// 認証処理
if(認証エラー)
{
return Unauthorized();
}
var response = new MemberResponseModel() { Message = "更新完了" };
return Json(response);
}
}
public class MemberResponseModel
{
public string Message { get; set; }
}
これで認証エラーの場合はStatusを「401(Unauthorized)」で返すことができます
オブジェクトも一緒に返したい場合
上記の方法だとオブジェクトは何も返すことができません
独自でエラーステータスやメッセージを返したい場合は別の方法が必要になります
public class UpdateMemberController : ApiController
{
public IHttpActionResult Post(MemberRequestModel param)
{
var response = Models.MemberResponseModel();
// 認証処理
if(認証エラー)
{
response.Message = "認証エラーです。";
return Content(HttpStatusCode.Unauthorized, JObject.FromObject(response));
}
response.Message = "更新完了";
return Json(response);
}
}
public class MemberResponseModel
{
public string Message { get; set; }
}
このような形でContentメソッドとJObject.FromObjectを使えば、「401(Unauthorized)」と一緒に独自で定義したオブジェクトをJsonの形で返すことができます
まとめ
Jsonオブジェクトを含めた形で「401(Unauthorized)」を返すことができたのでとりあえず個人的には問題解決
別の方法も考える余裕があれば追加します
コメント