¿Cómo hacer que Laravel devuelva el encabezado “Tipo de contenido” de una vista como “aplicación/javascript”?

3 minutos de lectura

Estoy tratando de generar un archivo javascript dinámico para incluirlo desde sitios web externos con el [script src=""] etiqueta. Como la vista usa el motor Blade, se representa como text/html.

me gustaría el Content-Type encabezado que se establecerá en application/javascript para esta vista solo para evitar que Chrome me moleste con mensajes como “Resource interpreted as Script but transferred with MIME type text/html:

Mi controlador:

{
    // ...
    return View::make('embedded')->with('foo', $foo);
}

La vista en sí:

<?php
header('Content-Type: application/javascript; charset=UTF-8', true);
?>(function(jQuery) {
    // append stylesheets to <head>
    var file;
    // ...
})(jQuery);

He encontrado que puedo usar header() en mi opinión para agregar encabezados personalizados como X-Content-Type como era de esperar, sin embargo, cuando trato de redefinir el Content-Type encabezado no parece hacer nada incluso con el replace parámetro establecido como true.

Seguramente me estoy perdiendo algo obvio aquí, agradecería que me lo indiques 🙂

Muchas gracias por tu ayuda

Laravel le permite modificar la información del encabezado a través de la clase de respuesta, por lo que debe hacer uso de ella. Eliminar el header línea desde su vista y pruébelo así en su controlador:

$contents = View::make('embedded')->with('foo', $foo);
$response = Response::make($contents, $statusCode);
$response->header('Content-Type', 'application/javascript');
return $response;

  • Y, de manera realista, el controlador es el lugar ideal para jugar con los encabezados, no con la vista de todos modos;)

    – Granizo

    08/09/2013 a las 21:35

  • Esto no funciona.!!! Estoy obteniendo make () no definido, ya he heredado la respuesta.

    – sam

    28 de abril de 2017 a las 12:03

  • @sam: debería funcionar con Laravel 4, pero no con Laravel 5.

    – ciruvan

    3 mayo 2017 a las 14:05

En Laravel 5.4 puedes hacer esto:

$contents = view('embedded')->with('foo', $foo);
return response($contents)->header('Content-Type', 'application/javascript');

Por cierto, no hay necesidad de configurar el encabezado en la vista.

  • cuando probé este, obtuve “Método indefinido ‘encabezado’.intelephense (1013)”

    – Afeesudheen

    19 de junio de 2020 a las 15:41

En Laravel 5.6:

return response()
    ->view('embedded', ['foo' => $foo])
    ->header('Content-Type', 'application/javascript');

avatar de usuario de iconoclasta
iconoclasta

Si solo tiene JSON en una variable y desea enviarlo al navegador con el tipo de contenido adecuado establecido en el encabezado, todo lo que necesita hacer es esto:

return Response::json($json);

suponiendo, obviamente, que $json contiene su JSON.

Dependiendo de los detalles de su situación, podría tener más sentido usar vistas (en lugar de construir su JSON concatenando cadenas), pero esta sigue siendo una opción si usa una vista para construir la cadena. Algo aproximadamente a lo largo de estas líneas debería funcionar:

$json = View::make('some_view_template_that_makes_json') -> with ('some_variable', $some_variable)
return Response::json($json);

(¡Disculpas si me perdí alguna parte de la pregunta que requiere un enfoque más manual! Al menos esto debería ser útil para alguien que venga aquí y se pregunte cómo enviar JSON desde Laravel con el tipo de contenido correcto).

Response::json() ya no está disponible.

Puede usar respuesta->json() en su lugar.

use Illuminate\Contracts\Routing\ResponseFactory;
$foobar = ['foo' => 0, 'bar' => 'baz'];
return response()->json($foobar);

Da:

{"foo":0,"bar":"baz"}

Con los encabezados correspondientes.

  • A mi me funciono gracias 🙂

    – Harkor

    24 de marzo de 2017 a las 10:03

Avatar de usuario de Rolly
Rolly

esto funcionó para mí
return Response::view($landing)->header('X-Frame-Options', 'DENY');

  • A mi me funciono gracias 🙂

    – Harkor

    24 de marzo de 2017 a las 10:03

¿Ha sido útil esta solución?