API Controller Post方法返回类型/值

时间:2017-04-10 13:41:04

标签: ajax asp.net-web-api2 .net-4.5 asp.net-apicontroller

我想在我的vb.net游戏中使用.NET Web API 2控制器。

我在我的项目中添加了一个,并更新了我的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 个答案:

答案 0 :(得分:3)

根据情况,它可以返回以下其中一项

  1. void - &gt; http响应将是204

  2. HttpResponseMessage

  3. IHttpActionResult

  4. http响应200的序列化返回正文

  5. 通常,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 :(得分:1)

让我们先评估生成的代码。 post请求的处理程序由名称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

通过非常基本的路由设置,您现在可以通过“api / GameData”通过POST请求访问此呼叫。现在我们需要谈谈检索这些数据。通常,如果它是Get请求,您将通过URI发送数据。

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

这里的数据是键值对:give = me&amp;数据=现在

' 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请求中所做的那样。它不会显示在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

如果您需要从网址和请求正文中检索数据,您可以通过在每个要找到数据的参数之前指示来执行此操作。

' 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会自动为您序列化。

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

如果指定JSON,则返回为:

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

如果您希望检索表单数据,就像使用Request.Form.Get或Request.Querystring.Get一样,那么您可以使用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空字符串。我个人为FormDataCollection写了一个名为Grab的扩展方法,如果该成员不存在,它将返回一个空字符串。我建议您查看我提供的资源以及Microsoft文档,以获得更深入的解释。我希望这些简单的例子可以有所帮助。如果我的解释或示例中有任何错误,请告诉我!谢谢。