当前位置: 首页 > 面试题库 >

Web API复杂参数属性全为空

戴原
2023-03-14
问题内容

我有一个Web API服务调用,可以更新用户的首选项。不幸的是,当我从jQuery
ajax调用中调用此POST方法时,请求参数对象的属性始终为null(或默认值),而不是传入的内容。如果我使用REST客户端调用相同的确切方法(我使用Postman)
,效果很好。我无法弄清楚我在做什么错,但希望有人以前见过。这很简单…

这是我的请求对象:

public class PreferenceRequest
{
    [Required]
    public int UserId;

    public bool usePopups;
    public bool useTheme;
    public int recentCount;
    public string[] detailsSections;
}

这是UserController类中的控制器方法:

    public HttpResponseMessage Post([FromBody]PreferenceRequest request)
    {
        if (request.systemsUserId > 0)
        {
            TheRepository.UpdateUserPreferences(request.UserId, request.usePopups, request.useTheme,
                                         request.recentCount, request.detailsSections);

            return Request.CreateResponse(HttpStatusCode.OK, "Preferences Updated");                
        }
        else
        {
            return Request.CreateErrorResponse(HttpStatusCode.NotAcceptable, "You must provide User ID");
        }
    }

这是我的ajax电话:

var request = {
    UserId: userId,
    usePopups: usePopups,
    useTheme: useTheme,
    recentCount: recentCount,
    detailsSections: details
};

$.ajax({
    type: "POST",
    data: request,
    url: "http://localhost:1111/service/User",
    success: function (data) {
        return callback(data);
    },
    error: function (error, statusText) {
        return callback(error);
    }
});

我尝试将dataType和contentType设置为几种不同的内容(“ json”,“ application /
json”等),但是请求对象的属性始终为默认值或null。因此,例如,如果我传入此对象:

var request = {
  UserId: 58576,
  usePopups: false,
  useTheme: true,
  recentCount: 10,
  detailsSections: ['addresses', 'aliases', 'arrests', 'events', 'classifications', 'custody', 'identifiers', 'phone', 'remarks', 'watches']
}

我可以看到带有上面列出的有效值的完全填充的请求对象。但是在Web API控制器中,请求在那里,但是属性如下:

  UserId: 0,
  usePopups: false,
  useTheme: false,
  recentCount: 0,
  detailsSections: null

仅供参考-我不会在此项目中使用任何ASP.Net MVC或ASP.NET页面,仅使用Web API作为服务并使用jQuery $ .ajax进行所有调用。

知道我在做什么错吗?谢谢!

更新: 我只想指出,在其他控制器的同一Web API项目中,我有许多方法可以执行 完全相同的操作 ,并且我以 完全相同的方式
调用,并且它们可以完美地工作!我已经花了一个上午比较各种调用,而且方法或标题似乎没有任何区别,但是在此特定方法上却不起作用。

我也尝试过切换到Put方法,但得到的结果完全相同-
进入了请求对象,但未填充正确的值。令人沮丧的是,我在这个项目中有大约20个控制器类,而Posts在所有这些类中都能工作…


问题答案:

对于Asp.Net WebAPI,这似乎是一个常见问题。
通常,空对象的原因是将json对象反序列化为C#对象。不幸的是,调试非常困难,因此很难找到问题所在。
我更喜欢只将完整的json作为对象发送,然后手动反序列化。至少通过这种方式,您会得到真正的错误而不是空值。
如果将方法签名更改为接受对象,请使用JsonConvert:

public HttpResponseMessage Post(Object model)
        {
            var jsonString = model.ToString();
            PreferenceRequest result = JsonConvert.DeserializeObject<PreferenceRequest>(jsonString);
        }


 类似资料:
  • 当我尝试发送请求时“http://localhost:1234/api/case/create?signature=123456“从Postman(谷歌扩展)使用body请求中的“表单数据”,我得到错误: “消息”:“此资源不支持请求实体的媒体类型‘多部分/表单数据’。”,“ExceptionMessage”:“没有MediaTypeFormatter可用于从媒体类型为“multipart/for

  • 函数可以处理传递给它的参数,并且能返回它的退出状态码给脚本,以便后续处理。 function_name $arg1 $arg2 函数通过位置来引用传递过来的参数(就好像它们是位置参数),例如,$1, $2,等等。 例子 24-2. 带参数的函数 #!/bin/bash # 函数和参数 DEFAULT=default # 默认参数值。D func2 () {

  • 我试图通过web api microsoft应用程序中的post请求传递对象的参数,但传递的参数始终为null。 这是我的控制器的post方法,在调试下程序达到了方法但是dataUrlIN。url字符串始终为空 这是DataUrl的对象 这是post请求的最新版本 在发送post请求后,方法公共无效Post(Data Url dataUrlIN)中的断点被触发,但url字符串为空HelloWorl

  • 属性参数用来给已定义的属性附加元数据,类似于脚本语言的 Decorator 或者 C# 的 Attribute。 属性检查器相关参数 参数名 说明 类型 默认值 备注 type 限定属性的数据类型 (Any) undefined 详见 type 参数 visible 在 属性检视器 面板中显示或隐藏 boolean (注1) 详见 visible 参数 displayName 在 属性检视器 面板

  • 属性参数用来给已定义的属性附加元数据,类似于脚本语言的 Decorator 或者 C# 的 Attribute。 属性检查器相关参数 参数名 说明 类型 默认值 备注 type 限定属性的数据类型 (Any) undefined 详见 type 参数 visible 在 属性检视器 面板中显示或隐藏 boolean (注1) 详见 visible 参数 displayName 在 属性检视器 面板

  • 属性 属性(Attribute)是一种通用的用于表达元数据的特性,借鉴ECMA-334(C#)的语法来实现ECMA-335中描述的Attributes。属性只能应用于Item(元素、项), 例如 use 声明、模块、函数等。 元素 在Rust中,Item是Crate(库)的一个组成部分。它包括 extern crate声明 use声明 模块(模块是一个Item的容器) 函数 type定义 结构体定