美文网首页Web前端之路
用前后端代码验证 GET 与 POST 的区别

用前后端代码验证 GET 与 POST 的区别

作者: 老邵 | 来源:发表于2019-05-24 12:23 被阅读0次

HTTP 的 GET 与 POST 方法,有以下几个明显的区别:

  • 在浏览器回退的时候,GET 请求不会重新发送,而 POST 请求会重新发送。
  • GET 请求会被浏览器主动缓存,而 POST 不会。
  • GET 的请求参数直接暴露在 URL 中,相对不隐私、不安全。POST 请求的参数放在请求体中,相对隐私、安全。
  • GET 的请求参数会被保存到浏览器的历史记录中,POST 不会。
  • GET 请求参数有大小限制,一般 2KB 左右。POST 理论上没有传递参数没有大小限制,有些后端服务及会有一个大小限制,比如 Tomcat 的大小限制为 2M。

总结起来就是三点,大小、是否缓存与重发、安全性。

下面我用代码来验证 GET 与 POST 的这些区别。

首先用 nodejs 编写后端的请求处理代码。

const http = require('http')
const url = require('url')
const qs = require('querystring') //用于解析参数
const fs = require('fs')

let server = http.createServer((req, res) => {
let pathname = url.parse(req.url).pathname;

res.writeHead(200, {
    'Content-Type': 'application/json',
    'Access-Control-Allow-Origin': '*'
});

if (req.method === 'GET') {
    
    fs.readFile(`${__dirname}/http.html`, function(error, file) {
        if (error) {
            console.log(error)
        } else {
            res.writeHead(200, {
                "Content-Type": "text/html"
            });
            res.write(file, function(err) {
                res.end();
            });
        }
    })
} else if (req.method === 'POST') {

     fs.readFile(`${__dirname}/http.html`, function(error, file) {
        if (error) {
            console.log(error)
        } else {
            res.writeHead(200, {
                "Content-Type": "text/html"
            });
            res.write(file, function(err) {
                res.end();
            });
        }
    })

}

})

server.listen(8088, () => {
    console.log('server start 8088')
})

然后再编写 HTML 文件,JavaScript 也写到 HTML 文件中。

<!DOCTYPE html>
<html>
<head>
    <title>http</title>
    <style type="text/css">
    </style>
</head>
<body>
<button class="get">get</button>
<button class="post">post</button>
<form action="http://localhost:8088" method="get">
    <label for="POST-name">Name:</label>
    <input id="POST-name" type="text" name="name">
    <input type="submit" value="Save">
</form>
<a href="./http2.html">http2.html</a>
<script type="text/javascript">
function ajax(url, method, data, callback) {

    let xhr = new XMLHttpRequest();

    xhr.onreadystatechange = function() {
        if (xhr.readyState === 4) {
            if (xhr.status >= 200 && xhr.status <= 300 || xhr.status === 304) {
                callback(xhr.responseText);
            } else {

            }
        } else {

        }
    }

    xhr.open(method, url, true);

    if (method === 'post') {
        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    } else {

    }

    xhr.send(data || null);
}

function get() {
    ajax('http://localhost:8088?name=666g&password=456', 'get', void 0, function(res) {
        let data = JSON.parse(res);
        console.log(data.name);
    })
}

function post() {
    ajax('http://localhost:8088', 'post', 'name=hahap&password=123', function(res) {
        let data = JSON.parse(res);
        console.log(data.name);
    })
}

let getBtn = document.querySelector('.get');
let postBtn = document.querySelector('.post');

getBtn.addEventListener('click', function() {
    get();
})
postBtn.addEventListener('click', function() {
    post();
})
</script>
</body>

</html>

提交数据后如果返回本页面,点击浏览器的后退并提交或刷新页面,会导致 form 表单重复提交。

通过这两段代码的以下表现,可以验证 GET 与 POST 的区别:

  • 在表单提交方法为 post 时:

    1. 提交后刷新页面, 会出现重新提交。
    2. 提交后访问另一个页面 http2.html,回退时重新提交。
    3. url 中没有参数。
    4. 两次以上 post 之后,回退会重新 post。
  • 在表单提交方法为 get 时:

    1. 提交后刷新页面 ,会出现重新提交。
    2. 提交后访问另一个页面 http2.html,回退时重新提交。
    3. url 中有参数,且会保存到历史记录中。
    4. 两次以上 get 之后,回退不会重新 get。(也就是说回退到一个有过 POST 的页面时,那个 POST 会重新发送)。

PS: 通过 Ajax 实现的请求不会重新提交。

Piotr Łaskawski 2016-08-11 02-53-44.jpg

相关文章

网友评论

    本文标题:用前后端代码验证 GET 与 POST 的区别

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