在后台执行HTTP请求而不加载网页?

时间:2018-03-06 08:29:56

标签: javascript http get

所以这个第三方网站包含一个按钮,当点击该按钮时,它发送一个GET请求并执行一些服务器端任务,将登录用户的数据更新到其数据库中。必须在每个日历日执行该期望的任务。是否有另一种方法可以让本网站的服务器执行任务而不会在每个日历日加载页面?附加到该按钮的URL似乎使用REST API,因为按钮元素具有href URL,其中包含路径+参数。目前,我为其执行服务器端任务的解决方案是更改URL的参数并在新的浏览器选项卡中打开该URL。

更准确地说,网址看起来像这样:https://something.com/somepath/47240/6/sort?date=2018-03-06&crumb=JMBuREVDPqS 我发现只需将日期参数更改为第二天并在浏览器中加载该URL,该网站的服务器也会在第二天执行所需的任务。有没有办法让它在后台执行此任务而不为每天加载单独的选项卡或操作日期参数并在单独的选项卡中打开更新的URL唯一的解决方案?由于我当前的方法只是打开更新的日期URL,因此它纯粹是通过客户端代码实现的。所以我想知道仅使用客户端代码的替代解决方案。

3 个答案:

答案 0 :(得分:1)

  1. 生成您要呼叫的日期数组。
  2. 迭代每个日期,并向服务器发出请求。
  3. 完成请求后,选择下一个日期并进行处理。
  4. 以下是示例代码,您可以根据自己的情况进行修改。

      var url="https://something.com/somepath/47240/6/sort?date=";
      var date1 = new Date();
      var date2 = new Date(2018, 1, 1);
      var day;
      var between = [date1];
     //Generate the date array for which you want to run
      while(date2 <= date1) {
          day = date1.getDate()
          date1 = new Date(date1.setDate(--day));  
          between.push(date1);
      }
    //Covert date to string format for passing to the request url
    function formatDate(date) {
        var d = new Date(date),
            month = '' + (d.getMonth() + 1),
            day = '' + d.getDate(),
            year = d.getFullYear();
    
        if (month.length < 2) month = '0' + month;
        if (day.length < 2) day = '0' + day;
        return [year, month, day].join('-');
      }
    
      var callPage = function (dt) {
           return new Promise(function (resolve, reject) {
              var xhr = new XMLHttpRequest();
              var urlWithParam=url+ dt + "&crumb=JMBuREVDPqS";
              xhr.open('GET', urlWithParam, true);
              xhr.onload = function () {
                //Resolve the promise, so that next can be picked
                 resolve();
              };
    
            });
          };
        //Make the call for each date.
        for (var i = 0; i < between.length; i++) {
            callPage(between[i]).then(function () {
          });
        }
    

    如果您遇到CROSS DOMAIN请求问题,可以使用隐藏的iframe来完成此操作。

    &#13;
    &#13;
     var url="https://something.com/somepath/47240/6/sort?date=";
      var date1 = new Date();
      var date2 = new Date(2018, 1, 1);
      var day;
      var between = [date1];
     //Generate the date array for which you want to run
      while(date2 <= date1) {
          day = date1.getDate()
          date1 = new Date(date1.setDate(--day));  
          between.push(date1);
      }
    //Covert date to string format for passing to the request url
    function formatDate(date) {
        var d = new Date(date),
            month = '' + (d.getMonth() + 1),
            day = '' + d.getDate(),
            year = d.getFullYear();
    
        if (month.length < 2) month = '0' + month;
        if (day.length < 2) day = '0' + day;
        return [year, month, day].join('-');
      }
        
      var callPage = function (dt) {
        
        var iframe = document.createElement('iframe');
        var urlWithParam=url+ formatDate(dt) + "&crumb=JMBuREVDPqS";
        console.log("Request ->",urlWithParam);
        iframe.style.display = 'none';
        iframe.src = encodeURI(urlWithParam);
        document.body.appendChild(iframe);
      }    
        //Make the call for each date.
        for (var i = 0; i < between.length; i++) {
            callPage(between[i]);
        }
    &#13;
    &#13;
    &#13;

    Plunk

答案 1 :(得分:0)

使用Ajax

var http = new XMLHttpRequest();
var url = "Put url here";
var params = 'Put Params here'
http.open("POST", [url,params].join('?'), true);

答案 2 :(得分:0)

你可以做这样的事情

1)设置间隔以在一天内调用该函数

2)每天调用函数后必须动态增加日期

MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
converter.getObjectMapper().disable(MapperFeature.AUTO_DETECT_IS_GETTERS);