如何将课程传递给服务器

Posted

技术标签:

【中文标题】如何将课程传递给服务器【英文标题】:How do I pass class to server 【发布时间】:2021-10-20 16:58:16 【问题描述】:

将单个整数参数从我的客户端传递到服务器上的 API 有效。

 [HttpPost]
 public JsonResult GetNextClients(int? clientID)

但是传递一个类不会。

这里定义的类:

public class ClientParameters

    public int ClientID;
    public int FamilyID; 
    public bool IncludeFirstName;
    public bool IncludeLastName;
    public bool ExactDate;

方法:

[HttpPost]
public JsonResult GetClients(ClientParameters param)

我发送的数据如下所示:

    return 
        "ClientID": 5,
        "FamilyID": 12,
        "IncludeFirstName": true,
        "IncludeLastName": true,
        "ExactDate": true
    ;

从 Fiddler 运行它会命中我的方法,我得到了类,但它都是默认值。

我尝试了 JSON.Stringify 并从客户端和 Fiddler 发送

 "\"ClientID\":5,\"FamilyID\":0,\"IncludeFirstName\":true,\"IncludeLastName\":true,\"ExactDate\":true"     

我尝试添加

dataType: "json"
contentType: "application/json; charset=utf-8"

仍然获取默认值。

标准路由:

        routes.MapRoute(
            name: "Default",
            url: "controller/action/id",
            defaults: new  controller = "Home", action = "Index", id = UrlParameter.Optional 
        );

【问题讨论】:

快速猜测:使用属性,而不是类中的字段。 如果您想将对象传递给 API,请确保您的 API 方法是 POST 方法。 @KrzysiekSzymczak 感谢您的想法,但没有改变。 @YongShun 我的错。我应该包括那个细节。 @BWhite 你 100% 确定你得到默认值吗?我的意思是您展示的示例与您的模型 1-1 不匹配。我是你的模特ClientId,但你发送ClientImportID。然后在 FamilyId 中发送 0(默认值),只有这三本书可以指示您是否真的获得默认值。请再次验证它;) 【参考方案1】:

以下是 .NET Core 3.1 中的 C# API 示例。代码在控制器中,它是具有服务层的存储库模式的一部分,全部使用依赖注入。

[HttpPost]
public virtual ActionResult<T> Create([FromBody] T data)

  try
  
    return Ok(_service.Create(data));
  
  catch (Exception e)
  
    return BadRequest(e.Message);
  

注意您需要在您的发布请求参数中使用[FromBody]

查看以下链接的“发送 POST 请求”部分,以确保您的 AJAX 格式正确。 Sending POST Requests

【讨论】:

【参考方案2】:

我不知道为什么传递参数对我不起作用,但现在我突然想到我以前遇到过这种情况。 我不应该手动解析它,但这行得通。

[HttpPost]
public JsonResult GetClients()

    string value = new StreamReader(Request.InputStream).ReadToEnd();
    ClientParameters param = JsonConvert.DeserializeObject<ClientParameters>(value);

有趣的是,无论我发送 contentType 还是 dataType,它都有效。 同样有趣的是,来自 Fiddler,如果我对 JSON 进行字符串化,它就不起作用。同样,不管 contentType 或 dataType。 然而,从网络客户端,它只有在我将它字符串化时才有效。

【讨论】:

因为当您自己解析 inputStream 时,框架并不关心它是什么“内容类型”,因为它不必解析它;)正确解析它是您的责任(喜欢你的JsonConvert...);)

以上是关于如何将课程传递给服务器的主要内容,如果未能解决你的问题,请参考以下文章

如何将位图从 Activity 传递给服务

如何将服务器端渲染中的数据从节点传递给reactjs组件

如何将 $_SESSION 变量传递给 websocket 服务器?

如何将环境变量传递给由 systemd 启动的服务

如何将数组传递给 PHP 一个服务器的数组?

如何将值从angularjs传递给节点[重复]