如何在 Restlet 中发送错误响应?

How do I send an error response in Restlet?

我有一个 Restlet ServerResource,它应该处理带有参数 user 的 GET 请求。如果 user 等于某个值,它应该 return 某个图像,否则发送错误响应(404 或 403),表明发送者不允许获取图像。

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
    }
    [...]
}

如何在 getImage 方法(而不是 return null)中发送标准化的错误响应?

查看 ServerResource#setStatus(Status) method JavaDoc 和其他重载方法。这允许您 return 自定义正文以及所需的 HTTP 状态。

或者抛出 new ResourceException (class JavaDoc) 框架会将它们转换为正确的 HTTP 状态并提供默认消息,尽管这不太可能是图像。

这应该可以满足您的需求。 JavaDoc 链接到版本 2.3.x 于 25/11/2015

以前我写过一篇博客post是关于这个的:

除了出色的 Caleryn 的回答之外,现在还有 @Status 注释可以在 Restlet 中使用自定义异常。样本:

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

当抛出此类异常时,Restlet 会自动检测并创建相应的错误消息。在示例中,状态代码为 400 的响应,它尝试使用转换器服务将异常作为 bean 序列化为 JSON(或其他)。

希望对你有帮助, 蒂埃里