2009-08-29 8 views
5

Po pierwsze, chciałem wiedzieć, co robię, to właściwa droga.Restlet implement post z jsonem odbiór i odpowiedź

Mam scenariusz, w którym otrzymam żądanie json i muszę zaktualizować bazę danych, po aktualizacji bazy danych muszę odpowiedzieć za pomocą potwierdzenia json.

co zrobiłem do tej pory, to stworzyć aplikację rozciągający klasy następująco:

 @Override 
    public Restlet createRoot() { 
     // Create a router Restlet that routes each call to a 
     // new instance of ScanRequestResource. 
     Router router = new Router(getContext()); 

     // Defines only one route 
     router.attach("/request", RequestResource.class); 

     return router; 
    } 

Moja klasa zasób jest rozszerzenie ServerResource i mam następujące metody w mojej klasie zasobów

@Post("json") 
public Representation post() throws ResourceException { 
    try { 
     Representation entity = getRequestEntity(); 
     JsonRepresentation represent = new JsonRepresentation(entity); 
     JSONObject jsonobject = represent.toJsonObject(); 
     JSONObject json = jsonobject.getJSONObject("request"); 

     getResponse().setStatus(Status.SUCCESS_ACCEPTED); 
     StringBuffer sb = new StringBuffer(); 
     ScanRequestAck ack = new ScanRequestAck(); 
     ack.statusURL = "http://localhost:8080/status/2713"; 
     Representation rep = new JsonRepresentation(ack.asJSON()); 

     return rep; 

    } catch (Exception e) { 
     getResponse().setStatus(Status.SERVER_ERROR_INTERNAL); 
    } 

Moim pierwszym zmartwieniem jest to, że obiekt, który otrzymuję w jednostce, to inputReklaracja, więc kiedy pobieram jsonobject z jsonrepresentation created, zawsze otrzymuję obiekt pusty/zerowy.

Próbowałem przekazując żądania json z następującego kodu, jak i klienta dołączony

function submitjson(){ 
alert("Alert 1"); 
    $.ajax({ 
     type: "POST", 
     url: "http://localhost:8080/thoughtclicksWeb/request", 
     contentType: "application/json; charset=utf-8", 
     data: "{request{id:1, request-url:http://thoughtclicks.com/status}}", 
     dataType: "json", 
     success: function(msg){ 
      //alert("testing alert"); 
      alert(msg); 
     } 
    }); 
}; 

klienta w celu wywołania

ClientResource requestResource = new ClientResource("http://localhost:8080/thoughtclicksWeb/request"); 
     Representation rep = new JsonRepresentation(new JSONObject(jsonstring)); 
    rep.setMediaType(MediaType.APPLICATION_JSON); 
    Representation reply = requestResource.post(rep); 

pomocy lub wskazówek na ten temat jest wysokość docenione?

Dzięki, Rahul

+0

Rozważmy tym pytaniem na oficjalnym forum Restlet-dyskutować: http: // restl et.tigris.org/ds/viewForumSummary.do?dsForumId=4447 –

Odpowiedz

1

Gdy używam następujący JSON jako wniosek, to działa:

{"request": {"id": "1", "request-url": "http://thoughtclicks.com/status"}} 

zauważy cudzysłowy i dodatkowy dwukropek, które nie są w próbce.

1

Korzystanie zaledwie 1 JAR JSE-xyz/lib/org.restlet.jar, można skonstruować JSON ręką po stronie klienta do prostych wniosków:

ClientResource res = new ClientResource("http://localhost:9191/something/other"); 

StringRepresentation s = new StringRepresentation("" + 
    "{\n" + 
    "\t\"name\" : \"bank1\"\n" + 
    "}"); 

res.post(s).write(System.out); 

po stronie serwera, używając tylko 2 JAR - gson-xyzjar i JSE-xyz/lib/org.restlet.jar:

public class BankResource extends ServerResource { 
    @Get("json") 
    public String listBanks() { 
     JsonArray banksArray = new JsonArray(); 
     for (String s : names) { 
      banksArray.add(new JsonPrimitive(s)); 
     } 

     JsonObject j = new JsonObject(); 
     j.add("banks", banksArray); 

     return j.toString(); 
    } 

    @Post 
    public Representation createBank(Representation r) throws IOException { 
     String s = r.getText(); 
     JsonObject j = new JsonParser().parse(s).getAsJsonObject(); 
     JsonElement name = j.get("name"); 
     .. (more) .. .. 

     //Send list on creation. 
     return new StringRepresentation(listBanks(), MediaType.TEXT_PLAIN); 
    } 
}