在REST Web API调用中返回复杂对象

时间:2014-05-27 21:00:30

标签: asp.net-mvc rest asp.net-web-api

我有一个Web API POST方法,它将自定义复杂对象MyObjectRequest作为参数排除,并返回自定义复杂对象MyObjectResponseMyObjectResponse对象具有自定义复杂对象Token作为属性。

public class MyObjectRequest
{
   public string AppName { get; set; }
   public string Username { get; set; }
   public string Password { get; set; }
   public string AppIdentifier { get; set; }
}

public class MyObjectResponse
{
   public bool Authenticated { get; set; }
   public Token AccessToken { get; set; }
}

public class Token
{
   public string Id { get; set; }
   public string ExpirationDate { get; set; }
}

我有Web API控制器,当用户进行HTTP POST调用时,我想返回MyObjectResponse

public class MyCustomController : Controller
{
    public MyObjectResponse Post([FromBody] MyObjectRequest request)
    {
        //do my work here
    }
}

这是制作MyCustomController API签名的正确方法吗?

2 个答案:

答案 0 :(得分:11)

你有什么可以工作的。我倾向于将这些对象包装在HttpResponseMessage中,如下所示:

[HttpPost]
public HttpResponseMessage Post([FromBody] MyObjectRequest request)
{
    if (ModelState.IsValid) // and if you have any other checks
    {
        var myObjectResponse = new MyObjectResponse(); 
        // In your case, this will be result of some service method. Then...

        return Request.CreateResponse(HttpStatusCode.Created, myObjectResponse);
    }
    return Request.CreateResponse(HttpStatusCode.BadRequest);       
}

[HttpPut]
public HttpResponseMessage Update([FromBody] UserModel userModel)
{
    if (ModelState.IsValid)
    {
        var myObjectResponse = new MyObjectResponse();
        // In your case, this will be result of some service method. Then...
        return Request.CreateResponse(HttpStatusCode.Accepted);
    }
    return Request.CreateResponse(HttpStatusCode.BadRequest);
}

[HttpGet]
public HttpResponseMessage Get(int id)
{
    var myObjectResponse = GetObjectFromDb(id);
    // In your case, this will be result of some service method. Then...
    if(myObjectResponse == null)
        return Request.CreateResponse(HttpStatusCode.NotFound);

    return Request.CreateResponse(HttpStatusCode.OK, myObjectResponse);            
}

这样客户端只需查看状态代码并决定如何处理响应,而无需实际尝试反序列化它。您可以在this MSDN article获取有关HttpStatusCodes的更多信息。

他们在WebApi2中添加了更多方法,例如ApiController.Ok。有关详细信息,您可以查看此ASP.NET WEB API overview page

答案 1 :(得分:0)

是的,作为api签名,这完全没问题