2011-09-04 63 views
5

我正在Scala中使用Lift網絡框架實現REST服務,並且我在PUT請求中遇到了一些問題以創建一個我知道該ID的新實體。電梯REST服務無法識別PUT請求

已加入派遣Boot.scala和我的休息服務對象看起來有點像這樣:

$ curl http://localhost:8080/api/room/abs 
{ 
    "id":"abs" 
} 

現在我想:我與測試

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) 
    }) 

} 

GET請求是否工作正常實施創建服務,我不斷得到一個404沒有找到當我PUT:

$ 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> 

在SBT我可以看到,該請求被確認爲PUT請求:

15:13:50.130 [[email protected] - /api/room/] INFO net.liftweb.util.TimeHelpers - Service request (PUT) /api/room/ returned 404, took 10 Milliseconds 

什麼可能是錯的任何想法?

回答

5

您測試PUT請求的方式有三個問題。

最重要的是,您需要將Content-Type標頭設置爲application/json(而不是或除Accept標頭之外)。

接下來,您需要在JSON中使用雙引號:-d '[{"id":"abs"}]'。 (雙引號實際上是required for strings in valid 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 
+0

它的確!非常感謝特拉維斯:) –

+0

有什麼辦法可以不要求'Content-Type'? –

+0

有用的答案,但我不得不說,當客戶端錯誤發送格式錯誤的JSON(例如,正確地發送「Content-鍵入:application/json'標題,但在主體中發送'foo')。我得到它可能是一個模式匹配問題或其他什麼,但它會使調試更直接,如果它返回400錯誤請求或什麼。 –