Ajax响应JSON数据到页面(koa框架)

如何响应JSON数据到页面?

如果服务端可以响应JSON数据到浏览器端,那么我们就可以通过Ajax拿到服务端响应给浏览器端的数据,拿到这个JSON数据后,我们就可以响应到页面中。

响应JSON数据到页面的三种形式:

DOM操作方式

DOM操作是HTML文档的编程接口。DOM将文档解析为一个由节点和对象组成的结果济河,也叫DOM树。简而言之,它会将Web页面和脚本语言连接起来使用。

常见的DOM操作API:createElement、append、prepend、before、after、remove

案例:

前端代码:

    <body>
        <table border="1" cellspacing="" cellpadding="">
            <thead>
                <tr>
                    <th>姓名</th>
                    <th>年龄</th>
                    <th>性别</th>
                </tr>
            </thead>
            <tbody>

            </tbody>
        </table>
        <script type="text/javascript">
            //DOM操作
            let tbody = document.querySelector('tbody')

            //Ajax请求
            let xhr = new XMLHttpRequest()
            xhr.onload = function() { //onload事件,服务器请求已经完成
                if (xhr.status == 200) {
                    //console.log(xhr.responseText) //获取响应的JSON数据
                    const data = JSON.parse(xhr.responseText) //解析拿到的JSON数据
                    //console.log(data.userList)

                    //DOM操作方法1:遍历JSON数据渲染到页面
                    // for(let i = 0;i < data.userList.length;i++){
                    //  let tr = document.createElement('tr')   
                    //      for(let attr in data.userList[i]){
                    //          let td = document.createElement('td')
                    //          console.log(data.userList[i][attr])
                    //          td.innerHTML = data.userList[i][attr]
                    //          tr.append(td)
                    //  }
                    //      tbody.append(tr)
                    // }

                    //DOM操作方法2:遍历JSON数据渲染到页面
                    for (let item of data.userList) {
                        //console.log(item)
                        let tr = document.createElement('tr')
                        for (let index in item) {
                            let td = document.createElement('td')
                            //console.log(item[index])
                            td.innerHTML = item[index]
                            tr.append(td)
                        }
                        tbody.append(tr)
                    }
                }
            }
            xhr.open('GET', '/userInfo', true)
            xhr.send()
        </script>
    </body>

后端代码

router.get('/userInfo', async (ctx ,next) => {
    console.log(ctx.request.query)
    ctx.body = {
        errCode: 0,
        errMsg: 'ok',
        userList: [
            {
                "userName":"苏列",
                "age":21,
                "gender":"男"
            },
            {
                "userName":"张三",
                "age":23,
                "gender":"男"
            },
            {
                "userName":"宋岚",
                "age":20,
                "gender":"女"
            }
        ]
    }
})

页面渲染效果:



ES6模板字符串拼接语法的操作方式

模板字符串使用反引号(``)来代替普通字符中用双引号和单引号,可以使用多行字符串和字符串的插值、拼接变量、添加H5标签功能,非常方便灵活。



案例:(只需将上面的前端代码作修改即可,服务端代码不用动)

    <body>
        <table border="1" cellspacing="" cellpadding="">
            <thead>
                <tr>
                    <th>姓名</th>
                    <th>年龄</th>
                    <th>性别</th>
                </tr>
            </thead>
            <tbody>
            </tbody>
        </table>
        <script type="text/javascript">
            //DOM操作
            let tbody = document.querySelector('tbody')
            //Ajax请求
            let xhr = new XMLHttpRequest()
            xhr.onload = function() { //onload事件,服务器请求已经完成
                if (xhr.status == 200) {
                    const data = JSON.parse(xhr.responseText) //解析拿到的JSON数据
                    //模板字符串拼接:
                    tbody.innerHTML = data.userList.map((item,i) => { //map遍历一步到位
                        console.log(item,i)
                        return `
                            <tr>
                                <td>${item.userName}</td>
                                <td>${item.age}</td>
                                <td>${item.gender}</td>
                            </tr>
                        `
                    }).join('')
                }
            }
            xhr.open('GET', '/userInfo', true)
            xhr.send()
        </script>
    </body>

页面渲染效果:



采用前端模板引擎进行改写方式,分离页面部分和逻辑实现部分,也就是现在的vue和react都借鉴的思想

模板引擎可以让(网站)程序实现界面和数据分离,使业务代码和逻辑代码分离开来,提升开发效率,这种模板引擎的设计,提高了代码的复用。

比较流行的前端模板引擎框架:
art-template、mustache、ejs、Handlebars.js、jQuery tmpl等...


安装art-template模板引擎

npm install art-template --save

安装完成后,打开依赖包 node_modules 找到art-template这个模块下,而我们需要的仅仅是template-web.js这个脚本文件,可以在script标签中单独引入使用。



复制一份放到koa框架下。



脚本引入
<script src="./javascripts/template-web.js" type="text/javascript" charset="utf-8"></script>

使用了模板引擎的前端代码:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <script src="./javascripts/template-web.js" type="text/javascript" charset="utf-8"></script>
    </head>
    <body>
        <table border="1" cellspacing="" cellpadding="">
            <thead>
                <tr>
                    <th>姓名</th>
                    <th>年龄</th>
                    <th>性别</th>
                </tr>
            </thead>
            <tbody>
            </tbody>
        </table>
        
        <!-- 模板引擎 -->
        <script id="tpl-tbody" type="text/html">
            {{each userList}}
            <tr>
                <td>{{$value.userName}}</td
                <td>{{$value.age}}</td>
                <td>{{$value.gender}}</td>
            </tr>
            {{ /each }}
            <!--{{ each userList }} ..... {{ /each }} 代表遍历循环开始和结束,可以看作标签 -->
        </script>
        
        <script type="text/javascript">
            //DOM操作
            let tbody = document.querySelector('tbody')
            //Ajax请求
            let xhr = new XMLHttpRequest()
            xhr.onload = function() { //onload事件,服务器请求已经完成
                if (xhr.status == 200) {
                    const data = JSON.parse(xhr.responseText) //解析拿到的JSON数据
                    tbody.innerHTML = template('tpl-tbody',data) //将拿到的data放入模板,然后渲染页面
                }
            }
            xhr.open('GET', '/userInfo', true)
            xhr.send()
        </script>
    </body>
</html>

预览:


效果

总结:


前面我们已经知道并实现了如何响应数据给浏览器,那浏览器是怎么发送JSON数据给服务端呢,让请求体携带JSON?显然这GET方式不可行,因为它不能携带发送JSON数据。

POST请求发送JSON数据

POST请求需要通过修改请求头信息,进行JSON数据的发送,通过serRequestHeader()方法进行设置。

请求头类型Content-Type需要设置为application/json
需要通过JSON.stringfy()转义JSON数据


案例:

前端代码:

        <script type="text/javascript">
            const xhr = new XMLHttpRequest()
            xhr.onload = function() {
                console.log('服务器请求完成')
            }
            xhr.open('POST','/userInfo',true)
            xhr.setRequestHeader('Content-Type','application/json')
            xhr.send(JSON.stringify({"userName":"秦明","age":21}))
        </script>

服务器代码:

router.post('/userInfo', async (ctx ,next) => {
    console.log(ctx.request.body) //通过request对象下的body进行接收
    ctx.body = 'userInfo'
})

Network控制台查看


POST状态,200成功

请求头信息



携带的JSON数据

再来看看后端有没有拿到浏览器POST过来的JSON数据。



总结:

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容