Создание объекта, определяющего способ передачи данных через ajax-запрос

jQuery.ajaxTransport() — обрабатывает пользовательские настройки Ajax запроса или изменяет существующие настройки перед каждой отправкой запроса через $.ajax().

jQuery.ajaxTransport( dataType, handler )
  • dataTypes — название типа данных, который будет использоваться.м;
  • handler(options, originalOptions, jqXHR) — обработчик, который будет возвращать новый объект транспортировки с данными в первом аргументе.
    • options настройки текущего запроса;
    • originalOptions настройки по умолчанию (из ajaxSettings);
    • jqXHR объект jqXHR (в версиях до jquery-1.5, вместо него использовался XMLHttpRequest)

jQuery.ajaxTransport() представляет собой объект с двумя методами: send и abort, которые используются в методе $.ajax(). Данную настройку нужно использовать в крайнем случае, а так же только если предварительная фильтрация и преобразования являются недостаточными для достижения нужного эффекта.

Поскольку каждый запрос работает с своим собственным объектом транспорта, его нельзя задать напрямую. Вместо этого, вам нужно создать функцию, которая вернёт новый объект транспорта.

Генераторы транспорта регистрируются с помощью метода $.ajaxTransport(). Пример:

$.ajaxTransport( dataType, function( options, originalOptions, jqXHR ) {
  if( /* transportCanHandleRequest */ ) {
    return {
      send: function( headers, completeCallback ) {
        // Код отправки
      },
      abort: function() {
        // Код отмены
      }
    };
  }
});

где:

  • headers — объект (ключ/значение) для указания заголовков запроса, для передачи transport-объектом, если есть поддержка.;
  • completeCallback — функция обратного вызова, используется для уведомления AJAX о завершении запроса.

completeCallback имеет следующий синтаксис:

function( status, statusText, responses, headers ) {}

где:

  • status — статус HTTP-кода ответа, как например 200 для успешного запроса или 404 в случае, если ресурс не найден;
  • statusText — строка, параметр statusText из ответа;
  • responses — необязательный параметр, объект, содержащий dataType/value, который содержит ответ по всех форматах, который может обеспечить transport-объект (например, собственный XMLHttpRequest-объект будет установлен  в {xml: XMLData, text: textData} для ответа содержащий XML-документ);
  • headers — необязательный параметр, строка, содержащая все заголовки ответа, если transport имеет к ним доступ (схоже с XMLHttpRequest.getAllResponseHeaders())

Как и в случае использования jQuery.ajaxPrefilter(), jQuery.ajaxTransport() можно прикрепить к конкретному типу данных (dataType):

$.ajaxTransport( "script", function( options, originalOptions, jqXHR ) {
  // Will only be called for script requests
});

Пример реализации минимальными средствами транспорта изображения:

$.ajaxTransport( "image", function( s ) {
  if ( s.type === "GET" && s.async ) {
    var image;
    return {
      send: function( _ , callback ) {
        image = new Image();
        function done( status ) {
          if ( image ) {
            var statusText = ( status === 200 ) ? "success" : "error",
              tmp = image;
            image = image.onreadystatechange = image.onerror = image.onload = null;
            callback( status, statusText, { image: tmp } );
          }
        }
        image.onreadystatechange = image.onload = function() {
          done( 200 );
        };
        image.onerror = function() {
          done( 404 );
        };
        image.src = s.url;
      },
      abort: function() {
        if ( image ) {
          image = image.onreadystatechange = image.onerror = image.onload = null;
        }
      }
    };
  }
})

Взаимодействие с собственными типами данных

В реализация AJAX в jQuery имеется набор стандартных типов данных, таких как text, JSON, XML и HTML. Используйте параметр converters в jQuery.ajaxSetup(), чтобы дополнить или изменить метод обработки типа данных , используемых в jQuery.ajax().

Взглянув на стандартные правила конвертации, вы сможете понять как настроить свои:

// Список преобразователей данных
// 1) формат ключа(key): "исходный_тип конечный тип"
// (разделенные одиночным пробелом)
// 2) Символ "*" может быть использован для исходного_типа, объединяя все типы данных
converters: {
  // преобразовать любой формат в текст
  "* text": window.String,
  // текст в html (true = не трансформировать)
  "text html": true,
  // текст в json выражение
  "text json": jQuery.parseJSON,
  // текст в xml
  "text xml": jQuery.parseXML
}

Когда вы указываете параметр converters глобально в jQuery.ajaxSetup() или для каждого вызова jQuery.ajax(), объект будет вызываться конверторами по умолчанию, заменив те, которые переопределены и оставив остальные не тронутыми.

Например в исходниках jQuery используется jQeury.ajaxSetup(), что бы добавить конвертор «text script».

jQuery.ajaxSetup({
  accepts: {
    script: "text/javascript, application/javascript"
  },
  contents: {
    script: /javascript/
  },
  converters: {
    "text script": jQuery.globalEval
  }
});

 

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *