2010-08-13 3 views
11

Как можно просто получить доступ к атрибутам get и post в рамке лифта внутри RestHelper? Там нет каких-либо явных примеров об этом в документации :(liftweb - доступ к параметрам get/post

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> 

    } 
} 

Я хочу, чтобы понять, как сделать лифт показать значение q, когда я прошу http://localhost:8080/api/static.xml?q=test

ответ

23

Lift использует Box, а не нуль, чтобы указать если передан параметр. Это позволяет хорошо использовать Scala для понимания, чтобы объединить хороший обработчик запросов. Я дам код говорить сам за себя:

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

хороший пример! Благодарю. –

5

я не уверен, но вы можете попробуйте

S.param("param_name") 

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

или с классом REQ

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

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

Редактировать: У меня есть этот пример работает:

package code.rest 

import net.liftweb.http.rest._ 

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

Я обновил сообщение. S.param ("q"). ToString уже возвращает «Empty» ... –

2

В фрагментах, Получить и параметры Post являются частью жизненного цикла сниппета. Подтягивает атрибут GUID к функции, переданной в SHtml.text (defaultValue, passFunction), и возвращает места, которые GUID в атрибуте name генерируемого элемента HTML. Когда форма отправлена, лифт просматривает GUID в таблице функций и вызывает функцию с переданным параметром.

Для более общих запросов, откройте ящик:

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

и вы можете установить переменный сеанс для сохраняющих состояния запросов:

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

+0

У меня нет ни одного html-кода. Я пишу службу json/xml-rest, и мне нужно иметь возможность читать параметры, отправленные вручную в мое приложение-приложение. –

+3

В этом случае плакат искал запрос параметров запроса как часть обработки REST. В то время как код генерации формы Lift генерирует код с уникальными идентификаторами GUID для элементов формы (вы можете сделать это по-старому, если хотите), это неприменимо для вызовов REST, где API определяет параметры запроса. Вопрос заключался в том, как получить эти параметры запроса. S.param - правильный ответ, но он возвращает Box [String], который будет пустым, если параметр запроса не был указан или Full (value), если бы это было так. –