2011-09-04 9 views
5

मैं स्कैला में Lift वेब ढांचे के साथ एक आरईएसटी सेवा लागू कर रहा हूं और मुझे एक नई इकाई बनाने के लिए PUT अनुरोध के साथ कुछ समस्याएं हैं जिनके लिए मुझे आईडी पता है।लिफ्ट आरईएसटी सेवा 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) 
    }) 

} 

प्राप्त अनुरोधों को ठीक से काम कर रहे हैं के रूप में मैं के साथ परीक्षण किया:

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

एसबीटी पर मैं देख सकता हूँ कि अनुरोध 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 पार्सर्स एकल उद्धरण चिह्न स्वीकार करेंगे, लेकिन लिफ्ट की नहीं।)

अंत में, URL से पिछली स्लैश हटा दें। यह पथ सूची के अंत में "index" जोड़ रहा है, जिसका अर्थ है कि आपको अपने case Nil JsonPut... लाइन में कोई मिलान नहीं मिलेगा।

निम्नलिखित काम करना चाहिए:

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

यह सुनिश्चित किया! धन्यवाद बहुत ट्रैविस :) –

+0

क्या 'सामग्री-प्रकार' की आवश्यकता नहीं है? –

+0

सहायक उत्तर, लेकिन मुझे यह कहना है कि मुझे लिफ्ट का 404 मिल गया है और "अनुरोधित यूआरएल ... का पता नहीं मिला" वास्तव में उलझन में है जब क्लाइंट गलत काम करता है तो विकृत JSON भेजता है (उदाहरण के लिए 'सामग्री- टाइप करें: एप्लिकेशन/जेसन 'हेडर लेकिन शरीर में' foo' भेजना)। मुझे लगता है कि यह शायद एक पैटर्न मिलान करने वाला मुद्दा या जो भी हो, लेकिन अगर यह 400 खराब अनुरोध या कुछ लौटाता है तो यह अधिक सरलता से डिबगिंग करेगा। –

संबंधित मुद्दे