postman使用POST,却收到的是GET请求

现象:

可以看到我们postman发出的确实是post请求,message却报错这个接口不支持get请求,说明服务器实际上收到的是一个get请求。

产生原因分析

如果我们访问的是线上的接口,线上的nginx一般都会对http访问做一个302重定向,跳转为https访问。

如果我们正常访问一个页面,它会把http跳转为https,之后由https访问的接口就都是https的了。但如果我们用postman直接访问接口,nginx会响应一个302状态码,并且把重定向的地址存放在响应头Location中。我们的客户端(一般为浏览器,此处为postman)收到302状态码后就会去找Location这个响应头,完成跳转操作。

产生原因验证

通过跳板机查看了测试环境nginx的配置:

复制代码
location / {
            rewrite ^(.*) https://$server_name$1 permanent;
        }
1

rewrite模块最后的flag是permanent,是301重定向,并不是我们推测的302。不过301处理请求的方式是与302相同的,会把post请求转为get请求。

解决方法

如果我们不指定前缀,则默认是http://,因此解决方法是在我们的请求url最前面加上https:// 即可

知识拓展

大部分浏览器会将301、302的post转为get

303的规范强制规定将post请求转为get请求

307规范要求继续向Location地址中post内容

308同样禁止浏览器将post请求转为get请求

301与308对应,302与307对应,307、308分别是前者的禁止转get版本。

也就是说nginx如果使用的是307、308跳转,也就不会出现这样的问题了。当然如果我们没有相应的业务场景,没有必要为了解决postman的问题而使用307、308状态码。

相关推荐
AI云原生13 小时前
在 openEuler 上使用 x86_64 环境编译 ARM64 应用的完整实践
java·运维·开发语言·jvm·开源·开源软件·开源协议
科普瑞传感仪器13 小时前
航空航天制造升级:机器人高精度力控打磨如何赋能复合材料加工?
java·前端·人工智能·机器人·无人机·制造
q_191328469513 小时前
基于SpringBoot2+Vue2的宠物上门服务在线平台
java·vue.js·spring boot·mysql·宠物·计算机毕业设计·源码分享
CoderYanger13 小时前
动态规划算法-两个数组的dp(含字符串数组):42.不相交的线
java·算法·leetcode·动态规划·1024程序员节
小蝙蝠侠13 小时前
async-profiler 火焰图宽度是否可信?哪些情况下会误导?(深度解析)
java·性能优化
IT_Octopus13 小时前
java多线程环境下 安全地初始化缓存(避免缓存击穿),同时兼顾性能 的双重检查锁方案
java·spring·缓存
Li_76953213 小时前
Spring Cloud —— SkyWalking(四)
java·spring cloud·skywalking
while(1){yan}13 小时前
多线程CAS八股文
java·开发语言·面试
zfj32113 小时前
Docker和容器OCI规范的关系
java·docker·eureka
李拾叁的摸鱼日常13 小时前
从 Java 8 升级视角看Java 17 新特性详解
java·后端