2009-08-29 7 views
5

Tout d'abord, ce que je voulais savoir, c'est que je faisais la bonne chose.Poste d'implémentation de Restlet avec réception et réponse JSON

J'ai un scénario où je recevrai une requête json et je dois mettre à jour la base de données avec cela, une fois que la base de données est mise à jour, je dois répondre avec l'accusé de réception json.

Ce que je l'ai fait est à ce jour créer l'application d'extension de classe comme suit:

 @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; 
    } 

Ma classe de ressources est l'extension de la ServerResource et j'ai la méthode suivante dans ma classe de ressources

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

Ma première préoccupation est que l'objet que je reçois dans l'entité est inputrepresentation donc quand je récupère le jsonobject de la jsonrepresentation créée, je reçois toujours un objet vide/nul.

J'ai essayé passer la demande JSON avec le code suivant, ainsi que le client attaché

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

client utilisé pour appeler

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

Toute aide ou des indices sur ce point est apprécié Hight?

Merci, Rahul

+0

Tenir compte de poser cette question sur le forum Restlet-discuss officiel: http: // restl et.tigris.org/ds/viewForumSummary.do?dsForumId=4447 –

Répondre

1

Lorsque j'utilise le JSON suivant que la demande, il fonctionne:

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

Notez les guillemets doubles et deux points supplémentaires qui ne sont pas dans votre échantillon.

1

En utilisant seulement 1 JAR JSE-xyz/lib/org.restlet.jar, vous pouvez construire JSON à la main sur le côté client pour les demandes simples:

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

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

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

Du côté du serveur, en utilisant seulement 2 - JARs gson-xyzjar et 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); 
    } 
} 
Questions connexes