2017-04-10 116 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文档以获得更深入的解释。我希望这些快速示例可以有所用处。如果我的解释或例子中有任何错误,请告诉我!谢谢。