为啥 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,结果是:如果站点受信任,它将发出两个请求,OPTIONS
和GET
,但如果它不受信任,它只会发出 GET
请求,从而导致它失败。
【讨论】:
【参考方案2】:在我的情况下,问题是由自签名证书引起的。一旦我开始使用普通证书,一切就开始工作了。
【讨论】:
以上是关于为啥 POST 请求在 Microsoft Edge 中变为 GET 请求?的主要内容,如果未能解决你的问题,请参考以下文章
Webform中启用Microsoft.AspNet.FriendlyUrls引起post请求失效
使用 Microsoft.HttpClient 和 HttpContentExtensions 的通用 POST 请求