web-dev-qa-db-ja.com

null応答は204を返します

GETリクエストを実行してもコントローラーが204を返し、データが見つかりません。

[Route("user/v1/[controller]")]
public class UserLoginController : Controller
{
    [HttpGet]
    public async Task<UserLogin> Get(int userId)
    {
        var userLoginLogic = new UserLoginLogic();

        return await userLoginLogic.GetUserLogin(userId);
    }
}

これはGETリクエストの場合のみで、POST、PUT、DELETEは200空の応答を返します。これは、200応答に対して定義された応答を持つ私のswagger定義を混乱させます。

このコントローラーからHTMLを提供していれば、204で問題ありませんが、REST APIの場合です。

200を返すにはどうすればよいですか?

8
Cale

V2.1 +の新しい_ActionResult<T>_を使用すると、リファクタリングして、コントローラにOk()ヘルパーメソッドを使用してOk 200を返すように指示することもできます。

_[Route("user/v1/[controller]")]
public class UserLoginController : Controller {
    [HttpGet]
    public async Task<ActionResult<UserLogin>> Get(int userId) {
        var userLoginLogic = new UserLoginLogic();
        var model = await userLoginLogic.GetUserLogin(userId);
        return Ok(model);
    }
}
_

ただし、実際に返すコンテンツがない場合、これは誤解を招く可能性があります。適切な応答ステータスの使用を検討してください

_[Route("user/v1/[controller]")]
public class UserLoginController : Controller {
    [HttpGet]
    public async Task<ActionResult<UserLogin>> Get(int userId) {
        var userLoginLogic = new UserLoginLogic();
        var model = await userLoginLogic.GetUserLogin(userId);
        if(model == null) return NotFound(); //404
        return Ok(model); //200
    }
}
_

200を返すことを意図している場合Okを使用 ControllerBase.Ok() メソッド

空のStatus200OK応答を生成するOkResultオブジェクトを作成します。

_[Route("user/v1/[controller]")]
public class UserLoginController : Controller {
    [HttpGet]
    public async Task<ActionResult<UserLogin>> Get(int userId) {
        var userLoginLogic = new UserLoginLogic();
        var model = await userLoginLogic.GetUserLogin(userId);
        if(model == null) return Ok(); //200 with no content
        return Ok(model); //200
    }
}
_

リファレンス ASP.NET Core Web APIのコントローラーアクションの戻り値の型:

8
Nkosi

見る:


services.AddControllers(opt =>  // or AddMvc()
{
    // remove formatter that turns nulls into 204 - No Content responses
    // this formatter breaks Angular's Http response JSON parsing
    opt.OutputFormatters.RemoveType<HttpNoContentOutputFormatter>();
})
0
McKabue