使用相同的ApiControler处理不同的结构化Web Api请求

时间:2017-09-05 07:52:27

标签: c# json asp.net-web-api

我有一个WebApi方法,它接受一个被构造为类数组的partameter:

public JsonResult<ApiReportResponse<GeneratedReport>> GenerateReport(int reportId, CustomReportFormat reportFormat, [FromUri] ReportParameter[] reportParameters = null)
{ ......... }

ReportParameter类定义为

public class ReportParameter: CustomReportParameter
{
    public string ParameterName { get; set; }

    public object ParameterValue { get; set; }

    public string ParameterLabel { get; set; }

    public bool MultiValue { get; set; }

    public CustomReportDataType? ParameterDataType { get; set; }
}

reportParameters参数是可选的

在调用此方法时,我要么将Json ified对象字符串或结构请求url作为对象列表发送,如:

Json ified version:

var parameterList = new List<ReportParameter>();
parameterList.Add(new ReportParameter { ParameterName = "TestParam", ParameterValue = 1});
var url = "<report url here>" + "reportId=1&reportFormat=Pdf&reportParameters=" + Newtonsoft.Json.JsonConvert.SerializeObject( requiredParameters.ToArray());

Url看起来像这样:

http://localhost:11111/ReportApi/Report/GenerateReport?reportId=41&reportFormat=Pdf&reportParameters=[{\"ParameterName\":\"TestParam\",\"ParameterValue\":1}]

但WebApi控制器无法捕获此信息并将Json ified字符串反序列化为ReportParameter[]

直接网址请求:

我有一个像

的网址
http://localhost:11111/ReportApi/Report/GenerateReport?reportId=41&reportFormat=Pdf&reportParameters[0][ParameterName]=TestParam&reportParameters[0][ParameterValue]=1

Web Api可以毫无问题地处理此请求。

如何重新构建我的Web Api方法GenerateReport,以便它可以同时处理这两种方法?

Upadte:在失败的Json ified请求中,Api方法接收数组中的ReportParameter对象,但ReportParameter对象的所有值都为null。

error

1 个答案:

答案 0 :(得分:0)

根据以下链接中的JSON.NET文档

https://www.newtonsoft.com/json/help/html/SerializingJSON.htm

序列化c#对象后,

JsonConvert.SerializeObject()返回一个json string。因此,您应该使用string作为api控制器操作的参数类型。请按照以下步骤

  1. 执行如下序列化

    var parameterList = new List<ReportParameter>();
    
     parameterList.Add(new ReportParameter { ParameterName = "TestParam", ParameterValue = 1});
    
     var url = "<report url here>" + "reportId=1&reportFormat=Pdf&reportParameters=" + Newtonsoft.Json.JsonConvert.SerializeObject(parameterList);
    
  2. 另请注意,您正在使用requiredParameters.ToArray()根据您的代码将输入序列化为parameterList.ToArray()

    1. 您可以使用以下签名

      ,而不是使用ReportParameter[] reportParameters = null作为参数
      public JsonResult<ApiReportResponse<GeneratedReport>> GenerateReport(int reportId, CustomReportFormat reportFormat, [FromUri] string reportParameters)
       { 
         // do the null checking here for reportParameters
       if(!string.IsNullOrEmpty(reportParameters))
            {
            // Deserialize it 
             JsonConvert.DeserializeObject<List<ReportParameter>>(reportParameters);
            }
       }
      
    2. 如果您现在能够看到控制器参数中的值,请告诉我。