在WebApi中请求HttpGet和HttpPost方法时,如何封装JSON对象以实现多个参数

本文关键字:JSON 封装 对象 参数 实现 何封装 HttpGet 请求 WebApi HttpPost 方法 | 更新日期: 2023-09-27 18:27:52

如果Web API中有多个参数要传递给HttpGetHttpPost方法,我们如何始终传递JSON对象,以便更容易地在客户端和服务器端处理它?

在WebApi中请求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复杂对象

复杂对象意味着我们可以打包listdictionary对象,并在服务器端用动态对象解析它们。我们称之为复合模式。

var jsonData = {
   "AppName":"SamplePrice",
   "AppInstanceID":"100",
   "ProcessGUID":"072af8c3-482a-4b1c‌​-890b-685ce2fcc75d",
   "UserID":"20",
   "UserName":"Jack",
   "NextActivityPerformers":{
        "39‌​c71004-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)
{
...
}