2012-10-28 16 views
5

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

+1

Çal paravan arkasında yaşıyorsa sonunda (apache, nginx, vb.) o zaman bunu yapın, basit, doğrudan ve etkili – virtualeyes

+0

Bunu bir cevap olarak kabul ederseniz kabul ediyorum :) – rOrlig

+0

eminim, yaklaşımımı da dahil edeceğim – virtualeyes

cevap

2

gzip'ing hemen hemen bir Apache ön uç ile tamamlandı pasta.

gibi görünebilir içerik türlerinin temel seti kullanılarak Location 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:

Bir scala adam ise
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 }; 
    } 

}