制作大型REST请求

时间:2012-10-18 08:45:06

标签: android rest

我有一个无法改变的REST服务,使用上传图像的方法,编码为Base64字符串。

问题是图像的大小可能达到5-10MB,也许更多。当我尝试在设备上构造此大小的图像的Base64表示时,我得到一个OutOfMemory异常。

然而,我可以一次编码块的字节(假设为3000),但这是无用的,因为我需要整个字符串来创建一个HttpGet / HttpPost对象:

DefaultHttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet("www.server.com/longString");
HttpResponse response = client.execute(httpGet);

有没有办法解决这个问题?

编辑:尝试使用Heiko Rupp的建议+ android文档,我在以下行得到一个异常(“java.io.FileNotFoundException:http://www.google.com”):InputStream in = urlConnection.getInputStream(); < / p>

    try {
        URL url = new URL("http://www.google.com");
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

        urlConnection.setDoOutput(true);
        urlConnection.setChunkedStreamingMode(0);

        OutputStream out = new BufferedOutputStream(urlConnection.getOutputStream());
        out.write("/translate".getBytes());

        InputStream in = urlConnection.getInputStream();
        BufferedReader r = new BufferedReader(new InputStreamReader(in));
        StringBuilder total = new StringBuilder();
        String line;
        while ((line = r.readLine()) != null) {
            total.append(line);
        }           
        System.out.println("response:" + total);

    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

我错过了什么吗?我需要执行的GET请求如下所示: “ http://myRESTService.com/myMethod?params=LOOONG-String ”,所以想法是连接到 http://myRESTService.com/myMethod 然后一次输出长字符串的几个字符。这是对的吗?

2 个答案:

答案 0 :(得分:1)

您应该尝试使用URLConnection而不是apache http客户端,因为这不要求您保留要在内存中发送的对象,而是可以执行以下操作:

<强>伪!

HttpUrlConnection con = restUrl.getConnection();
while (!done) {
  byte[] part = base64encode(partOfImage);
  con.write (part);
  partOfImage = nextPartOfImage();
}
con.flush();
con.close();

同样在Android 2.2之后,Google推荐URLConnection通过http客户端。请参阅DefaultHttpClient的说明。

您可能想要研究的另一件事是要发送的数据量。 10 MB + base64将需要相当长的时间来传输(即使使用gzip压缩,URLConnection,如果服务器端接受它,则透明地启用它)。

答案 1 :(得分:1)

您必须阅读此REST服务的文档,此类服务不会要求您在GET中发送此类长数据。图像始终作为POST发送。 POST数据始终在请求结束时允许迭代添加。