it-swarm-eu.dev

Restituisci JSON usando Joomla Framework

Ho iniziato a creare un'applicazione Web usando Joomla Framework . Consiste in una semplice pagina Web che verrà visualizzata in un iFrame insieme a un'API che verrà utilizzata per aggiornare il contenuto con AJAX.

Ho seguito l'articolo Introduzione a Composer e Joomla! e ho installato App Framework funzionante. Ho personalizzato l'output HTML predefinito per lavorare con il mio iFrame e ho iniziato con l'API. Ho usato News come modello e ho creato un controller, un modello, una tabella e una vista per la mia API che funziona alla grande. Ho quindi creato un semplice Twig che restituisce una rappresentazione JSON dei miei dati in questo modo:

{{ items|json_encode|raw }}

Fin qui tutto bene, ma ho restituito questa intestazione che causerà problemi quando si utilizza AJAX con jQuery:

Content-Type:text/html; charset=utf-8

Ho pensato che sarebbe stato un semplice caso di aggiunta di questo, ma non importa dove l'ho messo, non cambia l'intestazione che viene restituita:

$this->app->setHeader('Content-Type', 'application/json', true);

So che setHeader funziona come se cambiassi il nome, vedo la nuova intestazione restituita, quindi presumo che verrà sovrascritto più avanti nell'esecuzione.

Quindi la mia domanda è: sto andando nel modo giusto? La mia vista estende DefaultHtmlView che sembra sbagliato, dovrei creare un DefaultJsonView? Come posso impostare il Content-Type corretto o esiste un approccio migliore per la restituzione di JSON?

Qualsiasi aiuto di consulenza che può essere dato sul modo migliore di utilizzare Joomla Framework per costruire un'API sarà molto apprezzato.

11
Joe P

Alla fine ho trovato quello che sembra essere il modo "corretto" per farlo. Anche se avessi usato sendHeaders, veniva aggiunto il tipo di contenuto aggiuntivo che veniva restituito come aggiunto successivamente.

Ho seguito il codice e AbstractWebApplication.php imposta le intestazioni con questa riga:

// Send the content-type header.
$this->setHeader('Content-Type', $this->mimeType . '; charset=' . $this->charSet);

Quindi sono stato in grado di definire il mio mimeType usando questo nel mio codice:

$this->app->mimeType = 'application/json';

Ora viene restituita l'intestazione corretta e jQuery comprende l'output come JSON!

6
Joe P

Ho preso un po 'di scavo ma vedo il problema

https://github.com/joomla-framework/application/blob/master/src/AbstractWebApplication.php

Se guardi la funzione setHeader in realtà non imposta ancora l'intestazione, la ottiene solo "pronta"

Quindi quello che devi fare è semplice

$this->app->setHeader('Content-Type', 'application/json', true)->sendHeaders();

La funzione extra sendHeaders() può essere concatenata per consentire di impostare le intestazioni, non solo di "prepararle".

Con molto probabilmente l'utilizzo di exit; per impedire ulteriori esecuzioni e produrre JSON, la funzione sendHeaders molto probabilmente non è in esecuzione.

3
Jordan Ramstad