用json身体调用Lift上的PUT时的Http 404

时间:2013-06-04 12:50:56

标签: scala rest lift

我正在尝试使用Lift来做一个Rest服务,当我尝试传递一个json体时,我遇到了问题。

型号:

case class TestData(substore:String) {}

object TestData {  
  private implicit val formats = net.liftweb.json.DefaultFormats

  implicit def toJson(item: TestData): JValue = Extraction.decompose(item)

  def apply(in: JValue): Box[TestData] = Helpers.tryo{in.extract[TestData]}

  def unapply(in: Any): Option[TestData] = in match {
    case i: TestData => Some(TestData(i.substore)
    case _ => None
  }
}

休息:

object RestExample extends RestHelper {
  serve {
    case "api" :: "user" :: AsLong(id) :: Nil JsonGet _ => JInt(id)
    case "api" :: "test2" :: Nil JsonPut _ => TestData("testeee"): JValue
    case "api" :: "test" :: Nil JsonPut TestData(testData) -> _ => testData : JValue
  }
}

简单的测试工作:

curl -i -H "Content-Type: application/json" -X PUT http://localhost:8080/api/test2

但我无法通过json身体工作得到测试:

curl -i -H "Content-Type: application/json" -X PUT -d '{"substore":"abs"}' http://localhost:8080/api/test

在这种情况下,我总是收到:

<html> <body>The Requested URL /api/test was not found on this server</body> </html> 

1 个答案:

答案 0 :(得分:1)

似乎是模式匹配问题。

TestData(testData)替换JObject(JField("substore", JString(substore)))会解决您的问题吗?您将在范围内使用substore: String进行此类模式匹配。

此外,在TestData对象中,为什么使用Any代替JValue?如果调用了apply方法,我看不到任何用法(TestData不会在任何地方调用JValue。)