2012-10-18 2 views
1

Je dispose d'un service REST que je ne peux pas modifier, avec des méthodes de chargement d'une image codée en tant que chaîne Base64.Création de requêtes REST volumineuses

Le problème est que les images peuvent aller jusqu'à des tailles de 5-10 Mo, peut-être plus. Lorsque j'essaie de construire une représentation Base64 d'une image de cette taille sur le périphérique, j'obtiens une exception OutOfMemory.

Je peux cependant encoder des morceaux d'octets à la fois (3000, disons), mais cela est inutile que je aurais besoin toute la chaîne pour créer un objet HttpGet/HttpPost:

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

est-il un moyen de contourner cela?

Edit: en essayant d'utiliser les suggestions de Heiko Rupp + le doc android, je reçois une exception ("java.io.FileNotFoundException: http://www.google.com") à la ligne suivante: 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(); 
    } 

Ai-je raté quelque chose? La requête GET que j'ai besoin d'exécuter ressemble à ceci: "http://myRESTService.com/myMethod?params=LOOONG-String", donc l'idée était de se connecter à http://myRESTService.com/myMethod et affiche ensuite quelques caractères de la longue chaîne à la fois. Est-ce correct?

+0

vous devez indiquer au service d'utiliser mettre ou poster par ex. via con.setMethod ("POST") –

Répondre

1

Vous devriez essayer d'utiliser le URLConnection au lieu du client http apache, car cela ne vous oblige pas à tenir l'objet d'envoyer en mémoire, mais vous pouvez faire quelque chose comme:

pseudocode!

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

également dans Android 2.2 après Google recommande le URLConnection sur le client http. Voir la description de DefaultHttpClient.

L'autre chose que vous voudrez peut-être regarder est la quantité de données à envoyer. 10 MB + base64 prendra un certain temps à transférer (même avec la compression gzip, que le URLConnection permet de manière transparente si le côté serveur l'accepte) sur un réseau mobile.

+0

merci pour les commentaires. J'ai cependant des problèmes avec l'utilisation de cette méthode .. Je n'ai aucun moyen de savoir que la demande se passe sans regarder la réponse. Comment ferais-je cela? pourriez-vous s'il vous plaît vérifier la partie éditée de ma question? – Buffalo

1

Vous devez lire les documents pour ce service REST. Aucun service de ce type n'exige que vous envoyiez des données aussi longues dans GET. Les images sont toujours envoyées en tant que POST. Les données POST sont toujours à la fin de la requête et permettent d'être ajoutées de manière itérative.

+0

Il n'y a pas de document pour ce service. Même s'il y en avait, nous n'aurions probablement pas accès à eux. Ce service REST afaik est un wrapper nouvellement ajouté pour un ancien service SOAP .. qui encore une fois, est mal documenté. – Buffalo

+0

avez-vous vérifié si ce serveur accepte une URL aussi longue? La plupart des serveurs acceptent au plus quelques URL de longueur de Ko. – marcinj

Questions connexes