9

嗨,我想从 Web 服务读取 PNG,然后用 PNG 响应客户端。(想想像一个图像代理)。我在 WS 类中使用 Java 和 Play Framework 2.0。

目前我有:

public static Result getimage(){

  WSRequestHolder requestHolder = WS.url("http://someimageserver/myimage.png");
  Promise<WS.Response> getImageResult = requestHolder.get();
  //How do I create an play.mvc.Result from this so I can sent it back to the callee?

}

任何帮助深表感谢。

4

2 回答 2

6

在 Play 2.0.4 中,您不能在 Java 中做到这一点。首先,API 中没有二进制文件的方法:http ://www.playframework.org/documentation/api/2.0.4/java/play/libs/WS.Response.html 。我尝试了 WS.Response.getBody() 方法,但字节不正确。

但是 Scala API 在 Play 2.0.4 中支持二进制文件:

package controllers

import play.api._
import libs.ws.WS
import play.api.mvc._

object Application extends Controller {

  def getImage = Action {
    Async {
      WS.url("http://someimageserver/myimage.png").get().map { r =>
        Ok(r.getAHCResponse.getResponseBodyAsBytes).as("image/png")
      }
    }
  }

}

从 Play 2.1 开始支持 Java 中的二进制文件:https ://github.com/playframework/Play20/blob/master/framework/src/play-java/src/main/java/play/libs/WS.java# L565

于 2012-12-11T21:04:40.087 回答
5

谢谢,看来我必须耐心等待:)。我找到了一种解决方法(直接使用 ning )。

//imports
import java.util.concurrent.Future;
import com.ning.http.client.AsyncHttpClient;
import com.ning.http.client.AsyncHttpClient.BoundRequestBuilder;
import com.ning.http.client.Response;

//request
AsyncHttpClient asyncHttpClient = new AsyncHttpClient();
BoundRequestBuilder prepareGet = asyncHttpClient.prepareGet(url);
Future<Response> fResponse = prepareGet.execute();
Response r = fResponse.get();
InputStream responseBodyAsStream = r.getResponseBodyAsStream();

return ok(responseBodyAsStream).as('image/png');
于 2012-12-14T12:57:41.583 回答