asp.net-mvc - 从 API 重定向

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

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

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

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

在该页面的 Controller 内部(?)我将用户重定向到一个页面,他们可以在其中选择他们想要进入的房间。

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 操作,不应该与用户重定向到的页面有任何关系。

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

...格雷戈里

最佳答案

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

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

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

一个简单的例子:

Controller

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>

如果有任何不清楚的地方,或者我弄错了什么,请告诉我!

关于asp.net-mvc - 从 API 重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25953768/

相关文章:

c# - 将 Web API 用于 Windows 服务以通过轮询接收命令和执行任务?

php - 如何覆盖默认的 Yii2 - Filsh Oauth 服务器响应

delphi - 在 Delphi XE2 中使用 PayPal REST 客户端

javascript - Http Get- 从 Web api 获取对象

asp.net-mvc - 为什么ViewBag是空的?

asp.net-mvc - Entity Framework 和asp.net mvc

c# - 带有 C# 代码的 html 表单

java - 用于删除用户/参与者的 JIRA Rest API DELETE 调用不会删除用户

asp.net-mvc - 使用 HttpSelfHostServer 和 IDependencyResolver 时为 "Inheritance security rules violated"

c# - WebApi 2 身份验证和 ASP.NET MVC 5 应用程序