Playframework 2.x uygulamasında çalışıyorum. Uygulamamdaki denetleyiciler, JSON yanıtını tarayıcıya/son noktaya geri döndürüyor. Yanıt gövdelerinin GZIP sıkıştırmasını etkinleştirmenin basit bir yolu olup olmadığını bilmek istedim.GZIP, PlayFramework 2.0'daki yanıt gövdesi
5
A
cevap
2
gzip'ing hemen hemen bir Apache ön uç ile tamamlandı pasta.
gibi görünebilir içerik türlerinin temel seti kullanılarakLocation
bloğu üzerinden taşıma Apache 2.4 gzip On
:
<Location />
...
AddOutputFilterByType DEFLATE text/css application/x-javascript text/x-component text/html text/richtext image/svg+xml text/plain text/xsd text/xsl text/xml image/x-icon
SetOutputFilter DEFLATE
</Location>
3
Şu anda oyunda 2.0.4 varlıklar için basit bir yol yoktur.
Java API için şunu kullanabilirsiniz:public static Result actionWithGzippedJsonResult() throws IOException {
Map<String, String> map = new HashMap<String, String>();
map.put("hello", "world");
final String json = Json.toJson(map).toString();
return gzippedOk(json).as("application/json");
}
/** Creates a response with a gzipped string. Does NOT change the content-type. */
public static Results.Status gzippedOk(final String body) throws IOException {
final ByteArrayOutputStream gzip = gzip(body);
response().setHeader("Content-Encoding", "gzip");
response().setHeader("Content-Length", gzip.size() + "");
return ok(gzip.toByteArray());
}
//solution from James Ward for Play 1 and every request: https://gist.github.com/1317626
public static ByteArrayOutputStream gzip(final String input)
throws IOException {
final InputStream inputStream = new ByteArrayInputStream(input.getBytes());
final ByteArrayOutputStream stringOutputStream = new ByteArrayOutputStream((int) (input.length() * 0.75));
final OutputStream gzipOutputStream = new GZIPOutputStream(stringOutputStream);
final byte[] buf = new byte[5000];
int len;
while ((len = inputStream.read(buf)) > 0) {
gzipOutputStream.write(buf, 0, len);
}
inputStream.close();
gzipOutputStream.close();
return stringOutputStream;
}
1
Play framework 2.2+
yılında GzipFilter kullanmak mümkündür. sbt aracılığıyla ulaşılabilen:
libraryDependencies ++= filters
, bu Gzip class bakarak değer.
Oynat 2.5 ile
0
, here belirtildiği gibi: İşte
(birden çok filtre ekleyerek vitrin örnek bir CORS filtresiyle birlikte) gzip Filtre dahil etmek için bir örnek kod var:
import javax.inject.Inject;
import play.api.mvc.EssentialFilter;
import play.filters.cors.CORSFilter;
import play.filters.gzip.GzipFilter;
import play.http.HttpFilters;
public class Filters implements HttpFilters {
@Inject
CORSFilter corsFilter;
@Inject
GzipFilter gzipFilter;
@Override
public EssentialFilter[] filters() {
return new EssentialFilter[] { corsFilter, gzipFilter };
}
}
Çal paravan arkasında yaşıyorsa sonunda (apache, nginx, vb.) o zaman bunu yapın, basit, doğrudan ve etkili – virtualeyes
Bunu bir cevap olarak kabul ederseniz kabul ediyorum :) – rOrlig
eminim, yaklaşımımı da dahil edeceğim – virtualeyes