API 控制器 Post 方法 return type/value
API Controller Post method return type/value
我想为我的 vb.net 游戏使用 .NET Web API 2 控制器。
我在我的项目中添加了一个,并根据说明更新了我的 Global.axax.vb & Application_Start 方法。
现在我只是想弄清楚它是如何工作的。
但我不知道 return 或如何使用我的 Controller 方法return。
这是我的测试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
这个方法应该是什么return?
谢谢!
根据场景,它可以return以下之一
void --> http 响应将为 204
HttpResponseMessage
IHttpActionResult
http 响应 200
的序列化 return 正文
一般情况下,Http POST api return 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
详情将举例
让我们先评估生成的代码。 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 & 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
如果您使用 post 请求,您将通过请求的 body 发送它,就像您在上面的 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 和请求 body 中检索数据,您可以通过在每个参数前指明要查找数据的位置来实现。
' 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 指定一个模型 (object) 以自动绑定到该模型,这会使这变得更简单,但有时这可能太多了。
'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 的响应所示被覆盖,否则您的 return 响应应采用传入请求 headers 指定的格式。如果使用 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 这将 return 为:
{ "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,因为它不 return null 只有空字符串。我个人为 FormDataCollection 编写了一个名为 Grab 的扩展方法,如果成员不存在,它将 return 一个空字符串。我建议您查看我提供的资源以及 Microsoft 文档以获得更多 in-depth 解释。我希望这些快速示例能有所帮助。如果我的解释或示例中有任何错误,请告诉我!谢谢。
我想为我的 vb.net 游戏使用 .NET Web API 2 控制器。
我在我的项目中添加了一个,并根据说明更新了我的 Global.axax.vb & Application_Start 方法。
现在我只是想弄清楚它是如何工作的。
但我不知道 return 或如何使用我的 Controller 方法return。
这是我的测试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
这个方法应该是什么return?
谢谢!
根据场景,它可以return以下之一
void --> http 响应将为 204
HttpResponseMessage
IHttpActionResult
http 响应 200
的序列化 return 正文
一般情况下,Http POST api return 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
详情将举例
让我们先评估生成的代码。 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 & 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
如果您使用 post 请求,您将通过请求的 body 发送它,就像您在上面的 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 和请求 body 中检索数据,您可以通过在每个参数前指明要查找数据的位置来实现。
' 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 指定一个模型 (object) 以自动绑定到该模型,这会使这变得更简单,但有时这可能太多了。
'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 的响应所示被覆盖,否则您的 return 响应应采用传入请求 headers 指定的格式。如果使用 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 这将 return 为:
{ "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,因为它不 return null 只有空字符串。我个人为 FormDataCollection 编写了一个名为 Grab 的扩展方法,如果成员不存在,它将 return 一个空字符串。我建议您查看我提供的资源以及 Microsoft 文档以获得更多 in-depth 解释。我希望这些快速示例能有所帮助。如果我的解释或示例中有任何错误,请告诉我!谢谢。