2010-08-13 39 views
11

Làm cách nào để truy cập và nhận các thuộc tính trong khung nâng trong RestHelper? Không có bất kỳ ví dụ rõ ràng về nó trong tài liệu :(liftweb - truy cập thông số nhận/đăng

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> 

    } 
} 

Tôi muốn hiểu làm thế nào để nâng giá trị của chương trình q khi tôi đang yêu cầu http://localhost:8080/api/static.xml?q=test

Trả lời

23

Lift sử dụng Box chứ không phải là null để chỉ ra nếu một tham số được thông qua. Điều này cho phép việc sử dụng Scala dễ hiểu để kết hợp với nhau một trình xử lý yêu cầu tốt đẹp. Tôi sẽ để mã nói cho chính nó:

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

ví dụ hay! Cảm ơn. –

5

Tôi không chắc chắn, nhưng có thể bạn thử với

S.param("param_name") 

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

hoặc với lớp req

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

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

Sửa: Tôi có mẫu này chạy:

package code.rest 

import net.liftweb.http.rest._ 

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

Tôi đã cập nhật bài đăng. S.param ("q"). ToString đã trả về "trống" ... –

2

Trong đoạn, Nhận và gửi các thông số này là một phần của vòng đời đoạn. Lift gán thuộc tính GUID cho hàm được truyền cho SHtml.text (defaultValue, passedFunction) và trả về các vị trí GUID trong thuộc tính name của phần tử HTML được tạo ra. Khi biểu mẫu được gửi, Lift tra cứu GUID trong bảng hàm và gọi hàm với tham số được truyền.

Đối với yêu cầu tổng quát hơn, mở Box:

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

và bạn có thể thiết lập một biến phiên cho các yêu cầu stateful:

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

+0

Tôi không có bất kỳ mã html nào. Tôi đang viết dịch vụ json/xml-rest và tôi cần có khả năng đọc các thông số được gửi thủ công tới ứng dụng của tôi. –

+3

Trong trường hợp này, người đăng ký đang tìm kiếm các tham số yêu cầu như một phần của xử lý REST. Trong khi mã tạo biểu mẫu của Lift sẽ tạo mã với GUID duy nhất cho các phần tử biểu mẫu (bạn có thể làm theo cách cũ nếu bạn muốn), điều đó không áp dụng cho các cuộc gọi REST trong đó API xác định tham số truy vấn. Câu hỏi là làm thế nào để có được các tham số truy vấn đó. S.param là câu trả lời đúng, nhưng nó trả về một hộp [String] sẽ rỗng nếu tham số truy vấn không được cung cấp hoặc đầy đủ (giá trị) nếu nó là. –

Các vấn đề liên quan