Получите доступ к URL-адресу jQuery Ajax-запроса в функции обратного вызова. - PullRequest
50 голосов
/ 29 марта 2011

Есть ли способ увидеть 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?Я не смог найти его в документации.

Спасибо.

Ответы [ 6 ]

76 голосов
/ 29 марта 2011

Установите точку останова в методе успеха, затем посмотрите

this.url

является реальным URL для запроса.

16 голосов
/ 17 октября 2012

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

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

    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
    }
    
8 голосов
/ 25 сентября 2013

Использование $.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/

2 голосов
/ 10 апреля 2013

Кажется, что глобальный обработчик 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 ().

1 голос
/ 29 марта 2011

Я тоже не смог найти его в документах.Может быть, просто добавьте его в объект 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;
})
0 голосов
/ 29 марта 2017

К вашему сведению, как дополнение к комментарию 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);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...