2011-09-04 50 views
5

Tôi đang triển khai dịch vụ REST với khung web Lift trong Scala và tôi đang gặp một số vấn đề với yêu cầu PUT để tạo một thực thể mới mà tôi biết ID.Dịch vụ REST REST không nhận ra yêu cầu PUT

Đã thêm công văn đến Boot.scala và đối tượng phục vụ còn lại của tôi trông hơi như thế này:

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

} 

yêu cầu GET đang làm việc đúng như tôi thử nghiệm với:

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

bây giờ tôi đang cố gắng để triển khai dịch vụ tạo và tôi tiếp tục nhận được 404 không tìm thấy khi tôi 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> 

Trên SBT, tôi có thể thấy rằng yêu cầu được công nhận là yêu cầu PUT:

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

Bất kỳ ý tưởng nào về điều gì có thể sai?

Trả lời

5

Có ba vấn đề với cách bạn đang thử nghiệm yêu cầu PUT.

Quan trọng nhất, bạn cần đặt tiêu đề Content-Type thành application/json (thay vì hoặc ngoài tiêu đề Accept).

Tiếp theo, bạn cần phải sử dụng dấu ngoặc kép trong JSON của mình: -d '[{"id":"abs"}]'. (Các dấu ngoặc kép thực tế là required for strings in valid JSON. Một số trình phân tích cú pháp JSON sẽ chấp nhận các dấu ngoặc đơn, nhưng không chấp nhận các dấu nháy đơn.)

Cuối cùng, xóa dấu gạch chéo sau khỏi URL. Nó thêm "index" vào cuối danh sách đường dẫn, có nghĩa là bạn sẽ không nhận được kết quả phù hợp trong dòng case Nil JsonPut... của mình.

Sau đây nên làm việc:

curl -i -H "Content-Type: application/json" -X PUT -d '[{"id":"abs"}]' http://localhost:8080/api/room 
+0

Nó chắc chắn đã làm! Cảm ơn rất nhiều Travis :) –

+0

Có cách nào để KHÔNG yêu cầu 'Content-Type' không? –

+0

Câu trả lời hữu ích, nhưng tôi phải nói rằng tôi tìm thấy thông báo 404 và trạng thái của "URL được yêu cầu ... không được tìm thấy" thực sự gây nhầm lẫn khi điều duy nhất mà khách hàng làm sai là gửi JSON không đúng định dạng (ví dụ: gửi đúng nội dung ' Gõ: application/json' header nhưng gửi 'foo' vào phần thân). Tôi nhận được nó có thể là một vấn đề phù hợp với mô hình hoặc bất cứ điều gì, nhưng nó sẽ làm cho gỡ lỗi đơn giản hơn nếu nó trả về 400 yêu cầu xấu hoặc một cái gì đó. –

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