繁体   English   中英

重写api和反序列化对象

[英]Rewriting api and deserializing objects

我正在尝试将旧api迁移到webapi。 问题是体验有限,所以我在这里问这个问题。

当前的api在单个url中接受json有效负载。 /api json有效载荷具有以下结构

{'action': 'login', 'username': 'user1', 'password': 'password1'}

这应该是像/api/login这样的路线,所以我可以做类似的事情

[Route("api/Login")]
public string Login(Login login)

并为反序列化定义一个类

class Login
{
    public string username{ get; set; }
    public string password{ get; set; }
}

所以我做了一个接受[FromBody]有效负载的路由,我找不到根据动作以一种很好的方式反序列化对象的方法。

每个有效负载都可以是一个有效的可序列化对象,具有我描述的方式如果从有效负载中删除了action密钥。

任何不会产生丑陋代码的建议? 请不要api重写或v2答案。 如果我能做到这一点,我不会问这个。

假设每个有效负载中都存在“action”,您可以将其反序列化为动态类型,然后检查操作值,然后在知道此操作后再次将有效负载转换为特定类型。 这解决了您遇到的特定问题。

所以你的端点代码看起来像这样:

//this is written from memory, so could have mistakes ...
var deserialisedData = Newtonsoft.Json.JsonConvert.DeserialiseObject<dynamic>(payload);

switch ( deserialisedData.action )
{
     case "someValue":
          //here you know what the action is so hopefully what kind of payload to              expect
          var properType = payload as SomeProperType
     break;
}

如果你考虑创建一个全新的,合适的api,你可以开始为每个动作引入端点,一次一个。 将它们分开比让一个端点统治它们更好,可以这么说。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM