首页 新闻 会员 周边 捐助

asp.net core webapi 如何获取请求里的所有POST参数

0
悬赏园豆:100 [已解决问题] 解决于 2018-07-26 18:46

我用模拟工具发一个post请求到core 2.0 webapi项目的一个接口上:

 

接口里的代码如下:

[HttpPost]
public string Post()
{
   int i = int.Parse("qqq");

   return "Hello World!";
}

故意抛了一个错,触发了异常过滤器,异常过滤器调了下面这个GetPostParams方法,初衷是想记录该请求的所有参数:

 

模拟提交的时候,POST一个参数都没带,context.Request.Form点出来的任何方法都报错,发一个带参数的POST试试:

走你:

 

不报错了,也可以拿到参数。现在问题来了,ASP.NET Core的webapi项目里,不带请求参数的时候,如何通过代码判断出来该POST请求不带参数,同时不报错?

context.Request.Form.Count在没有POST参数的时候都会报错,大家试一下。

注:Core webapi项目,非ASP.NET MVC项目。

oppoic的主页 oppoic | 小虾三级 | 园豆:770
提问于:2018-07-26 14:49
< >
分享
最佳答案
0

我用下面的代码测试没有报错

if(Request.Form.Count > 0 && Request.Form.Keys.Count > 0)
{
    return Ok("Request.Form.Keys: " + Request.Form.Keys.Count);
}
收获园豆:70
dudu | 高人七级 |园豆:29407 | 2018-07-26 15:22

你说奇怪不奇怪吧:

 

oppoic | 园豆:770 (小虾三级) | 2018-07-26 15:49

@oppoic: 对于 web api ,请求时应该用 x-www-form-urlencoded ,不应该用 form-data

dudu | 园豆:29407 (高人七级) | 2018-07-26 16:00

@dudu: 按你说的是可以了,但是为何form-data方式,有值Request.Form.Count可以获取个数,没值连0都不输出,直接报错,这是为啥。

oppoic | 园豆:770 (小虾三级) | 2018-07-26 16:47

@oppoic: 如果想知道究竟,可以看 ASP.NET Core 的源代码:https://github.com/aspnet/Mvc

dudu | 园豆:29407 (高人七级) | 2018-07-26 17:04
其他回答(3)
0

context.Request.Form.Count你确定这是在获取post过来的参数数量吗?看写法貌似是判断form个数

一禅·小和尚 | 园豆:519 (小虾三级) | 2018-07-26 14:52
0

我猜:如果没有任何POST参数的话,Request.Form这个集合就不会被初始化,所以,,,,。

西漠以西 | 园豆:1675 (小虾三级) | 2018-07-26 15:39
0

如果只是判断post有没有参数,可以通过Request.ContentLength 来判断,

但如果content中有内容,却不是可以解析为form的参数,Request.Form还是会抛异常!这样的话,你只能靠捕获异常来处理。

我现在不清楚是否有指示标志或其他方式来处理你这个想法。

 

其实,你是可以获取Request content中的内容,自己来实现解析的逻辑,然后就可以很方便的实现你的需求了。

收获园豆:30
放逐人 | 园豆:694 (小虾三级) | 2018-07-26 17:01

楼上的dudu回复是正确的:

如果POST请求指定了编码方式是“x-www-form-urlencoded”,那么就算POST请求过来没有带参数,Request.Form也不会报错,如果POST编码方式是“form-data”,同时POST请求没有参数的话,那么Request.Form也会报错。

但是我不能控制前端发请求的编码方式,所以还是按照你的方式,通过Request.ContentLength判断一下,这样就完美了,无论那种编码方式的POST请求过来都可以了,最终代码:

if (context.Request.ContentLength != 0)
{
    foreach (var key in context.Request.Form.Keys)
    {
        param += key + ":" + context.Request.Form[key].ToString() + " ";
    }
}

 

支持(2) 反对(0) oppoic | 园豆:770 (小虾三级) | 2018-07-26 17:19
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册