为啥 POST 请求在 Microsoft Edge 中变为 GET 请求?

Posted

技术标签:

【中文标题】为啥 POST 请求在 Microsoft Edge 中变为 GET 请求?【英文标题】:Why does a POST request become a GET request in Microsoft Edge?为什么 POST 请求在 Microsoft Edge 中变为 GET 请求? 【发布时间】:2020-03-24 05:18:46 【问题描述】:

我在我的前端应用程序中使用 Axios 和 React。当我尝试使用 Axios (xhr, fetch) 通过 HTTPS 发送 POST 请求并遇到奇怪的问题时 - 我的 POST 请求在 Edge 开发工具中变成了 GET。

这是我的要求:

const response = await axios.post(
        config.local + "/api/login/credentials",
        
          login,
          password
        
      ); 

然后我尝试挖掘 dipper - 创建一个简单的 HTTPS 服务器并尝试从客户端发送 POST 请求。

const https = require('https');
const fs = require('fs');

const options = 
    key: fs.readFileSync('server.key'),
    cert: fs.readFileSync('server.crt')
;

const PORT = 8188;

function handleRequest(req, res)
    console.log(req.method);



const server = https.createServer(options, handleRequest);

server.listen(PORT, function()
    console.log("Server listening on: https://localhost:" + PORT);
);

然后,据我了解,该请求没有到达服务器。

这里有一些链接:

Issue link 1

Issue link 2

【问题讨论】:

【参考方案1】:

控制台有错误吗?您可以使用Fiddler 来跟踪网络流量并查看详细信息。在您提供的第一个链接中也提到过,您也可以在 GitHub 链接中尝试这两种解决方案:

Solution 1:

我的问题是由 HTTPS 引起的;当我从前端发送 HTTP 帖子时,后端需要 HTTPS。现在我通过将两者都更改为 HTTPS 来修复。

或Solution 2:

我通过使用“URLSearchParams”类以不同格式传递数据来解决这个问题。 我遇到了同样的问题: 微软边缘 44.18362.267.0 微软 Edgehtml 18.18362 视窗 10

我认为问题在于 Edge 仅支持 post 请求中的某些数据类型。如果您想使用内容类型“application/x-www-form-urlencoded”,请使用 URLSearchParams 使其在 Edge 和其他浏览器(如 Firefox 和 Chrome)中工作。传递查询字符串似乎在 Edge 中不起作用,即使在其他浏览器中也是如此。

修改原贴源代码,结果为:

import Axios from 'axios'
import Promise from 'es6-promise'
Promise.polyfill()
const URL= 'http://192.168.0.112/account/login/username'

// Use URLSearchParams instead:
const dataParams = new URLSearchParams()
dataParams.append('username', 'admin')
dataParams.append('password', 'admin')

Axios.post(URL, dataParams, 
  // if you still have problems try more specific options like:
  // withCredentials: true,
  // crossdomain: true,
  // ...
)
.then(res=>
    console.log(res)
    
)
.catch(error=>
    console.log(error)
    
)

除此之外,您问题中的问题通常是由 CORS 引起的。如果您使用 CORS 并请求不受信任的来源,那么 Microsoft Edge 将仅发送 GET 请求并导致其他请求失败。您还可以参考this thread 了解为什么 CORS 请求在 Microsoft Edge 中失败但在其他浏览器中有效。 Microsoft Edge 也使用Enhanced Protected Mode,结果是:如果站点受信任,它将发出两个请求,OPTIONSGET,但如果它不受信任,它只会发出 GET 请求,从而导致它失败。

【讨论】:

【参考方案2】:

在我的情况下,问题是由自签名证书引起的。一旦我开始使用普通证书,一切就开始工作了。

【讨论】:

以上是关于为啥 POST 请求在 Microsoft Edge 中变为 GET 请求?的主要内容,如果未能解决你的问题,请参考以下文章

为啥新版IE和Edge不支持CSS滤镜效果?

Webform中启用Microsoft.AspNet.FriendlyUrls引起post请求失效

使用 Microsoft.HttpClient 和 HttpContentExtensions 的通用 POST 请求

为啥在预检请求后 Chrome 不在开发工具网络选项卡上显示 POST 请求?

为啥来自 POSTMAN 的 POST 请求返回空?

为啥我的 post 请求返回 405 错误? [复制]