对于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。
答案 0 :(得分:3)
阅读 REST API using POST instead of GET 和其他人一样,似乎没有Restful的规范定义禁止使用POST来实现你想要的东西。
在这种情况下,规则可能是“尽力而为”。
此外,由于您似乎拥有流程的主机端和客户端,因此没有太多理由避免POST。
从根本上说,没有简单的方法将序列化的json合并到URL中,这就是GET所需要的。
答案 1 :(得分:3)
我完全反对在URI的查询字符串中使用序列化JSON,原因如下:
即使您可以将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
提琴手输出:
答案 3 :(得分:0)
如果复杂的有效负载超出了url参数的可能大小,您可以将大型有效负载POST到queries
端点,然后使用URI作为GET调用中的参数。
这是两个调用,而不是一个,但纯粹意义上允许在GET调用中使用二进制文件和blob。除了特殊情况外,我认为这样做太过分了。
如果POST有效,请使用它。