2013-02-13 7 views
13

Obecnie jestem w stanie uzyskać hosta z request, który obejmuje domenę i opcjonalny port. Niestety, nie zawiera protokołu (http i https), więc nie mogę utworzyć bezwzględnych adresów URL do samej witryny.Play Framework 2.1: Scala: jak uzyskać cały URL bazowy (w tym protokół)?

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

Czy istnieje sposób na uzyskanie protokołu z obiektu żądania?

+0

Dlaczego potrzebujesz bezwzględnych linków? (jaki jest twój przypadek użycia?) –

+4

Kilka przykładów, w których potrzebuję bezwzględnych adresów URL: 1) json api, który zwraca ścieżki do innych adresów URL w witrynie (z zasobów do innych punktów wejścia API, itp.). 2) Wysyłanie e-maili do użytkowników. 3) udostępnianie adresów URL w witrynach zewnętrznych (publikowanie w apis itp.) –

+0

Więcej przykładów użycia: generowanie 'sitemap.xml' i' rss.xml'. – mjswensen

Odpowiedz

3

W rzeczywistości Twój numer portu poda Ci wartość, jeśli jest to http lub https.

Zacznij grać z serwera https wsparcia JAVA_OPTS=-Dhttps.port=9001 play start

Oto fragment kodu (można dokonać walidacji bardziej stabilny z regex, podejmują https numer portu z właściwościami ...)

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

Kod zwróci

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

Nie sądzę, że istnieje.

Sposób obejścia tego problemu polega na użyciu protocol relative urls przy użyciu //domain.com/path.

Nie pomoże to jednak w linkach w wiadomościach e-mail. W takim przypadku możesz umieścić protokół w application.conf. W większości przypadków robi się różnicę, ponieważ produkcja obsługuje https, a programowanie nie.

Muszę jeszcze znaleźć sytuację, w której powyższe rozwiązania nie działają.

+2

Jednak gra 2.1 obsługuje https, nawet jeśli nie jest odpowiednio udokumentowana, a zalecanym sposobem jest posiadanie serwera HTTT z przodu. – Farmor

+0

Tak, dodanie parametru konfiguracyjnego zadziała, ale ponieważ jest to łatwe do uzyskania w innych językach, założyłem, że będzie to równie łatwe w przypadku gry! –

0

Moim rozwiązaniem było przekazanie początku adresu URL jako dodatkowego parametru z javascript. Rozwiązanie application.conf nie działa dla mnie, ponieważ ta sama aplikacja jest dostępna na http i https, ale z innej podsieci i domeny.

9

W rzeczywistości istnieje prosty sposób, aby to zrobić za pomocą klasy Call, której routery odwrotne używają do osiągnięcia czegoś podobnego. Biorąc pod uwagę, że jesteś w zakres domniemanego życzenie można zrobić coś takiego:

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

oraz zapewni Ci pełny adres URL (protokół, host, trasy i parametrów).

+1

Interesujące, ale nie do końca dla mnie działa; zwrócił http zamiast https; reszta była poprawna. –

Powiązane problemy