Response :: json () отправляет html вместо json

Используя 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 код)?

1

Решение

Привет в основном с помощью 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;

Надеюсь, поможет…

0

Другие решения

Других решений пока нет …