2012-10-18 36 views
1

我有一个REST服务,我无法修改,上传图像的方法以Base64字符串编码。制作大型REST请求

问题是,图像可能会达到5-10MB的大小,也许更多。当我尝试在设备上构建此大小的图像的Base64表示形式时,出现OutOfMemory异常。

我可以一次然而编码的字节块(3000比方说),但是这没用,因为我需要整个字符串创建一个HTTPGET/HttpPost对象:

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

是否有办法这样做吗?我想在下面一行发现一个异常(“java.io.FileNotFoundException:http://www.google.com”):InputStream in = urlConnection.getInputStream();

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,然后一次输出长字符串的几个字符。它是否正确?

+0

你需要告诉服务使用put或post等。通过con.setMethod(“POST”) –

回答

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之后谷歌建议URLConnection通过HTTP客户端。请参阅DefaultHttpClient的说明。

您可能想要查看的另一件事是要发送的数据量。在移动网络上传输10 MB + base64需要很长时间(即使采用gzip压缩,如果服务器端接受它,则透明地启用这种压缩)。

+0

感谢您的反馈意见。我遇到麻烦,但使用该方法..我无法知道请求经过而不看响应。我会怎么做?你能否检查我的问题的编辑部分? – Buffalo

1

您必须阅读此REST服务的文档,否则此类服务不会要求您在GET中发送如此长的数据。图像始终作为POST发送。 POST数据总是在请求的末尾,并且允许迭代地添加。

+0

此服务没有文档。即使有,我们也可能无法访问它们。这个REST服务afaik是一个旧的SOAP服务的新增包装,它再次被记录在案。 – Buffalo

+0

你检查过这个服务器是否会接受这么长的URL?大多数服务器最多只能接受几KB的URL。 – marcinj