2014-09-20 29 views
0

我想學習/擴展我的.NET MVC/REST/API和Web-sockets/SignalR的知識。爲此,我正在實施一個聊天應用程序。重定向從API

我有一個典型的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

我也是新來的API。到目前爲止,我從來沒有將API中的東西重定向到真正的應用程序。應用程序編程接口(API)是暴露給編程模型的門戶,因此您可以增強或擴展某些功能。 – andrefadila 2014-09-21 04:34:46

回答

0

我可以知道你爲什麼不認爲這感覺不錯。通常,您會設計Web API的方式是平臺不可知的,所以它唯一關心的是傳入的HTTP請求以及基於這些請求的操作。當您將請求重定向到另一個URL時,您正在圍繞Web瀏覽器進行設計,從而將自己限制在該平臺上。有時候這就是你需要的,有時候不是。 (如果它確實你所需要的,那麼你或許應該堅持只是普通Asp.NET MVC,而不是網頁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> 

如果有什麼不清楚的地方,或者我誤解了任何事情,請告訴我!

+0

非常酷。感謝您花時間詳細解釋。真的很感激。昨晚我幾乎結束了同樣的結果...雖然你有更多的細節,我會合並(httpstatus和在響應中使用json)。我錯過了什麼,或者你的控制器只返回HttpStatus而不是userId?我結束了 - > var response = Request.CreateResponse (System.Net.HttpStatusCode.Created,roomData); – 2014-09-21 17:27:48

+0

我會upvote你,但顯然我的代表還不夠高。 :) – 2014-09-21 17:34:10

+0

@ mertens3d,你說得對,我忘了發送用戶數據和響應。我會更新我的答案。 :) – Tobias 2014-09-21 17:39:01

0

這取決於你在用這個API做什麼。你可以設置一個API來執行純粹的CRUD操作,或者你可以讓你的API變得更聰明,並且說它提供了在客戶端呈現的實際HTML(這就是MVC所做的),或者你可以更進一步並將其轉換爲超媒體服務,以定義視圖以及系統的狀態。然後,前端的任務就是簡單地渲染您的API提供的內容。

+0

我認爲我現在要採取的方法是讓API只執行CRUD,並讓JavaScript/jQuery負責調用API並顯示返回的數據(如果有的話)。如果我正確地理解了事情,如果我願意,我可以從服務器進行API調用,這只是一個設計選擇。正確?另外,我是否正確地認爲我的MVC應用程序可能是使用API​​的唯一應用程序,並且使用API​​(方法?)只是分離關注的一種方式? – 2014-09-21 17:41:25

+0

我也會喜歡你......但我仍然有一個糟糕的代表。 – 2014-09-21 17:42:42