2011-09-04 12 views
5

Estoy implementando un servicio REST con el marco web Lift en Scala y estoy teniendo algunos problemas con la solicitud PUT para crear una entidad nueva para la que conozco la ID.Levante el servicio REST que no reconoce la solicitud PUT

Ya se añadió el envío a Boot.scala y mi objeto de servicio resto se ve un poco como esto:

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

} 

peticiones GET están funcionando correctamente como Probé con:

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

Ahora estoy tratando de implementar el servicio de creación y sigo obteniendo un 404 no encontrado cuando 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> 

En SBT puedo ver que la solicitud está siendo reconocida como una solicitud PUT:

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

Alguna idea sobre lo que podría estar mal?

Respuesta

5

Hay tres problemas con la forma en que prueba la solicitud PUT.

Lo que es más importante, debe establecer el encabezado Content-Type en application/json (en lugar de o además del encabezado Accept).

A continuación, debe utilizar comillas dobles en su JSON: -d '[{"id":"abs"}]'. (Las comillas dobles son en realidad required for strings in valid JSON. Algunos analizadores JSON aceptarán comillas simples, pero no de Lift.)

Finalmente, elimine la barra diagonal de la URL. Está agregando "index" al final de la lista de rutas, lo que significa que no obtendrá una coincidencia en su línea case Nil JsonPut....

El siguiente debería funcionar:

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

Seguro que lo hizo! Muchas gracias Travis :) –

+0

¿Hay alguna manera de NO requerir ese 'Content-Type'? –

+0

Respuesta útil, pero debo decir que encuentro que el 404 de Lift y el mensaje de estado de "La URL solicitada ... no se encontró" realmente confunden cuando lo único que el cliente hace mal es enviar JSON malformado (por ejemplo, enviar correctamente el 'Content- Escriba: application/json' header pero enviando 'foo' en el cuerpo). Entiendo que es probable que sea un problema de coincidencia de patrones o lo que sea, pero haría la depuración más sencilla si devolviera 400 Bad Request o algo así. –

Cuestiones relacionadas