2013-02-13 13 views
13

Attualmente sono in grado di ottenere l'host dallo request, che include dominio e porta opzionale. Sfortunatamente, non include il protocollo (http vs https), quindi non posso creare URL assoluti per il sito stesso.Play Framework 2.1: Scala: come ottenere l'intero URL di base (incluso il protocollo)?

object Application extends Controller { 
    def index = Action { request => 
    Ok(request.host + "/some/path") // Returns "localhost:9000/some/path" 
    } 
} 

C'è un modo per ottenere il protocollo dall'oggetto richiesta?

+0

Perché hai bisogno di collegamenti assoluti? (qual è il tuo caso d'uso?) –

+4

Un paio di esempi in cui ho bisogno di url assoluti: 1) api json che restituisce percorsi ad altri URL sul sito (da risorse ad altri punti di ingresso API, ecc.). 2) Invio di email agli utenti. 3) condivisione di URL su siti esterni (pubblicazione in apis, ecc.) –

+0

Altri casi d'uso: generazione di 'sitemap.xml' e' rss.xml'. – mjswensen

risposta

3

In realtà il tuo numero di porta ti darà se è http o https.

avviare il server Giocare con il supporto HTTPS JAVA_OPTS=-Dhttps.port=9001 play start

Ecco un frammento di codice (è possibile effettuare la validazione più stabile con una regex, prendere il numero di porta https dalle proprietà ...)

def path = Action { request => 
    val path = 
     if(request.host.contains(":9000")) 
     "http://" + request.host + "/some/path" 
     else 
     "https://" + request.host + "/some/path" 
    Ok(path) 
    } 

Il codice restituirà

http://ServerIp:9000/some/path if it's thru http 
https://ServerIp:9001/some/path if it's thru https 
4

Non penso ci sia.

Per ovviare al problema, utilizzare protocol relative urls utilizzando //domain.com/path.

Ciò tuttavia non aiuta con i collegamenti nell'e-mail. In tal caso, è possibile inserire il protocollo nello application.conf. Nella maggior parte dei casi la differenza è dovuta al fatto che la produzione supporta https e lo sviluppo no.

Devo ancora trovare una situazione in cui le soluzioni alternative sopra non funzionano.

+2

Tuttavia, la riproduzione 2.1 supporta https anche se non è documentata correttamente e il modo consigliato è quello di avere un server https di fronting. – Farmor

+0

Sì, aggiungere un parametro di configurazione funzionerebbe, ma poiché questo è qualcosa di facile da ottenere in altri linguaggi, ho pensato che sarebbe stato più semplice con Play! –

0

La mia soluzione è stata quella di passare l'inizio dell'URL come parametro aggiuntivo da javascript. La soluzione application.conf non funziona per me, perché la stessa applicazione è accessibile su http e https ma da sottoreti e domini diversi.

9

In realtà c'è un modo semplice per farlo utilizzando la classe di chiamata che i router inversi utilizzano per ottenere risultati simili. Dato che siete nell'ambito della richiesta implicita, si può fare qualcosa di simile:

new Call(request.method, input.request).absoluteURL() 

e vi fornirà l'URL completo (protocollo, di accoglienza, percorso e parametri).

+1

Interessante, ma non ha funzionato abbastanza per me; ha restituito http invece di https; il resto era corretto. –

Problemi correlati