Используя Laravel 4, return Response::json(array('foo' => 'bar'))
используется в одном контроллере будет возвращать фактический application/json
тогда как в другом контроллере для другого действия он вернет text/html
, Оба действия вызываются через Ajax.
в неисправный контроллер, Я попытался форсировать тип содержимого с помощью этого фрагмента:
[...]
$response = Response::json($data);
$response->header('Content-Type', 'application/json');
$response->header('Content-Foo', 'Bar'); // test if additional headers are really set
Log::info($response);
return $response;
… в то время как рабочий контроллер возвращает правильный ответ Json с:
return Response::json($data);
В обоих, $data
это массив (проверено).
Зарегистрированный ответ Из неисправного контроллера есть:
HTTP/1.0 200 OK
Cache-Control: no-cache
Content-Foo: Bar
Content-Type: application/json
Date: Wed, 17 Sep 2014 10:55:03 GMT
Но получил ответ (в Firebug / DevTools) это:
Connection Keep-Alive
Content-Type text/html
Date Wed, 17 Sep 2014 10:55:03 GMT
Keep-Alive timeout=5, max=93
Server Apache/2.2.25 (Unix) mod_ssl/2.2.25 OpenSSL/0.9.8y DAV/2 PHP/5.5.3
Transfer-Encoding chunked
X-Powered-By PHP/5.5.3
Я пытался напрямую вернуться Response::json(array('foo' => 'bar'))
в начале действия неисправного контроллера, но он по-прежнему отправляет ответ как text/html
,
Я хотел бы знать, почему тип контента будет переключаться с application/json
в text/html
без причины? А почему ложный заголовок отсутствует в полученном ответе?
Проблема, кажется, находится вокруг валидатора.
public function faultyAction()
{
if(!Request::ajax()) App::abort(405);
$validator = Validator::make(
array('trackfile' => Input::file('trackfile')),
array('trackfile' => 'required|audio')); // audio is a custom validator
if($validator->fails())
{
Log::info('validation failed!');
return Response::json(array('code' => 1, 'message' => 'File validation has failed.'));
}
else
{
Log::info('validation passed!');
return Response::json(array('code' => 0, 'filename' => 'test'));
}
}
… возвращается text/html
ответ пока проверка пройдена.
public function faultyAction()
{
if(!Request::ajax()) App::abort(405);
$validator = Validator::make(
array('trackfile' => Input::file('trackfile')),
array('trackfile' => 'required|audio')); // audio is a custom validator
return Response::json(array('code' => 0, 'filename' => 'test'));
}
… возвращается application/json
,
Как получается, что один и тот же ответ возвращается с различным типом содержимого в зависимости от того, где он вызывается в коде?
Пусть это придет $validator->fails()
(даже если кажется, что ничто не изменяет заголовки или печатает что-то в Laravel Validator.php
код)?
Привет в основном с помощью Response :: json () с массивом данных в качестве параметра достаточно.
Повторное определение заголовка Content-type бесполезно, Response :: json должен установить его по умолчанию.
Я создаю JSON ответы на свой проект прямо сейчас, и пока все прошло хорошо.
Просто чтобы прояснить, неисправный контроллер возвращает правильное значение с неправильным заголовком типа контента, верно?
Можете ли вы попробовать еще раз, используя просто Response :: json, и можете ли вы сказать, какую именно версию laravel вы используете?
Привет еще раз, я редактирую свой первый ответ на основе ваших ответов:
Вы должны проверить что-то вроде этого:
$ json = json_encode ($ yourArray);
// сначала проверяем переменную $ json с помощью var_dump () oro Log :: info (), чтобы узнать, есть ли у вас проблемы с пространством. Тогда вы можете создать ответ.
$ response = Response :: make ($ json, 200);
$ response-> header (‘Content-Type’, ‘application / json’);
вернуть $ response;
Надеюсь, поможет…
Других решений пока нет …