c# webApi 获取不到入参,强制输入json解决方案

问题描述

做一个登录模块,提供api给前端调用,发现死活拿不到入参。最开始的写法如下:

 public string Login([FromBody] string InData)
        {

            //读取登录json
            Log.AddTrack("LoginController.Login", "Begin");
            Log.AddTrack("LoginController.Login", "收到入参:" + InData);
            return InData;
            }

postman调用如下:
在这里插入图片描述
查看本地日志:
在这里插入图片描述
居然为空!

解决思路

  1. 百度,发现此类问题不多,所以记录一下。
  2. 查到一种方法,说需要新建一个模型类,用于接收结果,才能显示。于是尝试:
public class DataModel
        {
           public string InParam
            {
                get;
                set;
            }
        }
        
         public string Login([FromBody] DataModel InData)
        {

            //读取登录json
            Log.AddTrack("LoginController.Login", "Begin");
            Log.AddTrack("LoginController.Login", "收到入参:" + InData.InParam);
            return InData.InParam;
            }

结果同上,没有效果,于是猜测可能接收到的不是一个string,所以都赋值不过去。

  1. 再查,发现postman的content-type →application/json,于是想用一个json类来接收,于是改造代码如下:
public string Login([FromBody] JObject InData)
        {

            //读取登录json
            Log.AddTrack("LoginController.Login", "Begin");
            Log.AddTrack("LoginController.Login", "收到入参:" + InData.ToString());
            return InData.ToString();
            }

嘿,还真可以!
在这里插入图片描述
不知道这种接收方式是谁想出来的。
问题解决!

拓展

再拓展一下:

  1. FormBody跟FromUrl
    在这里插入图片描述
  2. 使用url的post方式:
 [Route("test")]
        [HttpPost]
        public string TestReturn(string a,string b)
        {
            //读取登录json
            Log.AddTrack("LoginController.TestReturn(", "Begin");
            return a + b;
        }

在这里插入图片描述postman调用方式:
在这里插入图片描述
3. webApi强制返回json:
在这里插入图片描述
正常的返回应该是没有的,在本地日志也看不出来,要解决这个问题,可以采用HttpResponseMessage来返回,核心代码如下:

//返回纯文本text/plain  ,返回json application/json  ,返回xml text/xml
            HttpResponseMessage result = new HttpResponseMessage
            {
                
                Content = new StringContent(outParam, 
                Encoding.GetEncoding("UTF-8"), 
                "application/json") 
            };
            return result;

代码示例:

public HttpResponseMessage Login([FromBody] JObject InData)
        {

            //读取登录json
            Log.AddTrack("LoginController.Login", "Begin");
            Log.AddTrack("LoginController.Login", "收到入参:" + InData.ToString());

            string userNo = InData["userNo"].ToString();
            string passWord = InData["passWord"].ToString();
            string outParam = HOTLogin(userNo, passWord);

            //返回纯文本text/plain  ,返回json application/json  ,返回xml text/xml
            HttpResponseMessage result = new HttpResponseMessage
            {
                
                Content = new StringContent(outParam, 
                Encoding.GetEncoding("UTF-8"), 
                "application/json") 
            };
            return result;
        }

postman调用示例:
在这里插入图片描述

参考链接:

https://blog.csdn.net/PLA12147111/article/details/89666797
https://www.cnblogs.com/rohelm/p/3207430.html

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#中规范Web API入参通常遵循以下几个原则: 1. 使用强类型参数:推荐使用具体的类或结构体作为参数类型,而不是使用原始类型或基本数据类型。这样可以提高代码的可读性和可维护性,同时还可以利用C#的强类型检查功能。 2. 使用属性路由和查询字符串参数:对于GET请求,通常将查询参数作为方法的可选参数,使用属性路由和查询字符串参数进行过滤、排序等操作。对于POST请求,可以将请求体中的数据反序列化为对应的模型类。 3. 使用FromBody特性:对于POST、PUT等需要传递复杂对象的请求,可以使用FromBody特性将请求体中的数据绑定到方法参数上。这样可以避免手动解析请求体,并且可以方便地进行模型验证。 4. 使用自定义模型验证:对于复杂的输入参数,可以使用自定义模型验证来验证数据的有效性。可以通过创建自定义验证特性或使用第三方库如FluentValidation来实现。 5. 使用DTO模式:在API层与业务逻辑层之间使用DTO(Data Transfer Object)来传递数据,避免直接暴露领域模型。这样可以提高安全性,并且能够更好地控制数据的传递和展示。 6. 使用合理的命名规范:对于参数的命名,应该使用驼峰式命名法或Pascal命名法,并且要有意义。避免使用过于简短或模糊的参数名。 以上是一些常见的规范,你可以根据自己的项目需求和团队约定进行适当调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值