在WebApi中请求HttpGet和HttpPost方法时,如何封装JSON对象以实现多个参数
本文关键字:JSON 封装 对象 参数 实现 何封装 HttpGet 请求 WebApi HttpPost 方法 | 更新日期: 2023-09-27 18:27:52
如果Web API中有多个参数要传递给HttpGet
或HttpPost
方法,我们如何始终传递JSON对象,以便更容易地在客户端和服务器端处理它?
在WebApi项目中,在一个控制器上获取或发布多个参数,我们会发现很难清楚地解决它,实际上,如果我们使用json和动态对象,有一个简单实用的解决方案。
1.HttpGet
我们可以在查询字符串内容中附加json字符串,并在服务器端解析json对象。
var data = {
UserID: "10",
UserName: "Long",
AppInstanceID: "100",
ProcessGUID: "BF1CC2EB-D9BD-45FD-BF87-939DD8FF9071"
};
var request = JSON.stringify(data);
request = encodeURIComponent(request);
//call ajax get method
ajaxGet:
...
url: "/ProductWebApi/api/Workflow/StartProcess?data=",
data: request,
...
[HttpGet]
public ResponseResult StartProcess()
{
dynamic queryJson = ParseHttpGetJson(Request.RequestUri.Query);
//begin to parse...
int appInstanceID = int.Parse(queryJson.AppInstanceID.Value);
Guid processGUID = Guid.Parse(queryJson.ProcessGUID.Value);
int userID = int.Parse(queryJson.UserID.Value);
string userName = queryJson.UserName.Value;
...
}
private dynamic ParseHttpGetJson(string query)
{
if (!string.IsNullOrEmpty(query))
{
try
{
var json = query.Substring(7, query.Length - 7); // the number 7 is for data=
json = System.Web.HttpUtility.UrlDecode(json);
dynamic queryJson = JsonConvert.DeserializeObject<dynamic>(json);
return queryJson;
}
catch (System.Exception e)
{
throw new ApplicationException("wrong json format in the query string!", e);
}
}
else
{
return null;
}
}
2.HttpPost
2.1简单对象
我们用ajax传递json对象,并在服务器端用动态对象解析它。它运行良好。这是示例代码:
ajaxPost:
...
Content-Type: application/json,
data: {"name": "Jack", "age": "12"}
...
[HttpPost]
public string ParseJsonDynamic(dynamic data)
{
string name = data.name;
int age = data.age;
return name;
}
2.2复杂对象
复杂对象意味着我们可以打包list和dictionary对象,并在服务器端用动态对象解析它们。我们称之为复合模式。
var jsonData = {
"AppName":"SamplePrice",
"AppInstanceID":"100",
"ProcessGUID":"072af8c3-482a-4b1c-890b-685ce2fcc75d",
"UserID":"20",
"UserName":"Jack",
"NextActivityPerformers":{
"39c71004-d822-4c15-9ff2-94ca1068d745":
[{
"UserID":10,
"UserName":"Smith"
}] //list nested in dictionary
}
}
//call ajax post method
ajaxPost:
...
Content-Type: application/json,
data: jsonData
...
[HttpPost]
public string ParseJsonComplex(dynamic data)
{
//compsite object type:
var c = JsonConvert.DeserializeObject<YourObjectTypeHere>(data.ToString());
//list or dictionary object type
var c1 = JsonConvert.DeserializeObject< ComplexObject1 >(data.c1.ToString());
var c2 = JsonConvert.DeserializeObject< ComplexObject2 >(data.c2.ToString());
...
}
不要使用多个参数,创建一个类(ViewModel/VM),其中包含您需要传递的参数和参数的传递。这样你就会跑得很好。
示例:
之前
[HttpPost]
public Json GetPass(string p1, string p2)
{
...
}
现在
Public class VMExample{
public String p1 { get; set; }
public String p2 { get; set; }
}
[HttpPost]
public Json GetPass(VMExample parameters)
{
...
}