从API重定向

时间:2014-09-20 22:08:27

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

我正在努力学习/扩展我对.NET MVC / REST / API和Web套接字/ SignalR的了解。为此,我正在实施一个聊天应用程序。

我有一个典型的MVC介绍页面,它在表单中获取用户名和电子邮件地址,并将数据提交到RESTFul API,新用户被添加到数据库中。

<form class="form-horizontal" role="form" action="/api/GroopsAPIUsers" method="POST">

在该页面的控制器内部(?)我将用户重定向到一个页面,在那里他们可以选择他们想要输入的房间。

public HttpResponseMessage  Post( GroopsUser userValue)
{
     userValue.ID =  Guid.NewGuid();
     bool results = groopsRepository.AddNewUser(userValue);
     //   return results;

     var response = Request.CreateResponse(HttpStatusCode.Redirect);

      //from http://stackoverflow.com/questions/11324711/redirect-from-asp-net-web-api-post-action

     string fullyQualifiedUrl = Request.RequestUri.GetLeftPart(UriPartial.Authority);
     response.Headers.Location = new Uri (fullyQualifiedUrl + "/home/rooms/?userID=" + userValue.ID);

     return response;

}

但这感觉不对。似乎API应该只进行CRUD操作,并且不应该与用户重定向到哪个页面有任何关系。

这是错误的做法吗? 如果是这样,有人能指出我正确的方向吗? (我不确定我是否正确使用了所有这些条款)

...格雷戈里

2 个答案:

答案 0 :(得分:0)

我明白为什么你觉得这感觉不对。通常,您将以这样的方式设计Web API,它与平台无关,因此它唯一关心的是传入的HTTP请求以及基于这些的操作。当您将请求重定向到另一个URL时,您正在围绕Web浏览器进行设计,从而限制您自己使用该平台。有时这就是你所需要的,有时却不是。 (如果它确实 你需要什么,那么你应该坚持只是常规的Asp.NET MVC,而不是Web Api)

在成功操作之后,通过从控制器返回200状态代码,您可以使应用程序更灵活,而不是现在拥有的内容。这样,由客户端应用程序决定从那里做什么。 (如果您的客户端应用程序是基于浏览器的,那么您可以在此重定向。)

那么您如何使用浏览器应用程序实现这一目标呢?您可能已经猜到了,但答案是Javascript。您可以通过表单向API发出同步POST请求,而不是请求异步,然后等待服务器的响应。然后,您可以根据响应包含的内容采取适当的操作。

一个简单的例子:

<强>控制器

public HttpResponseMessage  Post(GroopsUser userValue)
{
     userValue.ID =  Guid.NewGuid();
     bool results = groopsRepository.AddNewUser(userValue);

     var response = Request.CreateResponse<GroopsUser>(HttpStatusCode.OK, userValue);

     return response;
}

<强>表格

<form class="form-horizontal" id="group-form" onsubmit="return addToGroup()" role="form" action="/api/GroopsAPIUsers" method="POST">

Javascript(jQuery)

<script>
    function addToGroup()
    {
        $.ajax({
                type: "POST",
                url: $('#group-form').attr('action'),
                data: $('#group-form').serialize(),
                dataType: "json",
                success: function(data) {
                    window.location.replace('/home/rooms/?userID=' + data.ID);
                },
                error: function(){
                      alert('error handing here');
                }
            });
        return false;
    }

</script>

如果有什么不清楚,或者我误解了什么,请告诉我!

答案 1 :(得分:0)

这取决于您使用所述API执行的操作。您可以设置一个API来执行纯粹的CRUD操作,或者您可以使您的API变得更加智能,并说它可以提供在客户端上呈现的实际HTML(这是MVC所做的那样),或者您可以更进一步并将其转换为超媒体服务,该服务将定义视图以及系统的状态。然后,前端的任务是简单地渲染API提供的内容。