2017-04-10 52 views
0

我想爲我的vb.net遊戲使用.NET Web API 2控制器。API控制器Post方法返回類型/值

我在項目中添加了一個,並根據說明更新了我的Global.axax.vb & Application_Start方法。

現在我只是想弄清楚它是如何工作的。

但我不知道該返回什麼或如何使用我的Controller方法返回。

這是我的測試AJAX方法:

<script> 
    $("#btnUpdate").click(function(e) { 

     var Data = {}; 
     Data.test1 = "testVal1"; 
     Data.test2 = "testVal2"; 

     $.ajax({ 
      url: 'api/GameData', 
      method: 'POST', 
      dataType: 'json', 
      contentType: 'application/json; charset=utf-8', 
      data: Data, 
      success: function(data) { 
       alert("Saved successfully"); 
      }, 
      fail: function(jqXHR, textStatus) { 
       alert("Request failed: " + textStatus); 
      } 
     }); 
    }); 
</script> 

這是Visual Studio生成我的空PostValue方法:

' POST: api/GameData 
    Public Sub PostValue(<FromBody()> ByVal value As String) 
     'what type of return value? 
    End Sub 

又該這種方法回報?

謝謝!

回答

2

根據情況可以返回下面的一個

  1. 無效 - > HTTP響應將是204

  2. HttpResponseMessage

  3. IHttpActionResult

  4. 序列化回報體http響應200

通常情況下,Http POST api會返回201創建的資源。實施例

Public Function PostValue(<FromBody> value As String) As IHttpActionResult 
    Dim product = New With {Key .Name = "Watch", .Price = 250} 
    return Content(HttpStatusCode.Created, product, new JsonMediaTypeFormatter()) 
End Function 

有關細節將例如

1

讓我們首先評估生成的代碼。您的發佈請求處理程序由名稱PostValue表示。如果不使用任何屬性(如ActionName或AcceptVerbs),則您的方法選擇將基於其命名約定。 PostValue是Post方法,原因很明顯。一個GetValue將是一個Get方法。我更喜歡ActionName屬性來進行更具體的API調用。

' POST: api/GameData 
<ActionName("GameData")> 
Public Sub PostGameData(<FromBody()> ByVal value As String) 
    'what type of return value? 
End Sub 

使用非常基本的路由設置,您現在可以通過帶有POST請求的「api/GameData」訪問此調用。現在我們需要談論檢索這些數據。通常,如果它是Get請求,您將通過URI發送數據。

http://mywebsite.com/home.aspx?give=me&data=now 

的數據在這裏是鍵值對:給=現在我&數據=。

' Get: api/GameData 
<ActionName("GameData")> 
Public Function GetGameData(ByVal test1 As String, Byval test2 as String) 
    'Do something with test1 and test2. 
    'Return 
End Function 

如果你使用你發送它通過請求的主體,你在你的Ajax請求都做上述POST請求。它不會顯示在URL中。

' POST: api/GameData 
<ActionName("GameData")> 
Public Sub PostGameData(ByVal test1 As String, Byval test2 As String) 
    'Do something with test1 and test2 
End Sub 

如果您需要從url以及請求主體中檢索數據,您可以通過在每個參數之前指示要查找數據的位置來執行此操作。

' POST: api/GameData 
<ActionName("GameData")> 
Public Sub PostGameData(<FromURI()> ByVal name As String, <FromBody()> FormData as FormDataCollection) 
    'Do something 
End Sub 

當涉及到Web API和它的數據綁定時,您最終必須瞭解複雜類型和簡單類型之間的區別。更深入的信息可以在這裏找到:https://docs.microsoft.com/en-us/aspnet/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api

您還可以指定一個Web API的模型(對象)來自動綁定,這會讓這個更簡單,但有時這可能太多了。

'Model to bind to 
Public Class MyData 
    Public Property test1 As String 
    Public Property test2 As String 
End Class 

'Caller Method 
'POST: api/GameData 
Public Sub PostValue(<FromBody()> ByVal data As MyData) 
    'data.test1 
    'data.test2 
End Sub 

除非按照Kaushal的回覆所示重寫,否則您的返回響應應該採用傳入請求標頭指定的格式。如果使用JSON並且Web API將自動爲您序列化,您可以發回任何您想要的內容。如果你想找回您的表單數據,就像你會使用Request.Form.Get或Request.Querystring.Get那麼你可以使用

{ "test1" : "Foo", "test2" : "Bar" } 

' POST: api/GameData 
Public Function PostValue(<FromBody()> ByVal value As String) 
    return New MyData() With { .test1 = "Foo", .test2 = "Bar" } 
End Function 

如果指定JSON,這將作爲返回NameValueCollection或FormDataCollection作爲參數模型。

' POST: api/GameData 
Public Sub PostValue(<FromBody()> ByVal value As FormDataCollection) 
    'value.Get("test1") 
    'value.Get("test2") 
    'Do something 
End Sub 

NameValueCollection非常相似。記住如果你想使用FormDataCollection,你需要System.Net.Http.Formatting命名空間參考。另外不要忘記用FormDataCollection檢查一個空值。很多人轉換爲NameValueCollection,因爲它不會僅返回null空字符串。我個人寫了一個名爲Grab的FormDataCollection擴展方法,如果該成員不存在,它將返回一個空字符串。我建議您查看我提供的資源以及Microsoft文檔以獲得更深入的解釋。我希望這些快速示例可以有所用處。如果我的解釋或例子中有任何錯誤,請告訴我!謝謝。