2015-11-25 3 views
4

J'ai un Restlet ServerResource, qui devrait traiter une requête GET avec un paramètre user. Si user est égal à une certaine valeur, il devrait retourner une image, sinon envoyer une réponse d'erreur (404 ou 403) indiquant que l'expéditeur n'est pas autorisé à obtenir l'image.Comment envoyer une réponse d'erreur dans Restlet?

import org.restlet.data.MediaType; 
import org.restlet.representation.ObjectRepresentation; 
import org.restlet.representation.Representation; 
import org.restlet.resource.Get; 
import org.restlet.resource.ResourceException; 
import org.restlet.resource.ServerResource; 

public class GetMap extends ServerResource { 
    @Get 
    public Representation getImage() { 
     final String user = getQuery().getValues("user"); 

     if (user.equals("me")) { 
      //Read map from file and return it 
      byte[] data = readImage(); 
      final ObjectRepresentation<byte[]> or=new ObjectRepresentation<byte[]>(data, MediaType.IMAGE_PNG) { 
       @Override 
       public void write(OutputStream os) throws IOException { 
        super.write(os); 
        os.write(this.getObject()); 
       } 
      }; 
      return or; 
     } 
     return null; // Here I want to send an error response 
    } 
    [...] 
} 

Comment puis-je envoyer une réponse d'erreur standardisée dans la méthode getImage (au lieu de return null)?

Répondre

5

Jetez un oeil à la ServerResource#setStatus(Status)method JavaDoc et les méthodes supplémentaires surchargées. Ce qui vous permet de renvoyer un corps personnalisé avec le statut HTTP souhaité.

Vous pouvez également mettre à new ResourceException (class JavaDoc) le cadre les convertira au bon état HTTP et fournira un message par défaut, bien que ce ne soit probablement pas une image.

Cela devrait répondre à vos besoins. liens JavaDoc vers la version 2.3.x sur 25/11/2015

4

Dans le passé, j'ai écrit un billet de blog à ce sujet:

En plus de la grande réponse de Caleryn, il y a aussi maintenant l'annotation @Status pour utiliser une exception personnalisée dans Restlet. Un exemple:

@Status(value = 400, serialize = true) 
public class MyValidationException extends RuntimeException { 
    public ServiceValidationException(String message, Exception e) { 
     super(message, e); 
    } 
} 

Lorsqu'une telle exception est levée, Restlet la détecte automatiquement et crée le message d'erreur correspondant. Dans l'exemple, une réponse avec le code d'état 400 et il tente de sérialiser l'exception en tant que bean à JSON (ou autre chose) en utilisant le service de conversion.

J'espère que ça vous aide, Thierry