前端往后端发送数据的几种方法

先来谈谈XmlHttpRequest对象

XmlHttpRequest对象的主要方法:

a. void open(String method,String url,Boolen async)
   用于创建请求

   参数:
       method: 请求方式(字符串类型),如:POST、GET、DELETE...
       url:    要请求的地址(字符串类型)
       async:  是否异步(布尔类型)

b. void send(String body)
    用于发送请求

    参数:
        body: 要发送的数据(字符串类型)

c. void setRequestHeader(String header,String value)
    用于设置请求头

    参数:
        header: 请求头的key(字符串类型)
        vlaue:  请求头的value(字符串类型)

d. String getAllResponseHeaders()
    获取所有响应头

    返回值:
        响应头数据(字符串类型)

e. String getResponseHeader(String header)
    获取响应头中指定header的值

    参数:
        header: 响应头的key(字符串类型)

    返回值:
        响应头中指定的header对应的值

f. void abort()

    终止请求

XmlHttpRequest对象的主要属性:

a. Number readyState
   状态值(整数)

   详细:
      0-未初始化,尚未调用open()方法;
      1-启动,调用了open()方法,未调用send()方法;
      2-发送,已经调用了send()方法,未接收到响应;
      3-接收,已经接收到部分响应数据;
      4-完成,已经接收到全部响应数据;

b. Function onreadystatechange
   当readyState的值改变时自动触发执行其对应的函数(回调函数)

c. String responseText
   服务器返回的数据(字符串类型)

d. XmlDocument responseXML
   服务器返回的数据(Xml对象)

e. Number states
   状态码(整数),如:200、404...

f. String statesText
   状态文本(字符串),如:OK、NotFound...

**原生jquery XMLHttpRequest 生成对象;

什么情况需要写原生jquery  例如:手机 手机流量缺失就不会先加载jquery

‘GET‘请求
function AjaxSubmit2() {
    var xhr = new XMLHttpRequest();

    //设置回调函数
    xhr.onreadystatechange = function (ev) {
        if (xhr.readyState == 4){
            //接收完毕服务器返回的数据
            console.log(xhr.responseText);
        }
    };
    xhr.open(‘GET‘,‘/ajax1?p=123‘);
    xhr.send(null)
}

‘POST‘请求 带上请求头 setRequestHeader
function AjaxSubmit2() {
    var xhr = new XMLHttpRequest();
    //设置回调函数
    xhr.onreadystatechange = function (ev) {
        if (xhr.readyState == 4){
            //接收完毕服务器返回的数据
            console.log(xhr.responseText);
        }
    };
    xhr.open(‘POST‘,‘/ajax1?p=123‘);
    xhr.setRequestHeader(‘Content-Type‘, ‘application/x-www-form-urlencoded; charset-UTF-8‘);
    xhr.send(‘P=234‘)
}

下面介绍一下 伪Ajax

Iframe+form 实现

其利用 iframe 【不刷新的特性】 和 form 【提交数据的特性】

<iframe id="iframe" name="ifra"></iframe>
<form id="fm" action="/ajax1.html" method="POST" target="ifra">
    <input name="root" value="111111" />
    <input type=‘submit‘ value=‘提交‘>
</form>

实现

什么时候iframe才开始取数据呢?引出第二种方法
当点击提交的时候才绑定事件

<iframe id="iframe" name="ifra"></iframe>
<form id="fm" action="/ajax1.html" method="POST" target="ifra">
    <input name="root" value="111111" />
    <a onclick="AjaxSubmit5()">提交</a>
</form>

function AjaxSubmit5() {
    document.getElementById(‘iframe‘).onload = reloadIframe; //在数据提交之间绑定事件
    document.getElementById(‘fm‘).submit();
}

function reloadIframe() {
    // this=当前标签
    //console.log(ths);
    //console.log(ths.contentWindow);
    //console.log(ths.contentWindow.document.body.innerHTML);
    //console.log($(ths).contents().find(‘body‘).html());
    var content = this.contentWindow.document.body.innerHTML;
    var obj = JSON.parse(content); //转换成对象 对象ret = {‘status‘:‘‘,‘message‘:‘‘}
    if(obj.status){
        alert(obj.message);
    }
}

再来介绍一下ajxa

jQuery.get(...)
                所有参数:
                     url: 待载入页面的URL地址
                    data: 待发送 Key/value 参数。
                 success: 载入成功时回调函数。
                dataType: 返回内容格式,xml, json,  script, text, html

            jQuery.post(...)
                所有参数:
                     url: 待载入页面的URL地址
                    data: 待发送 Key/value 参数
                 success: 载入成功时回调函数
                dataType: 返回内容格式,xml, json,  script, text, html

            jQuery.getJSON(...)
                所有参数:
                     url: 待载入页面的URL地址
                    data: 待发送 Key/value 参数。
                 success: 载入成功时回调函数。

            jQuery.getScript(...)
                所有参数:
                     url: 待载入页面的URL地址
                    data: 待发送 Key/value 参数。
                 success: 载入成功时回调函数。

            jQuery.ajax(...)

                部分参数:

                        url:请求地址
                       type:请求方式,GET、POST(1.9.0之后用method)
                    headers:请求头
                       data:要发送的数据
                contentType:即将发送信息至服务器的内容编码类型(默认: "application/x-www-form-urlencoded; charset=UTF-8")
                      async:是否异步
                    timeout:设置请求超时时间(毫秒)

                 beforeSend:发送请求前执行的函数(全局)
                   complete:完成之后执行的回调函数(全局)
                    success:成功之后执行的回调函数(全局)
                      error:失败之后执行的回调函数(全局)

                    accepts:通过请求头发送给服务器,告诉服务器当前客户端课接受的数据类型
                   dataType:将服务器端返回的数据转换成指定类型
                                   "xml": 将服务器端返回的内容转换成xml格式
                                  "text": 将服务器端返回的内容转换成普通文本格式
                                  "html": 将服务器端返回的内容转换成普通文本格式,在插入DOM中时,如果包含JavaScript标签,则会尝试去执行。
                                "script": 尝试将返回值当作JavaScript去执行,然后再将服务器端返回的内容转换成普通文本格式
                                  "json": 将服务器端返回的内容转换成相应的JavaScript对象
                                 "jsonp": JSONP 格式
                                          使用 JSONP 形式调用函数时,如 "myurl?callback=?" jQuery 将自动替换 ? 为正确的函数名,以执行回调函数

                                  如果不指定,jQuery 将自动根据HTTP包MIME信息返回相应类型(an XML MIME type will yield XML, in 1.4 JSON will yield a JavaScript object, in 1.4 script will execute the script, and anything else will be returned as a string

                 converters: 转换器,将服务器端的内容根据指定的dataType转换类型,并传值给success回调函数
                         $.ajax({
                              accepts: {
                                mycustomtype: ‘application/x-some-custom-type‘
                              },

                              // Expect a `mycustomtype` back from server
                              dataType: ‘mycustomtype‘

                              // Instructions for how to deserialize a `mycustomtype`
                              converters: {
                                ‘text mycustomtype‘: function(result) {
                                  // Do Stuff
                                  return newresult;
                                }
                              },
                            });

jQuery Ajax 方法列表

第二部分 通过ajax上传文件

1.JQuery
2.原生 XMLHttpRequest(send)
  以上两种方式可利用formData对象,来封装用户提交的数据
3.Iframe+Form

<input type="file" id=‘img‘>
1.formdata
function AjaxSubmit6() {
    //document.getElementById(‘img‘)[0]
    var data = new FormData();
    data.append(‘k1‘,‘v1‘);
    data.append(‘k2‘,‘v2‘);
    data.append(‘k3‘,document.getElementById(‘img‘).files[0]);

    $.ajax({
        url: ‘/ajax1.html‘,
        type: ‘POST‘,
        data:data, //本来这里是写字典的  ******现在用高级的方法****
        success:function (arg) {
            console.log(arg)
        },
        //需要加上这两个参数
        //这两个参数告诉jquery不用帮我处理数据 直接上传就行啦
        processData: false,  // tell jQuery not to process the data
        contentType: false  // tell jQuery not to set contentType

    })
}

2.formdata 可以帮忙封装数据 包括文件对象
function AjaxSubmit7() {
    var data = new FormData();
    data.append(‘k1‘,‘v1‘);
    data.append(‘k2‘,‘v2‘);
    data.append(‘k3‘,document.getElementById(‘img‘).files[0]);

    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function () {
        if(xhr.readyState == 4){
            // 接收完毕服务器返回的数据
            console.log(xhr.responseText);

        }
    };
    xhr.open(‘POST‘,‘/ajax1.html‘);
    xhr.send(data);
}
3.Iframe+Form 的上传文件
<iframe style="display: none" id="iframe1" name="ifra1"></iframe>
<form id="fm1" action="/ajax1.html" method="POST" enctype="multipart/form-data" target="ifra1">
    <input type="text" name="k1" />
    <input type="text" name="k2" />
    <input type="file" name="k3" />
    <a onclick="AjaxSubmit8()">提交</a>
</form>

function AjaxSubmit8() {
    document.getElementById(‘iframe1‘).onload = reloadIframe1;
    document.getElementById(‘fm1‘).submit();
}
function reloadIframe1() {
    var content = this.contentWindow.document.body.innerHTML;
    var obj = JSON.parse(content);
    console.log(obj);
}

总结:用哪种方法? 目前都可以用formData 考虑低版本就是iframe+Form(兼容性强)

第三部分:跨域Ajax------------------>JSONP

什么叫跨域:

由于浏览器存在同源策略机制,同源策略阻止从一个源加载的文档或脚本获取或设置另一个源加载的文档的属性。

特别的:由于同源策略是浏览器的限制,所以请求的发送和响应是可以进行,只不过浏览器不接受罢了。

浏览器同源策略并不是对所有的请求均制约:

  • 制约: XmlHttpRequest
  • 不制约: img、iframe、script等具有src属性的标签

跨域,跨域名访问,如:http://www.c1.com 域名向 http://www.c2.com域名发送请求。

解决方法:

巧妙的机制:JSONP(是一种方式 script+后端返回方法名+不断添加删除子标签
JSONP:
利用创建script块,在期中执行src属性为:远程url
由网站后端 提供一个函数返回值
function 函数(arg){

}

第一种: 利用script的src特性  可以跨域访问 后端返回函数 ----手动

view.py
def jsonp(request):
    return HttpResponse("func(‘我要上鸭王‘)"); #返回一个函数

.html
function submitJsonp3() {
    var tag = document.createElement(‘script‘);
    tag.src = ‘http://www.jxntv.cn/data/jmd-jxtv2.html?callback=list&tt=1454376870403‘;
    document.head.appendChild(tag);
    document.head.removeChild(tag);
}
# 写一个后端返回同名的函数
function func(arg) {
    console.log(arg);
}

第一种要自己写 ---------->引出第二种
第二种 JQuery 自动 生成script标签 但是拿到返回值就删除这个标签

view.py
def jsonp(request):
    return HttpResponse("func(‘我要上鸭王‘)"); #返回一个函数
test.html
function submitJsonp4() {
    $.ajax({
        url: ‘http://127.0.0.1:9000/xiaokai.html‘,
        type: ‘POST‘,
        dataType: ‘jsonp‘,
    })
}
# 写一个后端返回同名的函数
function func(arg) {
    console.log(arg);
}

第二种还有缺陷?我怎么知道后端返回的函数名
引出第三种 把函数放在访问url中

function submitJsonp4() {
    $.ajax({
        url: ‘http://127.0.0.1:9000/xiaokai.html?callback=func‘,
        type: ‘GET‘,
        dataType: ‘jsonp‘,
    })
}
# 写一个后端返回同名的函数
function func(arg) {
    console.log(arg);
}

但是这个还不够好 这里有个别人写好的

*******************引出别人写好的*****************************
def view(request):
    callback = request.GET.get(‘callback‘)
    return HttpResponse(‘%s("我要上鸭王")‘ %(callback,));

function submitJsonp4() {
    $.ajax({
        url: ‘http://127.0.0.1:9000/xiaokai.html‘,
        type: ‘GET‘, //写post 没有用 只能发get
        dataType: ‘jsonp‘,
        jsonp: ‘callback‘, //告诉后台这个key
        jsonpCallback: ‘func‘ //要返回这个函数名 ******
    })
}
function func(arg) {
    console.log(arg);
}    

原文地址:https://www.cnblogs.com/tangkaishou/p/9248706.html

时间: 2024-11-09 10:45:18

前端往后端发送数据的几种方法的相关文章

QTcpSocket 发送数据的几种方法

1.QTcpSocket 继承于QAbstractSocket继承于QIODevice 2.QTcpSocket 提供的几种接收和发送数据方法 write ( const char *, qint64 ) : qint64 write ( const char * ) : qint64 write ( const QByteArray & ) : qint64 writeData ( const char *, qint64 ) : qint64 read ( char * data, qint

前端向后端发送请求的几种方式

1.link标签的href属性 2.script标签的src属性 3.img标签的src属性 4.ajax发送请求 5.form 表单提交 6.a标签的href属性 7.iframe的src属性发送请求 参考:https://www.cnblogs.com/AmorR/p/8030133.html 原文地址:https://www.cnblogs.com/linhuaming/p/9130181.html

html向后端提交数据的几种方法

(未写完) 一 . 刷新页面 1. form表单提交 GET/POST 二. 局部刷新(不刷新页面) 1. Ajax 状态码: 0 - (未初始化)还没有调用send()方法 1 - (载入)已调用send()方法,正在发送请求 2 - (载入完成)send()方法执行完成 3 - (交互)正在解析响应内容 4 - (完成)响应内容解析完成,可以在客户端调用了 注:有一些便捷的方法可以不用完整的写ajax请求,例如AjaxForm请求 2. iframe+js(伪造Ajax请求) 其实是在页面开

向后端请求数据 以及像后端发送数据要求(删除数据和添加数据)

删除数据和添加数据只能后端操作 删除数据和添加数据都要用到的html(一)部分 <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="../css/bootstrap.min.css"

Spring MVC之中前端向后端传数据

Spring MVC之中前端向后端传数据 Spring MVC之中前端向后端传数据和后端向前端传数据是数据流动的两个方向, 在此先介绍前端向后端传数据的情况. 一般而言, 前端向后端传数据的场景, 大多是出现了表单的提交,form表单的内容在后端学习的md文档之中有所介绍,form标签的语法格式如下 <FORM NAME="FORM1" ACTION="URL" METHOD="GET|POST" ENCTYPE="MIME&qu

Node.JS的表单提交及OnceIO中接受GET/POST数据的三种方法

OnceIO 是 OnceDoc 企业私有内容(文档)管理系统的底层Web框架,它可以实现模板文件.静态文件的全缓存,运行起来完全不需要I/O操作,并且支持客户端缓存优化,GZIP压缩等(只压缩一次),拥有非常好的性能,为您节约服务器成本.它的模块化功能,可以让你的Web进行分布式存储,在一个扩展包里即可包含前端.后端和数据库定义,只需通过添加/删除目录的方式就可实现功能删减,实现真正的模块化扩展.目前 OnceIO 已经开源,本文主要介绍node.js语言中的表单提交及OnceIO中接受GET

用旭日图展示数据的三种方法

什么是旭日图? 旭日图(Sunburst Chart)是一种现代饼图,它超越传统的饼图和环图,能表达清晰的层级和归属关系,以父子层次结构来显示数据构成情况.旭日图中,离远点越近表示级别越高,相邻两层中,是内层包含外层的关系. 在实际项目中使用旭日图,可以更细分溯源分析数据,真正了解数据的具体构成.而且,旭日图不仅数据直观,而且图表用起来特别炫酷,分分钟拉高数据汇报的颜值!很多数据场景都适合用旭日图,比如,在销售汇总报告中,方便看到每个店铺的销售业绩分布(如下图): 做旭日图的三种方法 1. 用E

SpringMVC中controller返回json数据的两种方法

SpringMVC中controller返回json数据的两种方法 1.jsp的ajax请求: function getJson(){ $.ajax({ type:"get", dataType:"json", url:"<%=basePath %>getJson", success:function(data){ for(var i=0;i<jsonData.length;i++){ alert("Id:"

SQL Server 批量插入数据的两种方法

在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用Insert不仅效率低,而且会导致SQL一系统性能问题.下面介绍SQL Server支持的两种批量数据插入方法:Bulk和表值参数(Table-Valued Parameters). 运行下面的脚本,建立测试数据库和表值参数. [c-sharp] view plaincopy --Create DataBase create database BulkTestDB; go use BulkTes