【问题标题】:API Controller Post method return type/valueAPI 控制器 Post 方法返回类型/值
【发布时间】:2017-09-05 14:18:02
【问题描述】:

我想为我的 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

这个方法应该返回什么?

谢谢!

【问题讨论】:

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


    【解决方案1】:

    根据场景,它可以返回以下之一

    1. void --> http 响应为 204

    2. HttpResponseMessage

    3. IHttpActionResult

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

    一般情况下,Http POST api 返回 201 created with resource created。示例

    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
    

    详细示例

    【讨论】:

      【解决方案2】:

      让我们首先评估生成的代码。 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
      

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

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

      这里的数据是键值对: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 请求中所做的那样。它不会显示在 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 会自动为您序列化,您可以发回任何您想要的东西。

      ' 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 文档以获得更深入的解释。我希望这些简单的例子能有所帮助。如果我的解释或示例中有任何错误,请告诉我!谢谢。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多