form表单和ajax中的post请求后台获取数据⽅法(深度好⽂)最近要做后台数据接收,因为前台传来的数据太过于混乱,所以总结了⼀下前台数据post请求⽅法,顺便写了下相对应的后台接收⽅法。
前台主要的contenttype为下⾯三种:(需要注意的是请求头中datatype与contenttype的区别,datatype是要求浏览器返回的数据格式,这⾥的contenttype指的是提交的数据格式)应⽤情景:
multipart/form-data类型主要是上传⽂件时⽤到;
application/x-www-form-urlencoded类型主要是提交k-v时⽤到,当然这种⽅法也可以将json设置在v中提交json数据;
application/json类型主要是传递json数据⽤到,层次⽐较深的数据;
post提交主要就是依赖于浏览器表单提交和ajax⽅式提交,两者对这三种⽅式都可以实现,下⾯分别介绍这两类⽅法:
⼀、Form表单实现(不含后端)
1、application/x-www-form-urlencoded⽅法
1. <form action="Handler
2.ashx" method="post" enctype="application/x-www-form-urlencoded">
2. <p>客户名称: <input type="text" name="CustomerName" /></p>
3. <p>客户电话: <input type="text" name="CustomerTel" /></p>
4. <p><input type="submit" value="提交" /></p>
5. </form>
2、multipart/form-data⽅法
1. <form action="Handler
2.ashx" method="post" enctype="multipart/form-data">
<p><input type="text" name="str" value="⼀个字符串,别管它" /></p>
2. <p>要上传的⽂件1<input type="file" name="file1"/></p>
3. <p>要上传的⽂件2<input type="file" name="file2"/></p>
4. <p><input type="submit" value="提交" /></p>
5. </form>
3、json⽅法
3.1 form表单数据可以直接json序列化var queryArray = $(formElement).serializeArray();
3.2 也可以在k-v中的v中添加实际值,当然这个违背了form表单多个k-v的初衷,但是也可以实现
⼆、ajax实现(含后端)
1、application/x-www-form-urlencoded⽅法(json与kv)
1.  var data={    "books": [        { "language":"Java" , "edition":"second" },        { "language":"C++" , "lastName":"fifth" },        { "language":"C" , "lastName":"third" }    ] }
2.        $.ajax({
3.            type: "post",
4.            url: "localhost:39870/api/test/getUrlencode",
5.            contentType : "application/x-www-form-urlencoded; charset=UTF-8",
6.            data: { books: JSON.stringify(data), txtPass: "123" },
7.            success: function (res) {
8.
9.                //alert(res);
10.                //layer.close(ii);
11.            }
12.        });
后台处理程序
1.        [HttpPost]
2.        public IHttpActionResult getFormdata()
url编码处理3.        {
4.
5.            string id = HttpContext.Current.Request["id"];
6.            string name = HttpContext.Current.Request["name"];
7.
8.            return Ok("success2");
9.        }
⽤上述⽅法既可以获取简单的kv数据,也可以⾃⼰拼接类json数据,不过其中的数据都是默认在浏览器服务器进⾏url编码解码。可以⽤下⾯⽅法实验得出:
1.            HttpRequest request = HttpContext.Current.Request;
2.            Stream stream = request.InputStream;
3.            StreamReader streamReader = new StreamReader(stream);
4.            string json = string.Empty;
5.            json = streamReader.ReadToEnd();
6.            json = HttpUtility.UrlDecode(json);
"books=%7B%22books%22%3A%5B%7B%22language%22%3A%22Java%22%2C%22edition%22%3A%22second%22%7D%2C%7B%22language%22%3A%22C%2B%2B%22%2C%22la 进⾏编码后数据为:
"books={\"books\":[{\"language\":\"Java\",\"edition\":\"second\"},{\"language\":\"C++\",\"lastName\":\"fifth\"},{\"language\":\"C\",\"lastName\":\"third\"}]}&txtPass=123"
2、multipart/form-data⽅法
1.    var data = new FormData();
2.    var files = $("#fileUpload").get(0).files;
3.        data.append("id","001");
4.        var name={    "books": [        { "language":"Java" , "edition":"second" },        { "language":"C++" ,
"lastName":"fifth" },        { "language":"C" , "lastName":"third" }    ] };
5.        data.append("name",JSON.stringify(name));
6.        if(files.length > 0){
7.            for (var i = 0; i < files.length;i++){
8.                data.String(), files[i]);
9.            }
10.        }
11.        $.ajax({
12.            type: "post",
13.            url: "localhost:39870/api/test/getFormdata",
14.            contentType: false,
15.            cache: false,
16.            currentType: false,
17.            processData: false,
18.            data: data,
19.            success: function (res) {
20.
21.                //alert(res);
22.            }
23.        });
后台获取数据
1.            string id=HttpContext.Current.Request["id"];
2.            string name = HttpContext.Current.Request["name"];
3.            HttpFileCollection files = HttpContext.Current.Request.Files;
4.
5.            foreach (string key in files.AllKeys)
6.            {
7.                HttpPostedFile file = files[key];
8.                if (string.IsNullOrEmpty(file.FileName) == false)
9.                {
10.
11.                    string path = HttpContext.Current.Server.MapPath("~/App_Data/") + file.FileName;
12.                    string path2 = HttpContext.Current.Request.Url.Authority+"/" + file.FileName;
13.                    string path3 = "C:/Users/xcy/Desktop/⾦阁寺需求分析/" + file.FileName;
14.                    file.SaveAs(path3);
15.                }
16.            }
此种⽅法可以接受kv数据,类json数据和⽂件,数据并未进⾏url编码。可以⽤下⾯⽅法验证:
1.            HttpRequest request = HttpContext.Current.Request;
2.            Stream stream = request.InputStream;
3.            StreamReader streamReader = new StreamReader(stream);
4.            string json = string.Empty;
5.            json = streamReader.ReadToEnd();
6.            json = HttpUtility.UrlDecode(json);
未进⾏url编码的时候json为:
"------WebKitFormBoundaryB4I0wChQCc6LwykM\r\nContent-Disposition: form-data; name=\"id\"\r\n\r\n001\r\n------WebKitFormBoundaryB4I0wChQCc6LwykM\r\nContent-Disposition: form-data;
name=\"name\"\r\n\r\n{\"books\":[{\"language\":\"Java\",\"edition\":\"second\"},{\"language\":\"C++\",\"lastName\":\"fifth\"},{\"language\":\"C\",\"lastName\":\"third\"}]}\r\n------
WebKitFormBoundaryB4I0wChQCc6LwykM--\r\n"
进⾏url编码之后没有变化,为:
"------WebKitFormBoundaryB4I0wChQCc6LwykM\r\nContent-Disposition: form-data; name=\"id\"\r\n\r\n001\r\n------WebKitFormBoundaryB4I0wChQCc6LwykM\r\nContent-Disposition: form-data;
name=\"name\"\r\n\r\n{\"books\":[{\"language\":\"Java\",\"edition\":\"second\"},{\"language\":\"C  \",\"lastName\":\"fifth\"},{\"language\":\"C\",\"lastName\":\"third\"}]}\r\n------
WebKitFormBoundaryB4I0wChQCc6LwykM--\r\n"
3、json⽅法
1.        var data={"books":[{"language":"Java","edition":"second"},{"language":"C++","lastName":"fifth"},{"language":"C","lastName":"third"}]};
2.        $.ajax({
3.            type: "post",
4.            url: "localhost:39870/api/test/gettest3",
5.            contentType: "application/json; charset=utf-8",
6.            cache: false,
7.            data: JSON.stringify(data),
8.            success: function (res) {
9.
10.            }
11.        });
注意JOSN.stringify(),不添加都会失败,直接传的是url编码后的原字符串。这⾥插播⼀下字符串与对象转换
JSON.stringify(obj)将JSON转为字符串。
JSON.parse(string)将字符串转为JSON格式
例⼦:
1. var a={"name":"tom","sex":"男","age":"24"};
2.
3. var b='{"name":"Mike","sex":"⼥","age":"29"}';
4.
5. var aToStr=JSON.stringify(a);
6.
7. var bToObj=JSON.parse(b);
8.
9. alert(typeof(aToStr));  //string
11. alert(typeof(bToObj));//object
看完后就知道为什么要⽤JSON.stringify(obj)了,因为我们要穿的是字符串,⽽代码中data变量原来是js对象,so要变⼀下啦
⽽且JSON.stringify()会⾃动添加转义符,⽐如我们在⼀个字段包含"或者\的时候,如下:
1.    var temp={
2.        "F_CODE": "001",
3.        "F_REGION_CODE": "001",
4.        "F_ZTPG": "⼩\"东哥很'",
5.        "F_PGZS": "string",
6.        "F_PIC": "string",
7.        "F_FILE": "string",
8.        "F_TYPE": "string",
9.        "F_PROJECT_CODE": "string",
10.        "F_TIME": "2017-05-24T03:23:11.555Z"
11.    };
12.    var tt=JSON.stringify(temp);
temp显⽰的时候会不显⽰转义符\,当⽤stringify处理后会的字符串上传到后端的时候会出现转义符,使得上传数据不会出错
后台接收⽅法
3.1
1.        public IHttpActionResult getTest4([FromBody]object jdata)
2.        {
3.            //dynamic
4.            return Ok("ddd");
5.        }
前台的contenttype必须设置为json,此为WebAPI的⽅式,这种⽅式添加FromBody这个参数,会针对contenttype为json的post请求⾃动拦截,如果当contenttype不为json,则会影响后⾯stream正常获取,即:如果在上⾯代码中添加楼下的代码,在下⾯的代码中是获取不到json数据的===
3.2
1.            HttpRequest request = HttpContext.Current.Request;
2.            Stream stream = request.InputStream;
3.            StreamReader streamReader = new StreamReader(stream);
4.            string json = string.Empty;
5.            json = streamReader.ReadToEnd();
这种⽅法在前两种的⽅法中已经提到过,⽤stream的⽅式获取⽅法⽐较通⽤,这个⽅法是万能的,v5===
后来想了想还是request是王道,其他的好多都是在他基础上扩展的,⽬前知道request主要有流和参数获取两种
===============================================================================================
有⼩伙伴们问get请求的事⼉,顺便写了下
第⼀种:json对象
1.    $(document).ready(function(){
2.        var data={
3.            "F_CODE": "1",
4.            "F_NAME": "xcy"
5.        };
6.        $.ajax({
7.            type: "get",
8.            url: "localhost:27110/test/formbody",
9.            cache: false,
10.            data: data,
11.            success: function (res) {
12.
13.            }
14.        });
15.
16.    });
第⼆种:url
1.    $(document).ready(function(){
2.        $.ajax({
3.            type: "get",
4.            url: "localhost:27110/test/formbody?F_CODE=1&&F_NAME=xcy",
5.            cache: false,
6.            data: data,
7.            success: function (res) {
8.
9.            }
10.        });
11.
12.    });
这⾥⼀定要将data⾥⾯设置为json对象,不要json.stringify加⼯,这样才能放到url链接后⾯,不然直接把json字符串放进去了,如下:
后台处理
第⼀种:与webapi⽆关
string name = HttpContext.Current.Request["F_CODE"];
第⼆种:webapi参数绑定
1.        [HttpGet]
2.        public IHttpActionResult formbody(string F_CODE)
3.        {
5.            return Ok(F_CODE);
6.        }
不是很难,注意⼀点的是get请求不⽤设置contenttype,因为contenttype是针对body的,既然body没了,contenttype⾃然没效果了。总结了⼀天的时间来搞post前台提交后台接受问题,基本⽤途够了,还需进⼀步理解,希望⼤⽜斧正==

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。