Domanda

Qual è la differenza tra l'utilizzo di:

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

vs

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

Nel primo caso ci si accede alla variabile nodo come parametro nella funzione di callback e nel secondo caso che ci si accede con $ _POST [ 'nodo'] giusto? Non sarebbe il secondo metodo è sempre meglio, ma vedo un sacco di persone che fanno la prima strada. Per non dire che il secondo modo è che sicuro sia. Ancora alla ricerca in token forma, ma cercando di capire questo po 'di base prima.

chiedendo anche per il caso 1, supponendo che questo ajax viene attivato da un pulsante, come si fa a fermare una persona di entrare direttamente nella URL, mysite / modulo / get / 20 e l'attivazione di esso? Si limita a verificare che $ _POST [ 'Ajax'] == true farlo? O c'è ancora un buco di sicurezza lì?

È stato utile?

Soluzione

Nessuna vera differenza a prima vista:

Supponendo che la variabile 'nodo' è solo un ID di nodo, non c'è molta differenza tra i due. Semanticamente, entrambi sembrano eseguire un'operazione di 'ottenere' (anche se sono richieste tecnicamente post), come hanno appena recuperare i dati senza modificare lo stato del server (ok, questa è un'altra ipotesi).

Sicurezza saggio, non v'è alcuna differenza rilevante sia - entrambi possono essere 'forgiato' facilmente e la differenza si riduce allo stesso come con la 'standard' GET vs dibattito post, cioè, alcuna differenza se non che i primi espone i parametri di un pochino di piu 'accessibili' a un osservatore casuale, in quanto sono in bella vista all'interno della URL.

Ma un 'convenienza' differenza all'interno di Drupal:

In Drupal, la prima versione si incontra spesso, perché può fare uso delle jolly Loader Argomenti funzionalità (introdotto nel Drupal 6). Diciamo che l'URL di richiamata è definito in hook_menu in questo modo:

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

Con questo, yourModule_callback() verrà chiamato con il suo primo parametro già essendo il nodo obect pieno carico per la passata nid, come dice %node Drupal per eseguire un node_load() sul parametro prima di consegnarlo alla funzione di callback. Utilizzando la seconda versione del vostro esempio, la funzione di callback dovrebbe caricare l'oggetto nodo stesso, dopo estraendola dai dati POST.

Quindi, una convenienza cosa qui.

Inoltre, un modello comune all'interno di Drupal è quello di utilizzare lo stesso URL callback per una richiesta AJAX che per la sua alternativa non javascript 'fallback'. Così, quando yourModule_callback() viene richiamato, si può fare tutto ciò che è destinato a fare con il passato in primo nodo, in fondo assemblare il suo risultato. Dopo che è fatto, controlla solo per $ajax == TRUE all'interno dei dati POST. Se è lì, si sa che il risultato è destinato ad una richiesta AJAX, quindi potrebbe uscita il risultato come JSON. Se non è lì, si sa che un ciclo di pagina intera è in corso, e può regolare la sua uscita di conseguenza (per esempio la ricostruzione di un modulo, rigenerando una pagina intera, qualunque cosa ...).

In questo modo, non c'è bisogno di registrarsi URL separati per le funzioni di callback non AJAX / AJAX.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top