为了账号安全,请及时绑定邮箱和手机立即绑定

POST四种请求格式 前后端代码示例

标签:
SpringBoot

application/json

服务器端使用spring boot

@RestControllerpublic class GreetingController {    //解析application/json
    @RequestMapping(value = "/hello", method = RequestMethod.POST)    public Object getJson(@RequestBody Object obj) {        return obj;
    }

}

客户端,原生ajax

    var xhr = new XMLHttpRequest()

    xhr.onreadystatechange = function (ev) {        console.log(xhr.readyState);        if (xhr.readyState === 4){            if (xhr.status === 200){                console.log(xhr.responseText);
            } else {                console.error(xhr.statusText);
            }
        }
    };

    xhr.open('POST','/hello');
    xhr.setRequestHeader('Content-Type', 'application/json');
    xhr.send(JSON.stringify({ name:'zhuwei', age:'25', hobby:'ball'}))

浏览器请求详情


700

1534052079504.png

application/x-www-form-urlencoded

服务端,springboot

@RestControllerpublic class GreetingController {    //解析application/x-www-form-urlencoded
    @RequestMapping(value = "/helloFormUrl", method = RequestMethod.POST)    public String getForm(@RequestParam("name") String name,@RequestParam("age") String age) {        return "name="+name+"&"+"age="+age;
    }
}

客户端,html form 表单

<form action="/helloFormUrl" method="post">
    <input type="text" name="name">
    <input type="text" name="age">
    <input type="submit"></form>

或者使用 ajax

    var xhr = new XMLHttpRequest()

    xhr.onreadystatechange = function (ev) {        console.log(xhr.readyState);        if (xhr.readyState === 4){            if (xhr.status === 200){                console.log(xhr.responseText);
            } else {                console.error(xhr.statusText);
            }
        }
    };    
    //生成 post 参数 params,有三种方法,选一种
    //1. 使用URLSearchParams 接口,会对内容进行utf8编码
    const params = new URLSearchParams();
    params.append('name', '小明');
    params.append('age', '18');    
    //2.使用encodeURIComponent 对内容进行编码
    //好处是url中的汉字等一些特殊字符会被转为utf8编码,减少出错
    const params = "name="+encodeURIComponent("小明")+"&age="+encodeURIComponent("19")  
    
    //3.不编码直接写,可能服务端会解码错误
    const params = "name=小明&age=19"
   
    xhr.open('POST','http://localhost:1234/helloFormUrl');
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    xhr.send(params)

浏览器请求详情

700

1534052194567.png

multipart/form-data

1.发送键值对

服务端,springboot(和 application/x-www-form-urlencoded 的代码相同)

    @RequestMapping(value = "/helloFormUrl", method = RequestMethod.POST)    public String getForm(@RequestParam("name") String name,@RequestParam("age") String age) {        return "name="+name+"&"+"age="+age;
    }

客户端,ajax。

注意:

  1. 使用FormData()生成数据

  2. 不手动添加content-type请求头

    var xhr = new XMLHttpRequest()

    xhr.onreadystatechange = function (ev) {        console.log(xhr.readyState);        if (xhr.readyState === 4){            if (xhr.status === 200){                console.log(xhr.responseText);
            } else {                console.error(xhr.statusText);
            }
        }
    };   
    const params = new FormData();
    params.append('name', '朱维');
    params.append('age', '18');

    xhr.open('POST','http://localhost:1234/helloFormUrl');
   
    xhr.send(params)

700

1534061691216.png

2.发送文件

服务端代码

@CrossOrigin@RestControllerpublic class GreetingController {    @RequestMapping(value = "/helloFile", method = RequestMethod.POST)    public void getFile(@RequestParam("file") MultipartFile file) {
        System.out.print(file.getSize());
    }

}

客户端采用<input type=file>发送文件

注意:form需要加上enctype="multipart/form-data",因为form表单的默认编码方式是application/x-www-form-urlencoded

<form action="http://localhost:1234/helloFile" method="post" enctype="multipart/form-data">
    <input type="file" name="file">
    <input type="submit"></form>

text/plain

服务端

    @RequestMapping(value = "/helloText", method = RequestMethod.POST)    public void getText(@RequestBody String str) {
        System.out.print(str);
    }

客户端

    var xhr = new XMLHttpRequest()

    xhr.onreadystatechange = function (ev) {        console.log(xhr.readyState);        if (xhr.readyState === 4){            if (xhr.status === 200){                console.log(xhr.responseText);
            } else {                console.error(xhr.statusText);
            }
        }
    };

    xhr.open('POST','http://localhost:1234/helloText');
    xhr.setRequestHeader('Content-Type', 'text/plain');
    xhr.send('我是小明')

700

1534067062907.png

总结

  1. POST常用发送方式有四种,其实是http请求的四种content-type

  • application/json

  • application/x-www-form-urlencoded

  • multipart/form-data

  • text/plain

表单提交默认使用 application/x-www-form-urlencoded,可以通过设置enctype属性改变默认提交方式,表单不支持application/json类型。想发json类型的请求,只能通过ajax。

上传文件只能通过multipart/form-data,但multipart/form-data也可以传键值对

PS:本文并没有涉及太多的细节讲解,因为本人也是刚开始学习POST请求,所以总结了一些学习过程中做的demo代码,如果有写得不恰当的地方,还请指正。

Refrence

关于URL编码-阮一峰
Spring web annotations
阮一峰js标准参考教程-ajax



作者:朱小维
链接:https://www.jianshu.com/p/2ba4cde90e95


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消