Параметр URL-адреса Laravel 5.1 ajax - это URL-адрес

Я впервые работаю с Laravel 5.1 и не могу понять, почему я получаю 404 при вызове ajax, который передает URL-адрес PHP-скрипту сервера в качестве параметра.

Я выполняю вызов Ajax, который обрабатывается маршрутом следующим образом:

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

Я хочу, чтобы переменная {act} содержала набор пар ключ/значение, которые я передаю. Я расшифровываю их в PHP на стороне сервера. PHP-скрипт Ajax содержит множество помощников, и я не хочу создавать маршрут Laravel для каждого.

В моем приложении пользователь вводит URL-адрес в поле формы, которое я фиксирую в переменной с именем website.

Мой вызов ajax должен принять:

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

Я делаю это, чтобы создать URL-адрес, который затем передаю вызову jQuery $.getJSON:

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

Я бы ожидал, что функция encodeURIcompponent() сделает эту работу, но она возвращает 404, когда любой из параметров содержит / символов до encodeURIComponent(). Мой базовый URL-адрес отлично работает без дополнительного URL-адреса в качестве параметра.

Но передавая URL-адрес как значение переменной, он выдает 404.

Вот как выглядит URL-адрес в вызове ajax, который возвращает 404:

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

Этот URL работает отлично (я удалил // из http://google.com:

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

Это также дает сбой, когда в переменной url есть дополнительные элементы пути, поскольку она содержит дополнительные символы /, например:

http://google.com/subfolder

Как передать полный URL-адрес в качестве параметра в вызове ajax? Спасибо!


person TheRealPapa    schedule 22.08.2015    source источник
comment
Вы имеете в виду, что второй URL-адрес, который вы сказали, работает, возвращает какой-то ответ?   -  person Ahmad Baktash Hayeri    schedule 22.08.2015


Ответы (2)


Я думаю, вы путаете параметры маршрута и параметры запроса. Ваш маршрут определен как ajax/{action}. В этом случае {action} является параметром маршрута, но вы пытаетесь вставить в него параметры запроса.

Например, если вы обращаетесь к URL-адресу http://my.app/ajax/act=url&u=google.com, это сработает, потому что вы выбрали маршрут ajax/{action}, где {action} равен act=url&u=google.com. Это значение, которое будет передано вашей функции AjaxController@helpers. Однако, поскольку эти данные передаются как параметр маршрута, их нет во входных данных запроса. $request->all() будет пустым.

Однако, если вы получите доступ к URL-адресу http://my.app/ajax/act=url&u=http://google.com, это не сработает, так как у вас не определен этот маршрут. Это не соответствует маршруту ajax/{action}; этот маршрут будет сопоставлен с ajax/{action}//google.com, который вы не определили (отсюда и 404).

Я думаю, что вы действительно ищете это: http://my.app/ajax/url?u=http%3A%2F%2Fgoogle.com. Это приведет к попаданию в ваш маршрут ajax/{action} с url в качестве параметра маршрута {action}, а значение URL будет в параметрах запроса. Внутри вашей функции AjaxController@helpers вы можете получить доступ к URL-адресу через $request->input('u');.

Редактировать

Если вам действительно нужно, чтобы эти данные поступали в качестве параметра маршрута, другой вариант, который вы должны сделать, чтобы ваш параметр маршрута потреблял все, включая косые черты:

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

Однако, если вы сделаете это, этот маршрут будет перехватывать все, что подпадает под http://my.app/ajax/....

person patricus    schedule 22.08.2015
comment
Привет @patricus Я понимаю. Дай мне попробовать! - person TheRealPapa; 22.08.2015
comment
@TheRealPapa Эта кодировка не имеет значения. Маршрутизатор Laravel декодирует URL-адрес перед его разбором. У вас не может быть косой черты в параметрах маршрута (закодированных или нет). - person patricus; 22.08.2015
comment
@TheRealPapa Я добавил еще одну альтернативу, которую вы можете попробовать, если вам действительно нужны данные в качестве параметра маршрута по сравнению с параметром запроса. - person patricus; 22.08.2015
comment
Я только что построил его, как ваше первое предложение (что имеет большой смысл), но я получаю сообщение об ошибке, когда код привязывается к присвоению значения из $request. $request-›input('u') завершается ошибкой, а $request содержит экземпляр класса, а не какое-либо значение параметра. - person TheRealPapa; 22.08.2015
comment
@TheRealPapa Это действительно новый вопрос. Можете ли вы опубликовать новый вопрос, показывающий обновленный маршрут и код контроллера? Прокомментируйте здесь, чтобы сообщить мне, когда вы разместили его, чтобы я мог попытаться помочь. Кроме того, если вы считаете, что этот ответ ответил на ваш первоначальный вопрос, отметьте его как таковой, чтобы будущие искатели могли с первого взгляда понять, что он полезен. - person patricus; 22.08.2015

Вы используете относительные пути со своей переменной URL (поскольку у вас есть / в начале вашего URL), что может вызвать ошибку 404 not found.

Попробуйте сохранить свой base url с помощью вспомогательного метода Laravel url() в скрытом поле в вашем представлении (вы можете сделать это в своем основном представлении, если хотите).

<input id='baseUrl' type='hidden' value='{{ url() }}' />

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

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

Затем добавьте этот URL-адрес в начало вашей переменной url следующим образом:

var url = baseUrl() + '/ajax/act=url&&u=' + encodeURIComponent(website);
person Ahmad Baktash Hayeri    schedule 22.08.2015
comment
Привет Ахмад, спасибо за ответ. URL-адрес вводится пользователем в поле формы. Ajax предназначен для проверки его достоверности и соответствия определенным требованиям формата. Мне нужно вытащить URL-адрес из ввода и передать его серверному сценарию. Laravel не генерирует URL для меня. Я думаю, что, возможно, я не был достаточно ясен в своем вопросе. Я внесу поправку. Я неправильно понял ваше предложение? - person TheRealPapa; 22.08.2015