Подтвердить что ты не робот

Получите доступ к URL-адресу запроса JQuery Ajax в функции обратного вызова

Есть ли способ увидеть URL-адрес, который был запрошен, когда я делаю запрос Ajax с помощью jQuery?

например.

var some_data_object = { ...all sorts of junk... }
$.get('/someurl.php',some_data_object, function(data, textStatus, jqXHR) {
   var real_url = ? # <-- How do I get this
})

Как я могу получить доступ к URL-адресу, который jQuery действительно использовал для выполнения запроса? Возможно, какой-то метод/свойство jqHXR? Я не смог найти его в документации.

Спасибо.

4b9b3361

Ответ 1

Задайте точку прерывания в методе успеха, затем просмотрите

this.url

- реальный url для запроса.

Ответ 2

Вот возможное решение:

  • Поймать вызов ajax до, он отправляется на сервер, реализуя функцию обратного вызова beforeSend.
  • Сохранить URL-адрес и данные
  • Сообщите об этом в появившемся сообщении об ошибке.

    var url = "";
    
    $.ajax({
      url: "/Product/AddInventoryCount",
      data: { productId: productId, trxDate: trxDate, description: description, reference: reference, qtyInCount: qtyInCount }, //encodeURIComponent(productName)
      type: 'POST',
      cache: false,
      beforeSend: function (jqXHR, settings) {
        url = settings.url + "?" + settings.data;
      },
      success: function (r) {
        //Whatever            
      },
      error: function (jqXHR, textStatus, errorThrown) {
        handleError(jqXHR, textStatus, errorThrown, url);
      }
    });
    
    function handleError(jqXHR, textStatus, errorThrown, url) {
       //Whatever
    }
    

Ответ 3

Использование $.ajaxPrefilter:

// Make sure we can access the original request URL from any jqXHR objects
$.ajaxPrefilter(function(options, originalOptions, jqXHR) {
  jqXHR.originalRequestOptions = originalOptions;
});

$.get(
  'http://www.asdf.asdf'
).fail(function(jqXHR){
  console.log(jqXHR.originalRequestOptions);
  // -> Object {url: "http://www.asdf.asdf", type: "get", dataType: undefined, data: undefined, success: undefined}
});

http://api.jquery.com/jQuery.ajaxPrefilter/

Ответ 4

Кажется, что глобальный обработчик ajaxSend (http://api.jquery.com/ajaxSend/) предоставляет URL-адрес в параметре параметров. Вы можете сохранить сопоставление от объекта xhr к URL-адресу в обратном вызове ajaxSend, а затем в своем обратном вызове выполнить его с учетом объекта xhr, который он предоставляет вам.

var mappings = {};

$.ajaxSend(function(event, xhr, settings) {
   mappings[xhr] = settings.url;
});

$.ajax({
  url: "http://test.com",
  success: function(data, textStatus, xhr) {
    console.log("url = ", mappings[xhr]);
    delete mappings[xhr];
  }
});

Это имеет то преимущество, что не нужно изменять каждый объект $.ajax().

Ответ 5

Я тоже не мог найти его в документах. Возможно, просто добавьте его в объект jqXHR через оболочку "прокси", например...

Я не тестировал это, поэтому вам может потребоваться позвонить $.param() и согласовать URL. См. http://api.jquery.com/jQuery.param/

var myGet = function(url, data, success) {
    $.get(url, data, function(data, textStatus, jqXHR) {
       jqXHR.origUrl = url; // may need to concat $.param(data) here
       success(data, textStatus, jqXHR);
    });
}

использование:

var some_data_object = { ...all sorts of junk... }
myGet('/someurl.php',some_data_object, function(data, textStatus, jqXHR) {
   var real_url = jqXHR.origUrl;
})

Ответ 6

FYI, как дополнение к комментарию airbai - я не могу прокомментировать его ответ, - вы можете добавить свои собственные данные к вызову и получить его внутри обратных вызовов. Таким образом, вам не нужно анализировать URL-адрес.

В этом примере JSONP-запрос я добавил переменную user_id (проверенную с помощью jQuery 3.2):

var request = $.ajax({
    dataType: "json",
    url: "http://example.com/user/" + id + "/tasks?callback=?",
    user_id: id,
    success: function(data) {
        console.log('Success!');
        console.log("User ID: " + this.user_id);
    },
    timeout: 2000
}).fail(function() {
    console.log('Fail!');
    console.log("User ID: " + this.user_id);
});