提取POST在Edge v42 +中不起作用

时间:2018-08-22 18:22:30

标签: javascript post fetch

我知道此后我会失去很多人,但是仅在最新版本的MS Edge 42.17134.1.0中会发生此错误。至少我们可以使用某些较旧的版本(包括41.x)可以正常工作

我只是使用Fetch API将登录凭据发布到服务器,但从未进行调用。 Edge只是完全跳过了呼叫。

这似乎不是Fetch的问题,因为我尝试了jQuery和$ post,并且其行为完全相同。这是代码,当然带有伪造的凭证。您会注意到,在其他所有浏览器(甚至是IE)上,它都会返回相应的错误用户名/密码错误。

document.getElementById("basicFetchButton").addEventListener("click", function(){
  return fetch('http://fldvd-apinet01.ad.nova.edu/appcentral/appcentral/auth/token', {
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded',
    },
    body: 'grant_type=password&client_id=appcentral&username=user&password=test',
    method: 'POST'
  }).then((data) => {
    if (data.ok) {
      return data.json();
    }
    return data.json()
      .then((err) => {
        throw err;
      });
  });
});

这里是指向JsFiddle

的链接

任何想法或建议将不胜感激。

1 个答案:

答案 0 :(得分:0)

对不起,我迟到了。在使网站与Edge 41(EdgeHTML 16)和Safari 10向后兼容的同时,我们遇到了fetch的本机Edge版本的问题。

我们的问题是站点上存在cookie,并且与服务器上存储的cookie匹配,但是在我们的fetch请求期间,某些cookie并未传输。真是头疼与您的问题不太一样,但是解决方案可能会为您提供帮助。

它的不足之处是安装了fetch polyfill(polyfill的源),并修改了执行polyfill的条件。

在这里读书带给我我的主意GitHub dgraham 建议在
中为fetch包装一个polyfill if (self.fetch && self.Headers.prototype.entries) {

这对我不起作用,因为我的目标是仅在以下情况下加载polyfill:
1)self.fetch不存在。
2)“ self.fetch”确实存在,但它是Edge的EdgeHTML版本。

我们如何确定self.fetch存在,但用户正在使用EdgeHTML版本查看?我发现Edge版本41.16299-44.18362(最新的EdgeHTML版本)执行!!self.Headers.prototype.entries.prototypetrue。使用BrowserStack.com或VM Win10计算机在Edge 40、41、42、44版本上对此进行了测试。

大多数其他浏览器以false的身份执行测试。以下是对此测试执行false的浏览器列表:

  • Chrome v42
  • Chrome v79
  • FF v44
  • FF v73
  • Safari v10.1
  • Safari v13.0

dgraham 返回GitHub上的帖子。某些浏览器的确具有fetchHeaders的本机代码,而!!self.Headers.prototype.entries的测试结果为false。因此 dgraham 是正确的,我们需要对此进行测试。在执行false时,我发现测试过!!self.Headers.prototype.entries的浏览器列表为:

  • Edge v40(EdgeHTML 15.15063)
  • FF v40

很抱歉这么长。这是我将fetch polyfill包裹在其中的代码:

var loadPoly = false
if(!self.fetch){loadPoly = true}
if(!loadPoly && !self.Headers.prototype.entries){loadPoly = true}
if(!loadPoly && !!self.Headers.prototype.entries.prototype){loadPoly = true}
if(!!loadPoly){...