1

由于向后兼容性,所有未定义字符集的 HTTP 请求默认转换为 ISO-8859-1。我们的网络服务 Play!如果这些请求已定义字符集,应用程序将正确接收带有 JSON 正文的 PUT 请求。如果没有,这些请求应该以某种方式转换为 UTF-8,最好是在全局应用程序级别。

因此,我创建了一个 Global.scala 类,该类将负责接收所有入站请求并将这些“未定义”转换为 UTF-8,这将确保在进入相应模块之前正确处理所有请求。

    import play.*;

    public class Global extends GlobalSettings {

    @Override
    public Action onRequest(Request request, Method actionMethod) {

       return super.onRequest(request, actionMethod);
    }
}

在这个“过滤器”方法中,现在缺少代码片段,它将查询请求是 PUT 还是 POST 并且没有定义字符编码,并将此请求的正文从 ISO-8859-1 转换为 UTF-8,否则它将转换请求的正文从它所在的任何字符集转换为 UTF-8。

Apache Tomcat 通过过滤器解决了这个问题:http ://wiki.apache.org/tomcat/FAQ/CharacterEncoding#Q3

我在 Netty 中没有发现任何类似于 Tomcat 的功能,只有 Play 上的这个 Global 拦截器!等级。

4

1 回答 1

0

Request对象有一个body()返回请求正文的方法。

该类型的主体RequestBody有一个asRaw()返回Http.RawBuffer的方法。

从那里您可以获得正文的 byte[] 并根据需要进行处理。例如,String允许您从指示 Charset 的 byte[] 创建一个字符串(请参阅文档),并且您可以charset从请求中的标头中获取 ,然后您可以创建正确的字符串。

编辑:

在回答评论时,要应用它,您可能想要使用BodyParser而不是Global

于 2013-07-01T10:53:28.700 回答