HttpWebRequest的Request.Form接收不到数据

一句话总结要点:

前端请求时,使用content-type=application/x-www-form-urlencoded时,表示前端传入的参数是键值对格式,

如QueryString (get)方式或Form (post)表单传值,后端获取参数使用context.Request["name"]即可,但其实此时Request.InputStream也有数据,只是使用context.Request["name"]这种键值对解析更方便处理

前端请求时,使用content-type=application/json时,表示前端传入的是json格式数据,因为没有指定键,本身就不是键值对格式的,

所以后端获取参数自然就不能使用context.Request["name"]这种方式了,这种方式也获取不到值,此时只能使用Request.InputStream来获取整个json字符串再做解析了。

这也就是为什么在Postman中,使用raw-json调用后端接口时,后端接受参数不能使用context.Request["name"]这种方式,却可以使用Request.InputStream来获取前端数据的关键原因了。

 

最近在写接口,
post请求,使用postman模拟时,使用的是raw-json ,然后发现

HttpContextBase context = (HttpContextBase)Request.Properties["MS_HttpContext"];//获取传统context
HttpRequestBase request = context.Request;//定义传统request对象
string dbcode = request.Form["dbcode"];
dbcode获取不到参数。

发现HttpWebRequest只有设置为application/x-www-form-urlencoded时候,接收端才能通过Request.Form[“key”]来获取值,Js得ajax一样也需要设置contentType: “application/x-www-form-urlencoded;charset=utf-8”

当ContentType设置为application/json时,Request.Form是取不到任何值得。Keys的长度为0;

正确获取方式:

var stream = Request.InputStream;
stream.Position = 0; //如果使用mvc,必须设置,否则流position一直在最后,个人理解为mvc内部已经对Request.InputStream进行了读取导致position移到了最后。
StreamReader streamReader = new StreamReader(stream);
string body=streamReader.ReadToEnd();
或者

var stream = Request.InputStream;
stream.Position = 0;
byte[] byts = new byte[stream.Length];
stream.Read(byts, 0, byts.Length);
string body = System.Text.Encoding.UTF8.GetString(byts);
得到的body就是json格式字符串,如:
{“httpUrl”:“http://www.pageadmin.net/e/images/logo.jpg”,“saveFilePath”:"/app_data/test/logo.jpg"}


原文链接:https://blog.csdn.net/hyq_07_27/article/details/114922555

posted on   itjeff  阅读(262)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示