基于电子的 XMLHttpRequest 和基于浏览器的 URL 与查询字符串的区别?

Difference between Electron-based XMLHttpRequest and browser-based URL with query string?

我正在开发 Electron 应用程序并尝试集成 Easy Digital Downloads Software Licensing WordPress 插件。我在 Electron/Javascript 的 HTTP 交流方面做得不多,所以这可能是一个幼稚的问题。

问题:我能够从我的 EDD 服务器获得许可证激活响应,虽然没有特定错误,但由于某种原因许可证未激活。奇怪的是,如果我在具有相同数据的浏览器中使用 URL 和查询字符串,插件会按预期响应:我可以激活、停用和检查许可证的状态。

所以 EDD 似乎工作正常,Electron 没有错误。但有些东西不见了。最初我使用的是 net Electron module but after this issue came up, I switched to using the example script from EDD(下图),它使用 XMLHttpRequest。这样我得到了以下回复:

{"success":true,"license":"valid","item_id":539,"item_name":"My Awesome App","license_limit":1,"site_count":0,"expires":"2020-12-19 23:59:59","activations_left":1,"checksum":"f2d66c6844b37d1fa931b813c408", "payment_id":248,"customer_name":"Marvin Gardens","customer_email":"marvin@home.com","price_id":false}

这很好,除了 "activations_left":1 永远不会改变,它应该给出 "license_limit":1。所以有问题。

另一方面,如果我在浏览器中使用带有查询字符串的 URL,则 "activations_left" 会递减,并且许可证激活只能工作一次(应该如此)。例如,这有效:

http://YOURSITE.com/?edd_action=activate_license&item_id=8&license=cc22c1ec86304b36883440e2e84cddff&url=http://licensedsite.com

我的问题:这两种方法有什么根本区别吗?有什么我需要添加到我的 XMLHttpRequest 中的吗?我有一张 EDD 打开的支持票,但我需要继续前进。很抱歉这么啰嗦!


更新:
@aw04 建议我尝试使用 GET – 刚刚尝试过,我 "get" 得到了与以前相同的响应:没有错误,但也没有激活。

是否有一些 属性 应该(或不应该)在 Electron 请求中,默认情况下在浏览器请求中(或不在)?

 xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function () {

    if (this.readyState === XMLHttpRequest.DONE && this.status === 200) {
      console.log('xhttp.responseText', xhttp.responseText);
    }
  }

  var url = "http://YOURSITE.com/?edd_action=activate_license&item_id=8&license=cc22c1ec86304b36883440e2e84cddff"
  xhttp.open("GET", url);
  xhttp.send();

var xhttp = new XMLHttpRequest();
var postUrl = 'http://<domain.com>/edd-sl/';

xhttp.onreadystatechange = function() {
    if (xhttp.readyState == 4 && xhttp.status == 200) {
        console.log(xhttp.responseText);
    }   
}

var data = {
    edd_action: 'check_license', 
    license:    '<license key>',
    item_name:  encodeURIComponent('<item name>'),
};

xhttp.open("POST", postUrl, true);
xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhttp.setRequestHeader("Access-Control-Allow-Origin", "http://local.dev");

var values = '';
for (var key in data){
    values += key + '=' + data[ key ] + '&';
}
values = values.substring(0, values.length - 1);
xhttp.send(values);

根据 Easy Digital Downloads 支持人员的一些帮助,此问题已解决。

该问题与 Software Licensing 插件设置中的 属性 有关:"Do not check URL"。我没有启用它,结果是我从 Electron 调用的 API 失败了,而使用浏览器的调用成功了,因为浏览器添加了 headers 而 Electron 没有。

启用 "Do not check URL" 后,来自 Electron 的调用可以正常工作。我想还有一个选项可以传递 URL,但由于我使用 EDD 来许可桌面软件,所以这似乎不是一个必需的选项。

无论如何,希望这对某人有所帮助。