2011-09-04 5 views
5

私はScalaのLiftウェブフレームワークでRESTサービスを実装していますが、IDを知っている新しいエンティティを作成するPUTリクエストにいくつか問題があります。リフト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要求が正常に動作しています作成サービスを実装して、私が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> 
15:13:50.130 [[email protected] - /api/room/] INFO net.liftweb.util.TimeHelpers - Service request (PUT) /api/room/ returned 404, took 10 Milliseconds 

間違っているかもしれないもの上の任意のアイデアを:SBTオン私は要求がPUTリクエストとして認識されていることを見ることができますか?

答えて

5

PUTリクエストをテストする方法には3つの問題があります。

最も重要なことは、Content-Typeヘッダーをapplication/jsonAcceptヘッダーの代わりにまたはヘッダーに加えて)に設定する必要があることです。

次に、JSONで二重引用符を使用する必要があります。-d '[{"id":"abs"}]' (二重引用符は実際にはrequired for strings in valid JSONです。一部のJSONパーサーではリフトは使用できません)

最後に、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を送信したときに、リフトの404とステータスメッセージ "The Requested URL ... was not found"が本当に混乱していると言わざるを得ない(例えば、タイプ:application/json'ヘッダーだが、本文に 'foo'を送る)。私はそれがおそらくパターンマッチングの問題か何かを得るが、それは400 Bad Requestか何かを返した場合、デバッグをより簡単にするだろう。 –

関連する問題