Служба Lift REST не распознает запрос PUT

Я внедряю службу REST с веб-платформой Lift в Scala, и у меня возникают проблемы с запросом PUT на создать новую сущность, для которой я знаю идентификатор.

Уже добавлена ​​отправка в 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)
  })

}

Запросы GET работают правильно, как я тестировал:

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

Сейчас я пытаюсь реализовать службу создания, и я продолжаю получать 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>

На 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

Любые идеи о том, что может быть не так?


person José P. Airosa    schedule 04.09.2011    source источник


Ответы (1)


Есть три проблемы с тем, как вы тестируете запрос 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
person Travis Brown    schedule 04.09.2011
comment
Это точно! Большое спасибо, Трэвис :) - person José P. Airosa; 05.09.2011
comment
Есть ли способ НЕ требовать этого Content-Type? - person Erik Kaplun; 14.03.2014
comment
Полезный ответ, но я должен сказать, что нахожу сообщение 404 Lift и сообщение о состоянии запрошенного URL ... не было обнаружено, что оно действительно сбивает с толку, когда единственное, что клиент делает неправильно, это отправляет искаженный JSON (например, правильно отправляет заголовок Content-Type: application/json, но отправляет foo в тело). Я понимаю, что это, вероятно, проблема сопоставления с образцом или что-то в этом роде, но отладка будет более простой, если она вернет 400 Bad Request или что-то в этом роде. - person Abe Voelker; 17.07.2015