提升REST服务无法识别PUT请求

Jos*_*osa 5 api rest scala put lift

我正在使用Scala中的Lift Web框架实现REST服务,并且我在PUT请求中遇到一些问题,以创建一个我知道ID的新实体.

已经将调度添加到Boot.scala我的休息服务对象看起来有点像这样:

package code
package lib

import model._

import net.liftweb._
import common._
import http._
import rest._
import util._
import Helpers._
import json._

object RestService extends RestHelper {

  serve( "api" / "room" prefix {
    // /api/room returns all the rooms
    case Nil JsonGet _ => Room.registredRooms: JValue
    // /api/room/count gets the room count
    case "count" :: Nil JsonGet _ => JInt(Room.registredRooms.length)
    // /api/room/room_id gets the specified room (or a 404)
    case Room(room) :: Nil JsonGet _ => room: JValue
    // DELETE the room in question
    case Room(room) :: Nil JsonDelete _ => 
      Room.delete(room.id).map(a => a: JValue)
    // PUT adds the room if the JSON is parsable
    case Nil JsonPut Room(room) -> _ => Room.add(room): JValue

    // POST if we find the room, merge the fields from the 
    // the POST body and update the room
    case Room(room) :: Nil JsonPost json -> _ => 
      Room(mergeJson(room, json)).map(Room.add(_): JValue)
  })

}
Run Code Online (Sandbox Code Playgroud)

我测试时GET请求正常工作:

$ curl http://localhost:8080/api/room/abs
{
  "id":"abs"
}
Run Code Online (Sandbox Code Playgroud)

我现在正在尝试实现创建服务,并且当我PUT时,我一直找不到404:

$ curl -i -H "Accept: application/json" -X PUT -d "[{'id':'abs'}]" http://localhost:8080/api/room/
HTTP/1.1 404 Not Found
Expires: Sun, 4 Sep 2011 14:13:50 UTC
Set-Cookie: JSESSIONID=t1miz05pd5k9;Path=/
Content-Length: 106
Cache-Control: no-cache, private, no-store
Content-Type: text/html; charset=utf-8
Pragma: no-cache
Date: Sun, 4 Sep 2011 14:13:50 UTC
X-Lift-Version: 2.4-M3
Server: Jetty(6.1.22)

<!DOCTYPE html>
<html> <body>The Requested URL /api/room/ was not found on this server</body> </html>
Run Code Online (Sandbox Code Playgroud)

在SBT上,我可以看到请求被识别为PUT请求:

15:13:50.130 [414557038@qtp-135607724-2 - /api/room/] INFO  net.liftweb.util.TimeHelpers - Service request (PUT) /api/room/ returned 404, took 10 Milliseconds
Run Code Online (Sandbox Code Playgroud)

关于可能出错的任何想法?

Tra*_*own 5

您测试PUT请求的方式有三个问题.

最重要的是,您需要将Content-Type标头设置为application/json(而不是Accept标头).

接下来,您需要在JSON中使用双引号:-d '[{"id":"abs"}]'.(有效JSON中的字符串实际上需要双引号.一些JSON解析器将接受单引号,但不接受Lift的.)

最后,从URL中删除尾部斜杠.它添加"index"到路径列表的末尾,这意味着您不会在您的case Nil JsonPut...行中获得匹配.

以下应该有效:

curl -i -H "Content-Type: application/json" -X PUT -d '[{"id":"abs"}]' http://localhost:8080/api/room
Run Code Online (Sandbox Code Playgroud)