5

私はPlayframework2.xアプリケーションに取り組んでいます。私のアプリケーションのコントローラーは、JSON応答をブラウザー/エンドポイントに返します。応答本文のGZIP圧縮を有効にする簡単な方法があるかどうかを知りたいと思いました。

4

4 に答える 4

3

現在プレイ2.0.4では、非アセットの簡単な方法はありません。

Java APIの場合、次のものを使用できます。

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;
}
于 2012-10-28T08:50:51.057 に答える
2

gzipで圧縮するのは、Apacheフロントエンドを備えたほぼ完全なケーキです。

Apache 2.4では、コンテンツタイプの基本セットを使用したブロックを介したgzip処理Locationは次のようになります。

<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>
于 2012-11-22T18:43:18.487 に答える
1

でGzipFilterPlay framework 2.2+を使用することが可能です。sbt経由で利用可能:

libraryDependencies ++= filters

あなたがscalaの人なら、Gzipクラスを見る価値があります。

于 2014-10-23T09:48:48.107 に答える
0

ここで述べたように、Play 2.5では:

gZipフィルターを含めるためのサンプルコードを次に示します(複数のフィルターの追加を紹介するサンプルCORSフィルターと一緒に):

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 };
    }

}
于 2016-11-22T23:56:19.780 に答える