XMLhttprequest, возвращающий пустой responseText и readyState == 4 (WickedPF) - PullRequest
2 голосов
/ 24 января 2020

Итак, у нас есть этот запрос HTTP-запроса в нашем проекте rails, который работает хорошо, все в порядке. он вызывает метод контроллера и возвращает значение из этого контроллера (в данном случае это будет "true" или "false")

var httpRequest;
    if (window.XMLHttpRequest) { // Mozilla, Safari, ...
      httpRequest = new XMLHttpRequest();
    } else if (window.ActiveXObject) { // IE
      try {
        httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
      }
      catch (e) {
        try {
          httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
        }
        catch (e) {}
      }
    }
    if (!httpRequest) {
      alert('Giving up :( Cannot create an XMLHTTP instance');
      return false;
    }
    httpRequest.open('GET', url);
    httpRequest.withCredentials = true;
    httpRequest.responseType = 'text';
    // httpRequest.setRequestHeader('Content-type', 'application/json');
    httpRequest.onreadystatechange = function(){
      $container.find('h4').html(JSON.stringify("Error"));
      if (httpRequest.readyState === 4) {
        $container.find('h4').html(JSON.stringify(httpRequest.response));
        // $container.find('h4').html(JSON.stringify("SUCCESS"));
      }
    };
    httpRequest.send();

Теперь мы хотим экспортировать это в pdf с гемом нечестивый-PDF. После борьбы с этим, поскольку Wicked PDF преобразует JavaScript в некоторые локальные файлы, и у нас были проблемы с вызовом метода контроллера, из-за CORS, теперь мы успешно вызываем метод контроллера, имеющий cook ie. Итак, метод вызывается, но responseText пуст, когда в нормальных условиях, как я говорил в начале, это не так, поскольку он правильно строит HTML.

Итак, запрос в порядке, доходит до метода контроллера и все делает, но, видимо, это не работает:

render :json => @status, :layout => false

, и я не знаю, почему я ' Я много об этом искал, и я застрял. Почему это работает в обычном проекте, но при попытке выполнить все это из локальных файлов, это не так, хотя и не дает никаких ошибок, журналы с рельсов таковы:

INFO -- : Started GET "/monitor/devicestatus_alarms/30" for ::1 at 2020-01-24 09:22:18 +0000
INFO -- : Processing by MonitorController#devicestatus_alarms as JSON
INFO -- :   Parameters: {"id"=>"30"}

INFO -- : Completed 200 OK in 45ms (Views: 0.2ms | ActiveRecord: 18.3ms)

Я пытался увеличить задержку javascript, потому что может потребоваться больше времени для выполнения вычислений в контроллере, но ничего. responseText по-прежнему пуст.

Кроме того, мы проверяли статус HTTP == 200, но затем мы обнаружили, что с локальными файлами при успешном завершении всегда возвращается статус 4, который, по-видимому, возвращается нет ошибок Итак, как этот запрос может получить доступ к методу контроллера, сделать все и вернуть ничего?

1 Ответ

0 голосов
/ 24 января 2020

Вы пытались использовать AJAX звонки, чтобы выполнить эту работу?

$.ajax({
  url: "<your_url>",
  type: 'GET',
  dataType: 'text',
  crossDomain: true,
  xhrFields: {
    withCredentials: true
  }
}).then(function (data) {
  < actions here >
  }
}).always(function () {
  < always action here>
});
...