记一次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请求的主要内容,如果未能解决你的问题,请参考以下文章

记一次curl post请求数据被截断问题处理

jmeter-post请求自动变成get,提示请求方式错误,修改协议即可

get请求不安全,那为什么不弃用get,直接用post 不就好了

ngxin做http强制跳转https,接口的POST请求变成了GET

SpringCloud Feign调用服务接口时,GET请求变成POST请求报错 _

jquery中使用ajax发送post请求变成get请求