ASP.NET Webapi获取项目列表的方法

时间:2018-01-09 07:07:08

标签: c# asp.net-web-api2

如果我们需要发送项目列表,想要了解处理用例的C#ASP.NET Webapi的方法。

通过Get方法,我们将无法通过JSON发送数据,因为Get不接受HttpBody。提到了以下方法:

  1. 我们可以用逗号分隔发送,但是MVC绑定不会识别它。
  2. 另一种方法是将输入序列化为JSON对象,在服务器端我们需要将JSON对象反序列化为列表
  3. 处理此问题的标准方法是什么?

3 个答案:

答案 0 :(得分:0)

这取决于将发送哪种数据。如果要发送非复杂类型的列表,可以使用GET;

[HttpGet]
public int GetSampleItems(int[] listOfItems)
{
    return listOfItems.Length;
}
example.com/GetSampleItems?listOfItems=1&listOfItems=2&listOfItems=3

如果您要发送复杂类型,则应使用POST代替GET

[HttpPost]
public int GetSampleItems(List<SampleItem> sampleItems)
{
    return sampleItems.Length;
}
public class SampleItem
{
    public string Item { get; set; }
}

输入应该在json格式的请求体内;

[
   {
      "Item":"a"
   },
   {
      "Item":"b"
   },
   {
      "Item":"c"
   }
]

答案 1 :(得分:0)

首先,让我说I.M.O.你应该只使用一个带有身体的帖子,因为我会告诉你的解决方案不是很“好”。

您可以将对象序列化为字符串,将其发送到url中并在API中反序列化。您必须为双方发送的对象提供完全相同的模型。

这是你如何做到的:

前端部分

[HttpGet("{stringName}")]
public Task<IActionResult> MethodName(string stringName)
{
    var object = JsonConvert.Deserialize<ObjectModel>(stringName);
}

WEB API控制器

================ Certificate 0 ================
Serial Number: 039de8
Issuer: E=test-support@test.de, CN=test-CA, OU=testou, O=test GmbH, L=Ber
lin, S=Berlin, C=DE
 NotBefore: 08.01.2018 11:10
 NotAfter: 08.01.2019 11:10
Subject: C=DE, S=Berlin, L=Berlin, OU=Testou, O=test, CN=test-1.test.tc
Non-root Certificate
Template:
Cert Hash(sha1): ea 61 42 ad 80 eb b7 94 b0 fb 90 90 39 ce 44 6e a9 ee f4 1b
  Key Container = {DE49D597-C00C-4433-9619-506FD234FF81}
  Unique container name: 73ab698919e3dcc47cad8c7543f78ff0_ae268432-4b90-4c10-adf
e-8c743fdedffa
  Provider = Microsoft Enhanced Cryptographic Provider v1.0
Private key is NOT exportable
Encryption test passed

================ Certificate 1 ================
Serial Number: 0a4cd4
Issuer: E=test-support@bdr.de, CN=test-CA, OU=testou, O=test GmbH, L=Ber
lin, S=Berlin, C=DE
 NotBefore: 05.01.2018 10:07
 NotAfter: 05.01.2019 10:07
Subject: C=DE, S=Berlin, L=Berlin, OU=testou, O=test, CN=test-2.test.tc
Non-root Certificate
Template:
Cert Hash(sha1): b2 49 95 e1 5c 47 4a 75 5c 1a 68 59 eb 26 05 bc 43 43 0e e9
  Key Container = {A4F9D180-3391-4D9F-855A-6BD5457CF719}
  Unique container name: 2b06a7fd8659046a8520a72ee921f2e9_ae268432-4b90-4c10-adf
e-8c743fdedffa
  Provider = Microsoft Enhanced Cryptographic Provider v1.0
Private key is NOT exportable
Encryption test passed
CertUtil: -store command completed successfully.

虽然我提供了解决您问题的方法,但我不建议这样做,只建议使用POST。

编辑:

你说使用POST方法是针对REST的,你能详细说明吗?我发现的第一个REST API是twitter([class.mfct.non-static]/2),包含GET和&amp; POST方法。

答案 2 :(得分:0)

POST用于创建资源。如果您没有创建资源,请不要使用POST。 GET用于阅读资源。如果您正在阅读资源,请使用GET。假设您正在读取资源,您可以将列表作为以逗号或其他方式分隔的查询字符串参数发送,并使用custom model binder将其反序列化为您需要的任何对象。