2010-08-13 4 views
11

Wie ist es möglich, im Liftframework innerhalb von RestHelper einfach auf Attribute zuzugreifen und diese zu posten? Es gibt keine keine explizite Beispiele davon in der Dokumentation :(liftweb - Zugriff auf get/post-Parameter

package my.domain 

import net.liftweb.http._ 
import net.liftweb.http.rest._ 
import net.liftweb.json.JsonAST._ 
import net.liftweb.json._ 
import net.liftweb.common.{Box,Full,Empty,Failure,ParamFailure} 
import net.liftweb.mapper._ 


import ru.dmteam.model.{RssItem} 

object ContentRest extends RestHelper { 


    def getq: String = { 
     val q = S.param("q") 
     q.toString 
    } 

    serve { 
     case "api" :: "static" :: _ XmlGet _=> <b>{getq}</b> 

    } 
} 

Ich verstehe, wollen, wie Lift zeigen Wert von q zu machen, wenn ich http://localhost:8080/api/static.xml?q=test

Antwort

23

Aufzug benutzt Box statt null, um anzuzeigen, wenn ein Parameter übergeben wurde. Dies ermöglicht die nette Verwendung von Scala's zum Verständnis, um einen netten Request-Handler zu verketten. Ich werde den Code für sich sprechen lassen:

object MyRest extends RestHelper { 
    // serve the q parameter if it exists, otherwise 
    // a 404 
    serve { 
    case "api" :: "x1" :: _ Get _ => 
     for { 
     q <- S.param("q") 
     } yield <x>{q}</x> 
    } 

    // serve the q parameter if it exists, otherwise 
    // a 404 with an error string 
    serve { 
    case "api" :: "x2" :: _ Get _ => 
     for { 
     q <- S.param("q") ?~ "Param 'q' missing" 
     } yield <x>{q}</x> 
    } 

    // serve the q parameter if it exists, otherwise 
    // a 401 with an error string 
    serve { 
    case "api" :: "x2" :: _ Get _ => 
     for { 
     q <- S.param("q") ?~ "Param 'q' missing" ~> 401 
     } yield <x>{q}</x> 
    } 

    // serve the q, r, s parameters if this exists, otherwise 
    // different errors 
    serve { 
    case "api" :: "x3" :: _ Get _ => 
     for { 
     q <- S.param("q") ?~ "Param 'q' missing" ~> 401 
     r <- S.param("r") ?~ "No 'r'" ~> 502 
     s <- S.param("s") ?~ "You're s-less" ~> 404 
     } yield <x><q>{q}</q><r>{r}</r><s>{s}</s></x> 
    } 

} 
+0

schönes Beispiel! Vielen Dank. –

5

bin anfordernden Ich bin nicht sicher, aber können Sie versuchen, mit

S.param("param_name") 

http://scala-tools.org/mvnsites-snapshots/liftweb/scaladocs/index.html

oder mit der erf Klasse

case r @ JsonPost("some" :: "path" :: _, json) => _ => { 
    r.param("name") 
} 

http://scala-tools.org/mvnsites-snapshots/liftweb/scaladocs/index.html

bearbeiten: Ich habe dieses Beispiel läuft:

package code.rest 

import net.liftweb.http.rest._ 

object SampleRest extends RestHelper { 
    serve { 
    case Get("sample" :: _, req) => 
     <hello>{req.param("name") getOrElse ("??") }</hello> 
    } 
} 
+0

Ich habe den Beitrag aktualisiert. S.param ("q"). ToString gibt bereits "Empty" zurück ... –

2

In Schnipsel, GET und POST-Parameter sind Teil des Schnipsel-Lebenszyklus. Lift weist der Funktion, die an SHtml.text übergeben wird (defaultValue, passedFunction), eine GUID zu und gibt die GUID im Namensattribut des generierten HTML-Elements zurück. Wenn das Formular übergeben wird, sucht Lift die GUID in der Funktionstabelle und ruft die Funktion mit dem übergebenen Parameter auf.

Weitere allgemeine Anfragen, öffnen Sie die Box:

val q = S.param("named_parameter") openOr ""

und Sie eine Session-Variable für Stateful-Anfragen einstellen könnte:

object myObject extends SessionVar[Box[Model]](Empty)

+0

Ich habe keinen HTML-Code. Ich schreibe json/xml-rest service und ich muss in der Lage sein, Parameter manuell zu lesen, die an meine Aufzugsanwendung gesendet werden. –

+3

In diesem Fall suchte das Poster nach Anforderungsparametern als Teil der REST-Behandlung. Während der Formulargenerierungscode von Lift Code mit eindeutigen GUIDs für Formularelemente generiert (Sie können dies auf altbekannte Weise tun, wenn Sie möchten), gilt dies nicht für REST-Aufrufe, bei denen die API die Abfrageparameter definiert. Die Frage war, wie diese Abfrageparameter abgerufen werden können. S.param ist die richtige Antwort, aber es gibt eine Box [String] zurück, die leer ist, wenn der Abfrageparameter nicht angegeben wurde, oder Full (Wert), wenn dies der Fall ist. –