Pregunta

¿Cuál es la diferencia entre usar:

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

frente a:

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

En el primer caso es posible acceder a la variable de nodo como un parámetro en la función de devolución de llamada y en el segundo caso es posible acceder a ella con $ _POST [ 'nodo'] ¿verdad? ¿No el segundo método siempre será mejor, pero veo un montón de gente que lo hace la primera forma. No quiere decir que la segunda manera es que sea seguro. Todavía estás en forma de fichas, pero tratando de averiguar esto poco básico en primer lugar.

También se pregunta para el caso 1, suponiendo que esto ajax se activa mediante un botón, ¿cómo detener a una persona de entrar directamente en la url, mysite / módulo / get / 20 y activarlo? Se limita a comprobar que $ _POST [ 'ajax'] == true hacer eso? O todavía hay un agujero de seguridad allí?

¿Fue útil?

Solución

No se diferencia a primera vista:

Si se asume que la variable de 'nodo' es sólo un identificador de nodo, no hay mucha diferencia entre los dos. Semánticamente, ambos parecen realizar una operación de 'conseguir' (a pesar de que son técnicamente las solicitudes de correos), ya que sólo recuperar los datos sin cambiar ningún estado en el servidor (bueno, eso es otra suposición).

Seguridad sabia, no hay ninguna diferencia relevante, ya sea - ambos pueden ser 'forjaron' facilidad y la diferencia se reduce a lo mismo que con el 'estándar' GET vs. debate posterior, es decir, no hay diferencia, excepto que las primeras revelaciones los parámetros de un poquito más 'accesibles' para el observador casual, ya que están a la vista dentro de la URL.

Pero una diferencia 'conveniencia' dentro de Drupal:

Dentro de Drupal, la primera versión se encuentra a menudo porque puede hacer uso de las Comodín cargador funcionalidad (introducido en Drupal 6). Digamos que su URL de devolución de llamada se define en hook_menu este modo:

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

Con esto, yourModule_callback() será llamada con su primer parámetro ya ser el obect nodo completamente cargado para el pasado en nid, como %node dice Drupal para ejecutar un node_load() sobre el parámetro antes de entregarlo a la función de devolución de llamada. Uso de la segunda versión de su ejemplo, la función de devolución de llamada tendría que cargar el propio objeto de nodo, después de extraerlo de los datos POST.

Así que una cosa conveniencia aquí.

Además, un patrón común dentro de Drupal es utilizar el mismo URL de devolución de llamada para una solicitud de AJAX como para su no javascript 'fallback' alternativa. Así que cuando se invoca yourModule_callback(), se puede hacer lo que se pretende hacer con el pasado en el primer nodo, básicamente, el montaje de su resultado. Después de eso se hace, sólo comprueba $ajax == TRUE dentro de los datos POST. Si está allí, se sabe que el resultado está destinado a una petición AJAX, por lo que podría enviar el resultado como JSON. Si no está allí, sabe que un ciclo completo de la página que está pasando, y puede ajustar su producción en consecuencia (por ejemplo, la reconstrucción de una forma, la regeneración de una página entera, lo que sea ...).

De esta forma, no tiene que registrar sus direcciones URL separadas para sus devoluciones de llamada no AJAX / AJAX.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top