Restlet Filter Post请求

时间:2015-05-03 06:54:18

标签: java restlet

我想在Post中过滤Filter请求(在转到Resource之前)。 要过滤请求,我想从bode请求中检索令牌并对其进行一些测试。

当前资源:

@Post
public JsonRepresentation init(JsonRepresentation jRep) {
    String token = jRep.getJsonObject().getString("token");
    .
    .
    .
}

当前过滤器:

@Override
protected int beforeHandle(Request request, Response response) {
  int result = STOP;
  String token = (String) Request.getCurrent().getAttributes().get("token");
  .
  .
  .
}

这些代码不会检索令牌

我的问题是如何检索正文请求?

3 个答案:

答案 0 :(得分:2)

您可以直接从其关联的实体对象获取请求的有效内容文本,如下所述:

Representation repr = request.getEntity();
String content = repr.getText();

希望它可以帮到你, 亨利

答案 1 :(得分:1)

你可以尝试这样的东西来修复身体:

public static String getBody(HttpServletRequest request)抛出IOException {

    String body = null;
    StringBuilder stringBuilder = new StringBuilder();
    BufferedReader bufferedReader = null;

    try {
        InputStream inputStream = request.getInputStream();
        if (inputStream != null) {
            bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            char[] charBuffer = new char[128];
            int bytesRead = -1;
            while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
                stringBuilder.append(charBuffer, 0, bytesRead);
            }
        } else {
            stringBuilder.append("");
        }
    } catch (IOException ex) {
        throw ex;
    } finally {
        if (bufferedReader != null) {
            try {
                bufferedReader.close();
            } catch (IOException ex) {
                throw ex;
            }
        }
    }

    body = stringBuilder.toString();
    return body;
}

答案 2 :(得分:1)

由于将请求实体直接存储到内存中是很危险的(想象一下,如果客户端发送tera-bytes表示),框架默认情况下不会将表示持久存储到内存中,它们只能被读取一次(来自套接字)。

我想您的问题的答案可以从这里阅读:Restlet reuse InputStream