如何在WebApi中将Get请求转换为Post请求?

时间:2019-04-30 11:06:48

标签: c# asp.net-web-api kendo-grid

我想将WebApi中的GET请求更改为POST请求,因为我需要在发布请求的正文中发送数据。

这是在js中:

    $scope.DS = new kendo.data.DataSource({
            type: "json",
            transport: {
                read: {
                    url: "/api/Employees/GetAllRecord",
                    dataType: "json",
                    contentType: "application/json",
                    type: "GET"
                },

我将类型更改为Post:

type: "POST", 

以下是在webApi中:

[WebInvoke(Method = "POST", UriTemplate = "Employees/GetAllRecord")]
    //[HttpPost] 
public IHttpActionResult GetAllRecord([FromBody] Models.DataSourceRequest request)
    {

            if (request != null)
            {
                var s = request;
            }
            var user = db.Users.Select(x => new RegisterBindingModel()
            {
                Id = x.Id,
                Email = x.Email,
                UserName = x.UserName,
                FirstName = x.FirstName,
                LastName = x.LastName,
                Age = x.Age,
            });

            var a = user.ToList();
            var b = Json(new { Data = a, Total = a.Count() });
            string strserialize = JsonConvert.SerializeObject(b.Content); // b.Content have json data
            //var c = JsonConvert.DeserializeObject<List<RegisterBindingModel>>(b.ToString());
            MyData c = JsonConvert.DeserializeObject<MyData>(strserialize);
            return Ok(c);
            //return user.ToList();
        }

这是RegisterModel:

public class RegisterBindingModel
{

    [Display(Name = "ID")]
    public int Id { get; set; }
    [Required]
    [Display(Name = "Email")]
    public string Email { get; set; }
    [Required]
    [Display(Name = "User Name")]
    public string UserName { get; set; }
    [Required]
    [Display(Name = "FirstName")]
    public string FirstName { get; set; }
    [Required]
    [Display(Name = "Lastname")]
    public string LastName { get; set; }
    [Required]
    [Display(Name = "Age")]
    public int Age { get; set; }
    }

我遇到了一个错误(请参阅附图) 因此,要解决此问题,我将创建以下新模型:

public class MyData
{
    public List<RegisterBindingModel> Data { get; set; }
    public int Total { get; set; }
}

我运行了这个项目,从Fiddler那里我注意到请求被两次调用了:

/ api / Employees 身份进行的首次通话,其中包含所有记录。

第二次呼叫为 / api / Employees / GetAllRecord ,其中有400个错误请求 它的错误消息是:

无法将当前JSON对象(例如{“ name”:“ value”})反序列化为类型'System.Collections.Generic.ICollection`1 [Project.Models.RegisterBindingModel]',因为该类型需要JSON数组(例如[1,2,3])正确反序列化。 要解决此错误,可以将JSON更改为JSON数组(例如[1,2,3]),也可以更改反序列化类型,使其成为普通的.NET类型(例如,不像整数这样的原始类型,也不像这样的集合类型数组或列表),可以从JSON对象反序列化。还可以将JsonObjectAttribute添加到类型中,以强制其从JSON对象反序列化。 路径”,第1行,位置2。

以下是strserialize的格式:

 {
"Data": [{
    "Id": 1,
    "Email": "Test@gmail.com",
    "UserName": "Test",
    "FirstName": "Test",
    "LastName": "Test",
    "Age": 23,
    "Phone": 1234560987
}],
"Total": 13
   }

现在,我该如何解决?

请有人告诉我,为什么Webapi执行两次? 这正常吗?还是我做错了什么?

更新 我想我必须从前端做到这一点, 我尝试了以下方法:

       parameterMap: function (options, operation) {
                    debugger;

                    if (operation !== "read" && options.models) {
                        console.log(JSON.stringify(options.models));
                        return JSON.stringify(options.models);
                    }
                    else {
       //  var filters = JsonConvert.SerializeObject(options);
                        var a = angular.fromJson(options)
                        return JSON.stringify(a);

enter image description here

1 个答案:

答案 0 :(得分:0)

使用以下模型:

public class RegisterBindingModel
{
    public int Id { get; set; }
    public string Email { get; set; }
    public string UserName { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
    public int Phone { get; set; }
}

public class MyData
{
    public List<RegisterBindingModel> Data { get; set; }
    public int Total { get; set; }
}

然后将数据反序列化为:

MyData c = JsonConvert.DeserializeObject<MyData>(strserialize);

工作示例:https://dotnetfiddle.net/IEqpxc