如何在Web API Restul Get方法中使用复杂参数

时间:2016-05-10 17:07:46

标签: json rest asp.net-web-api2

对于Restful API,我需要使用Get来检索列表。但是,我想传递一些以下复杂参数,如方法

的输入
{
  "Filters": [
    {
      "FieldName": "sample string 1",
      "FieldValue": "sample string 2"
    },
    {
      "FieldName": "sample string 1",
      "FieldValue": "sample string 2"
    }
  ],
  "SortField": "sample string 1",
  "SortValue": 0,
  "Page": 2,
  "PageSize": 3
}

参数如何传递,因为我无法在Get方法中使用RequestBudy,如果我将其设为Post,它将不会是Restful。

4 个答案:

答案 0 :(得分:3)

阅读 REST API using POST instead of GET 和其他人一样,似乎没有Restful的规范定义禁止使用POST来实现你想要的东西。

在这种情况下,规则可能是“尽力而为”。

此外,由于您似乎拥有流程的主机端和客户端,因此没有太多理由避免POST。

从根本上说,没有简单的方法将序列化的json合并到URL中,这就是GET所需要的。

答案 1 :(得分:3)

我完全反对在URI的查询字符串中使用序列化JSON,原因如下:

  1. 它使URI不是人类可读的(编码括号和空格会生成可怕的查询字符串)
  2. 它使参数不可组合(添加另一个"过滤器"您必须取消对JSON的编码,将其反序列化为对象,添加新字段,然后再次序列化+编码)
  3. 它创建了长URI而没有任何好处(同样,JSON的编码部分不必要使查询字符串增长)
  4. 即使您可以将POST用于此目的,我相信如果您打算只查询数据而不修改它,那么继续使用GET在语义上会更正确。

    在很多情况下,比如你所描述的那个,我只是将我的复杂对象转换为分离的查询字符串参数,创建类似这样的URI:

    http://myhost.com/query?filters.fieldName1=fieldValue1&filters.fieldName2=fieldValue2&sort=fieldName&sortDirection=asc&page=2&pageSize=3
    

    您可以使用自定义ModelBinder自定义Paging对象轻松解析ASP.NET Web Api 2中的此查询字符串(我假设您正在使用此框架,因为您的问题中包含标记)它包含执行查询服务器端所需的任何数据。

    作为替代方法,您可以考虑将这些参数放在自定义(或多个)请求标头中,然后在服务器端读取它们:

    X-Query-Filter: FieldName1=FieldValue1&FieldName2=FieldValue2
    X-Query-Sort: FieldName
    X-Query-Sort-Direction: ASC
    X-Query-Page: 2
    X-Query-PageSize: 3
    

答案 2 :(得分:1)

传递URI中的过滤器:

 var encodedQueryString = encodeURIComponent(JSON.stringify({
      "Filters": [
        {
          "FieldName": "sample string 1",
          "FieldValue": "sample string 2"
        },
        {
          "FieldName": "sample string 1",
          "FieldValue": "sample string 2"
        }
      ],
      "SortField": "sample string 1",
      "SortValue": 0,
      "Page": 2,
      "PageSize": 3
    }))
    var url = example.com?filters="+encodedQueryString
    //http://www.example.com?filters=%7B%22Filters%22%3A%5B%7B%22FieldName%22%3A%22sample%20string%201%22%2C%22FieldValue%22%3A%22sample%20string%202%22%7D%2C%7B%22FieldName%22%3A%22sample%20string%201%22%2C%22FieldValue%22%3A%22sample%20string%202%22%7D%5D%2C%22SortField%22%3A%22sample%20string%201%22%2C%22SortValue%22%3A0%2C%22Page%22%3A2%2C%22PageSize%22%3A3%7D

提琴手输出:

enter image description here

答案 3 :(得分:0)

如果复杂的有效负载超出了url参数的可能大小,您可以将大型有效负载PO​​ST到queries端点,然后使用URI作为GET调用中的参数。

这是两个调用,而不是一个,但纯粹意义上允许在GET调用中使用二进制文件和blob。除了特殊情况外,我认为这样做太过分了。

如果POST有效,请使用它。