Yii2修改配置文件识别post过来的json数据

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xvjinkui11/article/details/52956311

众所周知,在Yii2版本上,我们可以用Yii::$app->request->post()来接收传递的post数据,但是今天跟安卓同事交互的时候,他传递过来的json数据,仍然用以上方法获取,并打印出来看结果的时候,竟然惊奇的发现,原来Json传递过来不能用Yii::$app->request->post()接收的,而且没办法进行json_decode解析操作,因为json_decode需要的参数是个json字符串,但是调用Yii::$app->request->post()的结果是一个数组,并且是一个空数组,经过研究发现,原来只需要在web.php文件中配置下request的配置数组里加上以下代码即可实现,然后就可以用正常的post接收了,Yii2会自动帮你转换成数组.


附上代码:

'parsers' => [
                'application/json' => 'yii\web\JsonParser',
                'text/json' => 'yii\web\JsonParser',
 ]

展开阅读全文

FromBody如何接收POST过来json数据?

04-01

服务端目前设计如下.rn[code=csharp]rn [Route("User/Add")]rn [HttpPost]rn public dynamic AddUser([FromBody] Product p)rn rn if (p == null)rn rn throw new Exception("产品为空");rn rn return Json(p);rn rn[/code]rn并且在注册的时候有以下代码.rn[code=csharp]rnconfig.MapHttpAttributeRoutes();rnconfig.Formatters.JsonFormatter.SupportedMediaTypes.Add(new Headers.MediaTypeHeaderValue("text/html"));rnconfig.Formatters.JsonFormatter.SupportedMediaTypes.Add(new Headers.MediaTypeHeaderValue("text/xml"));rnconfig.Formatters.JsonFormatter.SupportedMediaTypes.Add(new Headers.MediaTypeHeaderValue("text/json"));rn[/code]rn我js作为客户端的时候 使用以下代码 可以正常得到p的值.rn[code=javascript]rn var d = "id": 54, "name": "产品1", "price": 11.11, "time": "2000-01-01T00:00:00" ;rn $.post("User/Add", d, function (data) rn var rs = JSON.stringify(data);rn alert(rs);rn );rn[/code]rn但是如果我用HttpWebReques客户端请求的时候发现了问题.rn[code=csharp]rn request.Method = "POST";rn request.ContentType = "application/json";rn[/code]rn如果是这样写.是正常的 同 js返回值.rn但是我不能要求客户端这样写..因为他们很多时候 都是网上找的代码.post数据 其实是这样的.rn[code=csharp]rn request.Method = "POST";rn request.ContentType = "application/x-www-form-urlencoded";rn[/code]rn因为这是标准的.. 我调用微信接口的时候 也是这样的方式.. 所以比较大众化.rnrn我在过滤器中看到请求 是这样的rnrn如果是ajax请求 其实我得到的数据 是id=1&name=产品&price=11.11.. 这样的数据 能被frombody识别.rnrn但是如果我用application/x-www-form-urlencoded这样的方式POST过来的数据 其实就是json字符串rn这种rn[code=csharp]rnstring rs= " "id": 54, "name": "产品1", "price": 11.11, "time": "2000-01-01T0"";rn[/code]rnrn所以 有什么办法 在不改ContentType 的情况下 能保证2种客户端 都正常的通讯?rnrn也就是 在ContentType =application/x-www-form-urlencoded的时候,api接口中的"对象参数"依然可以"反序列化"rn 论坛

MVC4 web API 如何获取Post过来json数据

07-22

这是提交post请求的页面rn[code=csharp]rn protected void Button1_Click(object sender, EventArgs e)rn rn string json = GetReleseUserJson();rn string str = HttpPost(json, "http://192.168.1.113/testapi/api/test");rn Response.Write(str);rn rnrn private string HttpPost(string postDataStr, string Url)rn rn HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);rn request.Method = "POST";rn request.ContentType = "application/json";rn //request.ContentLength = Encoding.UTF8.GetByteCount(postDataStr);rn Stream myRequestStream = request.GetRequestStream();rn StreamWriter myStreamWriter = new StreamWriter(myRequestStream, Encoding.GetEncoding("gb2312"));rn myStreamWriter.Write(postDataStr);rn myStreamWriter.Close();rn HttpWebResponse response = (HttpWebResponse)request.GetResponse();rn Stream myResponseStream = response.GetResponseStream();rn StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));rn string retString = myStreamReader.ReadToEnd();rn myStreamReader.Close();rn myResponseStream.Close();rn return retString;rn rn //JSON字符串rn public static string GetReleseUserJson()rn rnrn rnrn string json = "";rn json += "\"ID\":5,";rn json += "\"Name\":\"超大厦\",";rn json += "\"Age\":55";rn json += "";rn return json;rn rn[/code]rnrn这是web API 控制器里的rn[code=csharp]rn public Test Post([FromBody]Test ttt)rn rn rnrnrn return ttt;rn rn[/code]rnrn这是model里的rn[code=csharp]rnpublic class Testrn rn public int ID get; set; rnrn public string Name get; set; rnrn public int Age get; set; rnrn rn rn[/code] 论坛

没有更多推荐了,返回首页