记一次HTTP POST请求变成GET请求
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记一次HTTP POST请求变成GET请求相关的知识,希望对你有一定的参考价值。
参考技术A客户端发起的HTTP POST请求, 到达服务器后请求方法莫名其妙变成了GET请求, 导致客户端收到的是404。
于是尝试将问题定位在nginx转发上, 马上重现问题, 并且观察Nginx日志, 发现转发时出现了如下日志:
从上面的日志可以看出:
由此可以确定: 问题的出现是因为Nginx的转发使HTTP方法类型发生了变化。
那么Nginx为什么会把POST请求转换成GET请求呢?注意上面的第一行日志中有301的字样, 301状态码的意思是: 资源位置永久改变, 需要重定向 , 通常用于将HTTP请求迁移到HTTPS。
到这里, 回头看看Nginx的配置文件, 文件中配置了 listen 443 ssl , ssl_certificate , ssl_certificate_key 等参数, 即Nginx配置的是HTTPS服务, 所有请求将以HTTPS访问, 对于HTTP请求, 将会被以HTTPS的形式重定向。
再看看客户端发起请求的URL, 确实是HTTP请求, 所以触发了重定向, 也就导致了问题的产生。
即使通过Nginx将HTTP转换成了HTTPS, 这里也并没有解释为什么POST会变成GET请求, 这里就需要祭出著名的《图解HTTP》中关于状态码的解释了:
书中关于 3xx 状态码的解释:
1. 301-Moved Permanently(永久性重定向), 该状态码表示请求的资源已经被分配了新的URI, 以后应使用资源现在所指的URI, 也就是说如果已经把资源对应的URI保存为书签了, 这时应该按Location首部字段提示的URI重新保存。
2. 302-Found(临时重定向), 该状态码表示请求的资源已经被分配了新的URI, 希望用户(本次)能使用新的URI访问。和301不同的是, 302不是永久移动, 只是临时性质的, 也就是已移动的资源对应的URI将来还有可能发生改变, 如果URI被保存为书签, 用户不需要更新书签。
3. 303-See Other(存在另一个URI), 该状态码表示请求的资源存在着另一个URI, 应使用GET方法定向获取请求的资源。303和302功能相同, 但303明确表示客户端应当采用GET方法获取资源。比如, 当使用POST方法访问时, 其执行后的处理结果是希望客户端能以GET方法重定向到另一个URI上去, 则返回303状态码。
4. 304-Not Modified(未满足条件的URI), 该状态码表示客户端发送附带条件的请求时, 服务器允许请求访问资源, 如果未满足条件, 则返回304。
5. 307-Temporary Redirect(临时重定向), 该状态码与302有相同的意义, 302禁止POST变换成GET, 但是在实际使用中, 大家并不遵循, 仍然将POST转换成了GET。307会遵照标准, 不会从POST变成GET。
注: 当301、302、303状态码返回时, 几乎所有的浏览器都会把POST改成GET, 并删除请求报文内的主体, 之后请求会自动再次发送。即使301, 302禁止将POST方法改成GET方法, 但实际使用中大家仍然将其改成了GET。
到这里, 原因已经很明了了。
对于这里的问题场景, 我们不希望POST请求被改成GET请求, 则解决方法有:
记一次HTTP POST请求变成GET请求
解决vue 问题 post 请求发送 会变成发送get请求
参考技术A eg:
原本路由:
http://localhost:8080/login_phone?phoneNum=13259964092
想要跳转到 : http://localhost:8080/#/home
但是实际上却跳转到:
http://localhost:8080/login_phone?phoneNum=13259964092#/home
遍寻全网找解决方法,依然没得结果,然后找到一个好像是问题的原因:
vue-router 默认 hash 模式 —使用 URL 的 hash 来模拟一个完整的 URL,于是当 URL 改变时,页面不会重新加载,对于正常的页面来说,更换 url 一定是会导致页面的更换的, 而只有更换 url 中的查询字符串和hash值的时候才不会重新加载页面。
所以解决方法就是去掉了hash模式,就是下面这句,在router文件中添加 mode:\'history\' 。
个人感觉这不是个好方法,但是它的确解决了问题。那就这样吧!
ps: 后来发现原因是 form表单的默认提交,但是如果不去处理,post 请求的时候,会发出一个get请求。 很大的bug!!! 之前一直不知道原因,真是让人头大。
其实,这也不算一个问题,而是算自己的一个bug,之前一直存在,不知道是问什么,后来才发现是 form的默认提交 问题。
解决方法:
总有很多的bug, 我好难啊!
以上是关于记一次HTTP POST请求变成GET请求的主要内容,如果未能解决你的问题,请参考以下文章
jmeter-post请求自动变成get,提示请求方式错误,修改协议即可
get请求不安全,那为什么不弃用get,直接用post 不就好了
ngxin做http强制跳转https,接口的POST请求变成了GET