Il parametro Laravel 5.1 ajax url è l’url

Sto lavorando con Laravel 5.1 per la prima volta e non riesco a capire perché ottengo 404 in una chiamata ajax che passa un URL allo script PHP del server come parametro.

Sto eseguendo una chiamata Ajax gestita da un percorso come segue:

Route::get('ajax/{act}', ['uses' => '[email protected]', 'as' => 'ajax.helpers']); 

Voglio che la variabile {act} mantenga l’estensione delle coppie chiave / valore che passo. Decodifico questi nel PHP alla fine del server. Lo script Ajax PHP contiene una varietà di helper e non voglio creare una rotta Laravel per ognuno.

Nella mia app, l’utente inserirà un url in un campo modulo, che cattura in una variabile chiamata website

La mia chiamata ajax deve accettare:

     var url = '/ajax/act=url&u=' + website; 

    Lo sto facendo per creare l’url e poi passare a una chiamata jQuery $.getJSON :

     var url = '/ajax/act=url&&u=' + encodeURIComponent(website); 

    Mi aspetto che la funzione encodeURIcompponent() faccia funzionare, ma restituisce 404 quando uno dei parametri contiene / caratteri prima di encodeURIComponent() . Il mio URL base funziona perfettamente senza l’url aggiuntivo come parametro.

    Ma passando un URL come valore variabile, genera 404.

    Questo è l’url della chiamata ajax che restituisce 404:

     http://my.app/ajax/act=url&u=http%3A%2F%2Fgoogle.com 

    Questo URL funziona perfettamente (ho rimosso // da http://google.com :

     http://my.app/ajax/act=url&u=http%3Agoogle.com 

    Fallisce anche quando vi sono ulteriori elementi di percorso nell’url della variabile in quanto contiene caratteri aggiuntivi / , come nel modo seguente:

     http://google.com/subfolder 

    Come faccio a passare l’url completo come parametro nella chiamata ajax? Grazie!

    Penso che tu stia confondendo i parametri del percorso e i parametri di query. Il percorso è definito come ajax/{action} . In questo caso, {action} è un parametro route, ma stai provando a inserire i parametri di query in esso.

    Ad esempio, se accedi all’URL http://my.app/ajax/act=url&u=google.com , funzionerà perché hai colpito la rotta ajax/{action} , dove {action} è act=url&u=google.com . Questo è il valore che verrà passato alla funzione [email protected] . Tuttavia, poiché questi dati vengono passati come parametro di instradamento, non è nell’input della richiesta. $request->all() sarà vuoto.

    Tuttavia, se accedi all’url http://my.app/ajax/act=url&u=http://google.com , questo non funzionerà, poiché non hai definito questa route. Questo non si associa alla rotta ajax/{action} ; questa rotta verrebbe mappata su ajax/{action}//google.com , che non hai definito (da cui la 404).

    Penso che quello che stai davvero cercando sia questo: http://my.app/ajax/url?u=http%3A%2F%2Fgoogle.com . Questo colpirà la tua rotta ajax/{action} con url come parametro {action} route e il valore url sarà nei parametri della query. All’interno della tua funzione [email protected] , puoi accedere [email protected] tramite $request->input('u'); .

    modificare

    Se hai davvero bisogno che questi dati entrino come parametro del percorso, un’altra opzione devi assicurarti che il tuo parametro di percorso consumi tutto, comprese le barre:

     Route::get('ajax/{action}', ['uses' => '[email protected]', 'as' => 'ajax.helpers']) ->where('action', '.*'); 

    Se lo fai, tuttavia, questa rotta prenderà tutto ciò che rientra in http://my.app/ajax/...

    Stai utilizzando percorsi relativi con la tua url variable (dato che hai una leading / nel tuo URL), che potrebbe causare l’errore 404 non trovato.

    Prova a memorizzare l’ base url usando l’ url() metodo di helper di Laravel url() in un campo nascosto nella tua vista (potresti farlo nella tua vista principale se lo volevi).

      

    Puoi prendere il valore in modo semplice come creare una funzione helper JS come tale:

     var baseUrl = function(){ return $('#baseUrl').val(); }; 

    Quindi aggiungi l’URL all’inizio url variabile in questo modo:

     var url = baseUrl() + '/ajax/act=url&&u=' + encodeURIComponent(website);