2010-01-09 8 views

Répondre

2

Voici un bon exemple et complète d'un Restlet qui accepte JSON via POST:

et un guide de base sur la façon de tester les services Web RESTful avec cURL:

+2

dans l'exemple, les données sont encore POSTé en utilisant la norme forme URL- encoder "nom = valeur". Alors, comment puis-je POST une chaîne au format JSON {"name": "value"}? – portoalet

+0

Le premier lien est très ancien. Beaucoup de choses sont faites manuellement, où elles auraient pu être faites automatiquement. ** Soyez prévenu ** –

+0

Le premier lien est mort. – zionpi

10

Avec Restlet 2, vous pouvez:

  • test de l'entité compatibilité type de support dans @Post acceptRepresentation(Representation entity):

    @Post 
    public Representation acceptRepresentation(Representation entity) 
         throws ResourceException { 
        if (entity.getMediaType().isCompatible(MediaType.APPLICATION_JSON)) { 
         // ... 
        } 
        // ... 
    } 
    
  • ou utiliser @Post avec un ou deux paramètres:

    @Post("json") Representation acceptAndReturnJson(Representation entity) { 
        // ... 
    } 
    

Voir ces liens: (. Avec Restlet 1, vous devez tester le type de l'entité)

+0

Désolé d'être intervenu, mais je ne trouve pas un moyen simple de convertir la JSONRepresentation en POJO. –

+0

Le 2ème lien est cassé. – Chloe

6

L'exemple lié par Daniel Vassallo montre les données publiées en utilisant un formulaire. Voici comment envoyer JSON:

@Post 
public void acceptJsonRepresentation(JsonRepresentation entity) { 

    JSONObject json = null; 

    try { 
     json = entity.getJsonObject(); 
     // business logic and persistence 

    } catch (JSONException e) { 
     setStatus(Status.CLIENT_ERROR_BAD_REQUEST); 
     return; 
    } 

} 

Pour tester avec boucle:

curl -X POST <your url> -H "Content-Type: application/json" -d '{"key" : "value"}' 

Les guillemets simples ('') autour des données de la commande curl sont importants.

+1

Désolé d'être intervenu, mais je ne trouve pas un moyen simple de convertir la JSONRepresentation en POJO. –

8

A l'écriture de cette réponse (2 ans après votre question), Restlet 2.1 requiert que les dépendances soient correctement remplies pour consommer et répondre correctement avec JSON. Point est, en dehors de "Unsupported media type" réponse, il n'y a pas beaucoup d'idée sur ce qui se passe en interne.

Pour activer le type de média JSON, vous devez inclure la dépendance au org.restlet.ext.jackson; Si vous avez besoin de supporter XML et JSON, vous devez inclure Jackson FIRST puis org.restlet.ext.xstream, car XStream est également capable de représenter JSON mais l'implémentation est plutôt mauvaise (comme décrit dans docs de restlet, cet ordre est recommandé par les auteurs de restlets).

Ensuite, vous n'avez pas réellement besoin d'inclure le type de support dans l'annotation et vous devez simplement inclure l'en-tête Content-Type approprié dans votre requête curl, c'est-à-dire:

curl -X post -H "Content-Type: application/json" http://localhost:8080/login -d @login.json 
  • login.json contient la demande JSON réelle.
  • connexion est @Post méthode annotée accepte LoginRequest et répondre avec LoginResponse, à la fois capable de XML et JSON types de médias

je l'espère, cette réponse va aider quelqu'un quelque temps. :-)

0
curl -u uid:4c521655 -X POST -H "Content-Type: application/json" -d "type=Big&data="{\"name\":\"test\"}"" --dump-header headers 'http://localhost:8190/appli/add' 
3

Voici quelques mises à jour concernant cette ancienne question. Restlet prend en charge les signatures de méthode contenant des beans. Dans ce cas, Restlet utilisera un convertisseur enregistré pour essayer de convertir/charger la charge utile reçue dans une instance de bean. Ceci est également vrai lors de l'envoi de contenu au client.

Voici l'échantillon d'une méthode qui gère une demande POST:

public class TestServerResource extends ServerResource { 
    @Post 
    public void test(TestBean bean) { 
     System.out.println(">> bean = " + bean.getMessage()); 
    } 
} 

Le haricot peut simplement avoir la structure suivante:

public class TestBean { 
    private String name; 
    private String message; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getMessage() { 
     return message; 
    } 

    public void setMessage(String message) { 
     this.message = message; 
    } 
} 

Pour faire fonctionner ce mécanisme, vous pouvez simplement ajouter l'extension Jackson (org.restlet.ext.jackson) dans votre classpath. Le convertisseur correspondant sera automatiquement enregistré sous le capot.

La demande boucle est simple et les données à envoyer doit être spécifiée

curl -X POST http://... -H "Content-Type: application/json" -d '{"name" : "myname","description":"my description"}' 

espérons qu'il vous aidera, Thierry