美文网首页
HTTP系列 -- JSONP

HTTP系列 -- JSONP

作者: bowen_wu | 来源:发表于2018-01-06 08:51 被阅读24次

参考代码

概述

数据库是用来长久储存数据的。

发送请求

form 表单提交

缺点:刷新页面 + 用户后退 + 用户刷新 = 数据变动

form + iframe 提交

form 表单提交到 iframe 中,页面不会刷新。
缺点:用户刷新页面 ==> 数据变动

JS动态创建 img 标签

```
let img = document.createElement('img');
img.src = '路径'
img.onload = function(){}  ==>  HTTP状态码
img.onerror = function(){}  ==>  HTTP状态码
```

通过路径,在 Nodejs 中设置成功或者失败,之后返回状态码,前端通过返回的HTTP状态码,进而来判断成功失败。

动态创建 script 标签

```
let script = document.createElement('script');
script.src = '路径';
document.body.appendChild(script);
script.onload = function(){}
script.onerror = function(){}
```
  • 通过设置响应头中的类型进而来确定返回内容的格式(第四部分),从而保证返回的是 JavaScript 代码。
  • 当创建 script 标签插入 body 后,返回的内容会立即执行,之后再去执行 onloadonerror 事件,所以说 onload 可以进行删除, 之后将处理逻辑交给后端(处理逻辑中应该包括使用完 script 标签之后立刻删除),但是此时前后端耦合。
  • scriptsrc 属性可以访问其他地址

JSONP

动态创建 script 并调用前端传给后端的 callback 技术

版本一

Nodejs:
response.write(` callback.call(undefined,' success ') `);
JS:
window.callback = function(){}  //返回之后进行处理
script.src = http://....../路径?callback = xxx

版本二

Nodejs
response.write(` ${ query.callback }.call(undefined,{
    "success": true,
    "left": ${ newAmount }
}) `)

返回的数据是 JSON 数据
特点:

  • 请求方创建 scriptsrc 属性指向响应方
  • 响应方根据查询参数,构造形如 xxx.call(undefined,"传给前端的数据") 这样的响应。

JSONP

什么是 JSONP

请求方:前端(浏览器)
响应方:后端(服务器)

  1. 请求方创建 scriptsrc 指向响应方,同时传入一个查询参数 ?callback = 随机数
  2. 响应方根据查询参数 callback ,构造形如 随机数.call(undefined,"传给前端的数据") 这样的响应
  3. 浏览器接收到响应,就会执行 随机数.call(undefined,"传给前端的数据")
  4. 请求方获取到数据

完整代码

JS
button.addEventlistener('click', (e) => {
    let script = document.createElement('script');
    let functionName = 'bowen' + parseInt(Math.random()*100000,10);
    window[ functionName ] = function(result){
        if( result === 'success' ){
            // do something
        }else{
            // do something
        }
    }
    script.src = 'http://....../路径?callback = ' + functionName
    document.body.appendChild( script );
    script.onload = function(event){
        event.currentTarget.remove();
        delete window[ functionName ]
    }
    script.onerror = function(){
        alert('fail');
        event.currentTarget.remove();
        delete window[ functionName ]
    }
})
jQ:
button.addEventListener('click',(event) => {
    $.ajax({
        url: 'http://....../路径',
        dataType: 'jsonp',
        success: function( response ){
            // do something
        }
    })
})

套路:为什么 JSONP 不支持 POST 请求

JSONP 是动态创建 script 标签 + 传入 callback 查询参数,script 标签,只能发送 GET 请求,不能使用 POST。

相关知识点

如果后端没有写

response.write(` ${ query.callback }.call(undefined,{
    "success": true,
    "left": ${ newAmount }
}) `)

前端虽然有响应内容,但是使用不到

相关文章

网友评论

      本文标题:HTTP系列 -- JSONP

      本文链接:https://www.haomeiwen.com/subject/pnienxtx.html