由于向后兼容,默认情况下,所有未定义字符集的HTTP请求都会转换为ISO-8859-1。我们的内线发球了!应用程序正确接收带有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);
}
}
在这个“filter”方法中,现在缺少查询请求是PUT还是POST并且没有定义字符编码的代码段,并将此请求的正文从ISO-8859-1转换为UTF-8,否则它将把请求的正文从任何字符集转换为UTF-8。
Apache Tomcat通过过滤器解决了这个问题:http://wiki.apache.org/tomcat/FAQ/CharacterEncoding#Q3
我在Netty中没有发现任何与Tomcat相似的特性,只有这个全局拦截器在运行!关卡。
发布于 2013-07-01 18:53:29
Request
对象有一个返回请求正文的body()
方法。
该主体的类型为RequestBody
,它有一个返回Http.RawBuffer的asRaw()
方法。
在那里,您可以获取正文的byte[],并根据需要对其进行处理。例如,String
允许您从指示字符集的byte[]创建字符串(请参阅documentation),并且由于您可以从请求中的头部获取charset
,因此您可以创建正确的字符串。
编辑:
在对注释的回答中,要应用这一点,您可能希望使用BodyParser而不是Global
类
https://stackoverflow.com/questions/17281643
复制相似问题