使用原生$.ajax()发送post请求和$.post()请求的区别

jquary中的$.post()方法是对$.ajax()方法的一种封装 , 可以对使用$.ajax()发送post请求的过程做出一定的简化 , 但在使用SpringMVC的Controller中的方法接收封装前端传递的请求参数时 , 发现两者传递请求参数的方式并不一致. 于是我做了一组测试来对比两种异步请求方式的差异.

一. 编写前端页面

<body>
<script>
    $(function () {
        $("#form").submit(function () {
            var name = $("#name").val();
            var money = $("#money").val();
            //    发送异步请求
            $.post("account/post", {name: name, money: money}, function (account) {
                alert(account.id);
            }, "json");

            /* $.ajax({
                 type: "post",
                 url: "account/ajax",
                 contentType: "application/json;charset=utf-8",
                 data: JSON.stringify({name: name, money: money}),
                 dataType: "json",
                 success: function (data) {
                     alert(account.id);
                 }
             });*/
            return false;
        });
    });
</script>
<form id="form" action="account/save">
    姓名:<input id="name" type="text" name="name"><br>
    余额:<input id="money" type="number" name="money"><br>
    <input type="submit" name="提交">
</form>
</body>

二. 编写接收前端请求的Controller类

@Controller
@RequestMapping("/account")
public class AccountController {
    @Autowired
    private IAccountService accountService;
    
    @RequestMapping("/ajax")
    @ResponseBody
    public Account ajaxTest(@RequestBody Account account) {
        System.out.println("ajaxTest执行了...");
        accountService.save(account);
        return account;
    }

    @RequestMapping("/post")
    @ResponseBody
    public Account postTest(Account account) {
        System.out.println("postTest执行了...");
        accountService.save(account);
        return account;
    }
}

实体类和service就不码了 , 接下来通过更改调用$.ajax()和$.post()方法时传递的data参数的形式 , 来对比两种请求方式的差异

	直接获取表单项的属性值
	var name = $("#name").val();
  	var money = $("#money").val();
  	然后以{name: name, money: money}的形式传递键值对
  	这种参数本质上是一个js对象 , 异步请求方法如下:

发送$.post():

//post请求
 $.post("account/post", {name: name, money: money}, function (account) { 
 			alert(account.id);
 }, "json");

接收方法:

    @RequestMapping("/post")
    @ResponseBody
    public Account postTest(Account account) {
    	//保存账户并查询新增账户的id
        accountService.save(account);
        return account;
    }

运行结果:

在这里插入图片描述

发送$.ajax():

//ajax请求
$.ajax({
        type: "post",
        url: "account/ajax",
        contentType: "application/json;charset=utf-8",
        data:JSON.stringify({name: name, money: money}),
        dataType: "json",
        success: function (data) {
                     alert(account.id);
                 });

接收方法:

    @RequestMapping("/ajax")
    @ResponseBody
    public Account ajaxTest(@RequestBody Account account) {
    	//保存账户并查询新增账户的id
        accountService.save(account);
        return account;
    }

运行结果:

在这里插入图片描述

在这里插入图片描述

两种请求方式都成功传递并返回了数据 , 但区别在于:
1.请求方式:
$.post()发送json的形式为 {name: name, money: money}
$.ajax()发送json的形式为 JSON.stringify({name: name, money: money})
如果$.ajax()使用 {name: name, money: money}发送数据 , 会被浏览器解析为html类型参数 , 并且无法被Controller解析
在这里插入图片描述

2.解析方式
接收$.post()请求的方法直接使用 Account 类型封装了参数
接收$.ajax()请求的方法额外使用了 @RequestBody注解 , 从请求体中获取json数据 , 才将参数封装为 Account 类型

好的,这是一个使用原生 AJAX 发送 POST 请求的完整案例: HTML 代码: ``` <!DOCTYPE html> <html> <head> <title>使用原生 AJAX 发送 POST 请求</title> <meta charset="UTF-8"> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script> </head> <body> <h1>使用原生 AJAX 发送 POST 请求</h1> <form> <label for="name">姓名:</label> <input type="text" id="name" name="name"><br><br> <label for="email">邮箱:</label> <input type="email" id="email" name="email"><br><br> <button type="button" id="submit">提交</button> </form> <div id="result"></div> <script src="main.js"></script> </body> </html> ``` JavaScript 代码: ``` document.getElementById("submit").addEventListener("click", function() { var name = document.getElementById("name").value; var email = document.getElementById("email").value; var xhr = new XMLHttpRequest(); xhr.open("POST", "submit.php", true); xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhr.onreadystatechange = function() { if (this.readyState === XMLHttpRequest.DONE && this.status === 200) { document.getElementById("result").innerHTML = this.responseText; } }; xhr.send("name=" + name + "&email=" + email); }); ``` PHP 代码(submit.php): ``` <?php $name = $_POST["name"]; $email = $_POST["email"]; echo "姓名:" . $name . "<br>邮箱:" . $email; ?> ``` 注意:这个案例使用了 jQuery 库,但是只是为了方便引入 Ajax 库。实际上,这个案例并不需要 jQuery。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值