ajax发送请求(原生js和jq方式,扩展表单序列化)

7 篇文章 0 订阅

前提知识
post请求常用的几种数据格式:

  1. urlencoded类型:通过请求头application/x-www-form-urlencoded;charset=UTF-8 提交的数据按照key1=val1&key2=val2格式发送请求
  2. json类型:通过请求头application/json;charset=UTF-8 用来告诉服务器消息主体是序列化后的JSON字符串{‘username’:‘张三’,‘password’:‘123456’},send里面如果是对象形式需要JSON.stringify转换成json再发送,如下xhr.send(JSON.stringify({username:zs,age:23}))
  3. formdata:通过请求头multipart/form-data;charset=UTF-8 通过表单文件上传文件时的类型,如new Formdata,服务端需要安装npm i multer,安装完以后,服务端需要配置,配置如下:
const multer = require('multer')
const multer = multer()
app.get('/login',multer.none(),function(){这时候就直接拿到数据了})

客户端配置如下方式:

<form action="">
        <input type="text" name="username" placeholder="账号">
        <input type="text" name="password" placeholder="密码">
        <input type="button" onclick="xj()" value="登录">
    </form>
    <script>
       function xj(){
        let from = document.forms[0]
        // console.log(from);
        let data=new FormData(from)

        console.log(data.get('username'));//获取到输入框账号密码
        console.log(data.get('password'));
       } 
    </script>

使用方法:
原生里:

//在send函数之前设置请求头content-type,作用是用来告诉服务端,客户端传递的参数什么类型的,服务端知道客户端传递的参数类型后,根据不同的参数类型,使用不同的解析方法
//xhr发送请求的时候,content-Type是: text/pLain; charset=UTF-8,服务端不知道怎么解析参数,所以我们需修改Content-type为application/x-ww-form-urLencoded,告诉服务端传递的参数是urLencoded类型

xhr.setRequestHeader('Content-type','请求头格式;charset=UTF-8')

在这里插入图片描述

原生js发送GET请求

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="">
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    <style>
        * {
            margin: 0;
            padding: 0;
            list-style: none;
            text-decoration: none;
        }

        #__bs_notify__ {
            display: none !important;
        }

        /*上面的选择器不要删,否则内置预览会有个黑色的块,在下方写页面其他选择器*/
    </style>
</head>

<body>
    <div class="xj1">文本内容</div>
    <button class="xj2">点击修改内容</button>

    <script>
        var xj2 = document.querySelector(".xj2")
        xj2.addEventListener("click", function () {
            // 定义一个新对象
            var xj = new XMLHttpRequest();

            //open发送的响应方式和响应地址(地址为后端服务器的映射地址)
            //参数一:发送的请求方式:get或者post请求
            //参数二:响应地址(地址为后端服务器的映射地址)
            xj.open("GET", "http://stuapi.ysdjypt.com/Home/GetIP")//这里的地址为获取本地的ip地址
            //将请求发送出去
            xj.send()


            //获取访问地址响应的数据
            //当请求被发送到服务器时,我们需要执行一些基于响应的任务。每当 readyState 改变时,就会触发 onreadystatechange 事件
            xj.onreadystatechange = function () {

                //readyState 浏览器响应的五种状态 
                //0:请求初始化,此时没有调用open的请求
                //1:请求已经建立但是还没有发送请求 send
                //2:请求发送 正在处理
                //3:请求在处理中,有部分数据可用
                //4:相应完成,可以获取浏览器的响应了

                //status:代表请求的状态
                //通常400-499为前端报错,500-599为后端报错,200为成功获取数据
                //举个例子,404为前端路径错误,500为后端代码报错崩溃


                //判断响应是否完成,并且判断是否成功获取数据
                if (xj.readyState == 4 && xj.status == 200) {
                    //满足条件,相当于数据已经有了,接下来将获取的数据写入到div中

                    //responseText代表响应的数据以文本形式获取出来

                    //document.querySelector(".xj1").innerHTML获取div的dom元素
                    document.querySelector(".xj1").innerHTML = xj.responseText
                }
            }
        })
    </script>
</body>

</html>

原生js发送post请求

后台服务器需要设置响应头,代码如下

res.setHeader('Access-Control-Allow-Origin', '*');

后台完整代码(这里使用的是node.js)

//导入web服务器http模块
const http = require("http")
//创建web 服务器实例
const sever = http.createServer((req, res) => {
    res.setHeader('Access-Control-Allow-Origin', '*');
    if (req.method == "POST") {
        // console.log("接收到post请求了");
        res.write(JSON.stringify({ code: 2, mag: "请求成功了" }));//只是写的,但是没响应
        res.end();//代表响应结束
    }
})

//启动服务器,第一个参数代表端口号,第二个回调函数
sever.listen(80, function () {
    console.log("开启 http://127.0.0.1 这个端口号");

})

js代码

<script>
        // GET 请求方式常用于获取服务器的数据,而 POST请求方式常用于向服务器发送数据,可携带参数量较大。
        //1.创建请求连接
        var xhr = new XMLHttpRequest();
        //2.创建请求连接
        xhr.open("POST", "http://127.0.0.1")
        //3.设置请求头,用于定义请求体数据类型
        //application/x-www-form-unlencoded:告诉服务器,请求体中的数据是查询字符串的类型.'key=value&key=value'
        //application/json 代表请求体中的数据类型为json字符串格式.
        //multipart/from-data:以特定分隔符分割的数据:常用于文件上传.
        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')//默认情况下,不设置请求头,请求体中的数据默认是查询字符串的类型
        //4.发送请求
        xhr.send("username=jinweizhe&password=123456");//参数为post请求方式的请求体.(可以是查询字符串数据,json字符串数据,以特定分隔符分割的数据)
        xhr.onreadystatechange = function () {
            if (xhr.readyState == 4 && xhr.status == 200) {
                //请求请求发送完成,并且请求成功了
                let data = JSON.parse(xhr.responseText)
                console.log(data);
            }
        }
    </script>

jQueryAjax发送GET请求

例子一
 <script>
 		//$.get\$.post\$.ajax方法会返回给一个deferred类型对象;deferred:延迟
        // deferred类型对象有一个方法done,是异步操作成功的回调函数
        //deferred类型对象有一个方法fail,是异步操作失败的回调函数
        // deferred类型对象有一个方法always ,是异步操作完成的回调函数
		
		//get请求
        $.get("http://123.57.142.211:8080/api/goodList?page=1").done(function(resDate){
            //done成功的回调函数
            console.log(resDate);
            console.log("请求成功了");
        }).fail(function(e){
            //fail请求失败的回调函数
            console.log(e);
            console.log("请求失败了");
        }).always(function(c){
            //无论成功还是失败,请求完成的回调函数
            console.log("请求完成了");
        })

		//post请求
		 $.post("http://123.57.142.211:8080/api/goodList", { page: 1 }).done(function (resDate) {
            //done成功的回调函数
            console.log(resDate);
            console.log("请求成功了");
        }).fail(function (e) {
            //fail请求失败的回调函数
            console.log(e);
            console.log("请求失败了");
        }).always(function (c) {
            //无论成功还是失败,请求完成的回调函数
            console.log("请求完成了");
        })

		//通用Ajax请求
		$.ajax({
            type:"GET",
            url:"http://123.57.142.211:8080/api/goodList?page=1",
            //data:{}//post请求体数据
            //header:{}//请求头数据
        }).done(function (resDate) {
            //done成功的回调函数
            console.log(resDate);
            console.log("请求成功了");
        }).fail(function (e) {
            //fail请求失败的回调函数
            console.log(e);
            console.log("请求失败了");
        }).always(function (c) {
            //无论成功还是失败,请求完成的回调函数
            console.log("请求完成了");
        })
    </script>
例子二
<button>发请求</button>
    <script>
        $("button").click(function () {
            // $.get({})
            // $.post({})
            // $.ajax({})//通用
            //参数:配置对象,配置字段如下:
            //type:请求方式,默认get;
            //url:请求地址(get请求查询字符串需要在url+?字符串拼接,post请求参数放在请求体中)(post请求的参数放到data内)
            //headers:对象;请求头数据对象
            //success:请求成功的回调函数
            //error:请求失败的回调函数
            //complete:不管请求成功还是失败都会触发的回调函数

            // $.ajax({
            //     type: "GET",
            //     url: "http://123.57.142.211:8080/api/goodList?page=1",
            //     // data:{post请求内多参数}
            //     // data:"post请求单参数"
            //     success(resData) {
            //         console.log("请求成功");
            //         console.log(resData);
            //     },
            //     error(error) {
            //         console.log("请求失败");
            //         console.log(error);
            //     },
            //     complete() {
            //         console.log("请求完成了");
            //     }
            // })

            //get请求简写
            //参数一:url+?query
            //参数二:成功的回调函数
            // $.get("http://123.57.142.211:8080/api/goodList?page=1", function (resdata) {
            //     console.log(resdata);
            // });


            //post请求简写
            //参数一:url
            //参数二:请求体数据
            $.post("http://stuapi.ysdjypt.com//common/index", { cmdld: "xiao" },function(resdata){
                console.log(resdata);
            })
        })
    </script>

jq发送post请求

后台服务器需要设置响应头,代码如下

res.setHeader('Access-Control-Allow-Origin', '*');

后台完整代码(这里使用的是node.js)

//导入web服务器http模块
const http = require("http")
//创建web 服务器实例
const sever = http.createServer((req, res) => {
    res.setHeader('Access-Control-Allow-Origin', '*');


    //post请求
    //获得请求体数据
    //需要监听请求的data事件&end事件


    //每当前端发送过来请求体数据,会触发data事件,注意:数据量大时,data事件会多次触发.
    //定义变量保存接收到的数据
    let totalData = "";
    req.on("data", (data) => {
        // console.log(data);//Buffer的格式编码了,实际上就是请求体数据
        totalData += data;
    })

    //前端请求体发送完成时会触发end事件
    req.on("end", () => {
        //decodeURI()中文解码
        console.log("请求体数据接收完毕....", decodeURI(totalData));
        let data = new URLSearchParams(decodeURI(totalData))
        console.log(data);
    })



    if (req.method == "POST") {
        console.log("接收到post请求了");
        res.write(JSON.stringify({ code: 2, mag: "请求成功了" }));//只是写的,但是没响应
        res.end();//代表响应结束
    }
})

//启动服务器,第一个参数代表端口号,第二个回调函数
sever.listen(80, function () {
    console.log("开启 http://127.0.0.1 这个端口号");

})

jq代码

 <script>
 		//第一种方式
        // $.post("http://127.0.0.1", {
        //     name: "xiaoji",
        //     sex: "男"
        // }, function (data) { 
        //     console.log(data);
        // })

        //第二种方式
        $.ajax({
            type: "POST",//请求方式
            url: "http://127.0.0.1",//请求路径
            data: {
                name: "xiaoji",
                age: 20,
                sex: "男"
            },//请求体数据,自动转换为字符串格式
            contentType: "application/x-www-form-urlencoded",//定义请求体数据类型,默认请求体数据为查询字符串格式.
            dataType: "json",//定义响应体类型(响应的数据类型,一般是json格式)
            headers: {},//请求头
            success(data) {//请求成功后的回调函数
                console.log(data);
            }
        })
    </script>

扩展表单序列化

<form action="">
        <input type="text" name="username" autocomplete="off" placeholder="请输入账号"><br>
        <input type="text" name="passworld" autocomplete="off" placeholder="请输入密码"><br>
        <input type="submit" value="登录">
    </form>
    <script>
        $("form").submit(function (e) {
            e.preventDefault();//阻止事件默认行为
            // let un = $("[name=username]").val()
            // let pwd = $("[name=passworld]").val()
            // console.log(un,pwd);

            //将数据序列化(采用特定格式组织数据),以key-value形式展现出来
            //username=123&passworld=111
            let inpVals = $(this).serialize();
            console.log(inpVals);

            //快速获取表单控件的值;注意︰表单控件必须添加name属性。否则无法获取到value。
            $.get("http://localhost:8080?" + inpVals, function (a) { console.log(a); })
        })
    </script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

萧寂173

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值