2011-05-16 64 views
4

我正在研究一个GWT应用程序,它可以为二进制数据创建REST调用。我正在尝试使用GWT的RequestBuilder。问题是响应只提供了一个getText()方法。GWT HTTP响应getText()作为二进制

下面是重现问题最简单的例子:

private static void sendRequest() 
{ 
    String url = URL.encode("/object/object_id"); 

    RequestBuilder requestBuilder = new RequestBuilder(RequestBuilder.GET, url); 
    try 
    { 
     requestBuilder.sendRequest("", new RequestCallback() 
     { 
      @Override 
      public void onResponseReceived(Request request, Response response) 
      { 
       String data = response.getText(); ///< Need this to be a byte[] array (e.g. getData()) 
      } 

      @Override 
      public void onError(Request request, Throwable exception) 
      { 
      } 
     }); 
    } 
    catch (RequestException RequestException) 
    { 
    } 
} 

的问题是,GWT是作为一个字符串(我认为)编码响应数据为默认平台的编码。在GWT将其转换为字符串之前有什么方法可以获取数据吗?

回答

3

HTTP可以传输文本和二进制文件,但JavaScript只能通过XHR获取文本。如果你想通过它发送二进制数据,那么Base64对它进行编码。 GWT可以handle Base64

更新:在最近的浏览器(2013年底),二进制数组处理可以通过TypedArray来实现。请参阅browser support

+0

我怀疑了。我们将不得不修改我们的API,以便在返回之前对数据进行基础编码。 – Naijaba 2011-05-18 23:54:39

+1

这是一个错误的答案。 HTTP可以传输二进制数据。一个常见的例子是图像。 – maasg 2011-07-01 16:40:16

+0

是的,我应该更清楚:HTTP可以下载和上传二进制文件,购买二进制文件不可用于JavaScript,因此GWT。 – 2012-01-03 18:47:29

1

您可以使用JSNI在GWT中获取二进制图像。请注意,它不适用于IE。 这是怎样一个例子:

native String getBinaryResource(String url) /*-{ 
    // ...implemented with JavaScript     
    var req = new XMLHttpRequest(); 
    req.open("GET", url, false); // The last parameter determines whether the request is asynchronous -> this case is sync. 
    req.overrideMimeType('text/plain; charset=x-user-defined'); 
    req.send(null); 
    if (req.status == 200) {      
     return req.responseText; 
    } else return null 
}-*/; 

我刚刚完成研究类似的问题,我把额外的信息: Generating an inline-image with java gwt