Drupal Ajax: передача значений по параметру url против data - PullRequest
3 голосов
/ 27 января 2010

В чем разница между использованием:

 $.ajax({
  type: 'POST',
  url: Drupal.settings.basePath + 'module/get/' + node,
  dataType: 'json',
  data: { 'ajax' : true }
 });

против

 $.ajax({
  type: 'POST',
  url: Drupal.settings.basePath + 'module/get',
  dataType: 'json',
  data: { 'ajax' : true, 'node' : node }
 });

В первом случае вы получите доступ к переменной узла в качестве параметра в функции обратного вызова, а во втором случае вы получите доступ к ней с помощью $ _POST ['node'], верно? Не будет ли второй метод всегда лучше, но я вижу, что многие люди делают это первым способом. Нельзя сказать, что второй способ также безопасен. Все еще изучаю токены форм, но сначала пытаюсь выяснить этот базовый бит.

Также интересно для случая 1, если предположить, что этот ajax запускается кнопкой, как вы мешаете человеку войти непосредственно в URL, mysite / module / get / 20 и активировать его? Делает ли это просто проверка $ _POST ['ajax'] == true? Или там все еще есть дыра в безопасности?

1 Ответ

4 голосов
/ 27 января 2010

Никакой реальной разницы с первого взгляда:

Предполагая, что ваша переменная 'node' является просто идентификатором узла, между ними нет большой разницы. Семантически оба, похоже, выполняют операцию get (даже если они технически отправляют запросы), поскольку они просто извлекают данные без изменения какого-либо состояния на сервере (хорошо, это другое предположение).

С точки зрения безопасности, нет и существенных различий - их можно легко «подделать», и разница сводится к тому же, что и при «стандартном» обсуждении GET и POST, то есть никакой разницы, за исключением первого параметры чуть более «доступны» для случайного наблюдателя, так как они находятся на виду в URL.

Но разница в «удобстве» внутри Drupal:

В Drupal часто встречается первая версия, поскольку она может использовать функциональность Аргументы подстановочных знаков (введена в Drupal 6). Допустим, ваш URL обратного вызова определен в hook_menu следующим образом:

$items['module/get/%node'] = array(
'title' => 'Foo',
'type' => MENU_CALLBACK,
'page callback' => 'yourModule_callback',
'page arguments' => array(2),
);

При этом yourModule_callback() будет вызываться с первым параметром, уже являющимся полностью загруженным объектом object для переданного nid, так как %node говорит Drupal выполнить node_load() для параметра перед передачей его функция обратного вызова. Используя вторую версию вашего примера, функция обратного вызова должна будет загрузить сам объект узла после извлечения его из данных POST.

Итак, удобство здесь.

Кроме того, общий шаблон в Drupal - это использование того же URL-адреса обратного вызова для запроса AJAX, что и для альтернативной альтернативы javascript. Поэтому, когда вызывается yourModule_callback(), он может делать все, что намеревается сделать с переданным узлом, в основном собирая его результат. После этого он проверяет только $ajax == TRUE в данных POST. Если он есть, он знает, что результат предназначен для запроса AJAX, поэтому он может вывести результат в виде JSON. Если его там нет, он знает, что происходит полный цикл страницы, и может соответствующим образом скорректировать вывод (например, перестроение формы, восстановление всей страницы, что угодно ...).

Таким образом, вам не нужно регистрировать отдельные URL-адреса для обратных вызовов не AJAX / AJAX.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...