我正在努力学习/扩展我对.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操作,并且不应该与用户重定向到哪个页面有任何关系。
这是错误的做法吗? 如果是这样,有人能指出我正确的方向吗? (我不确定我是否正确使用了所有这些条款)
...格雷戈里
答案 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提供的内容。