Nous utilisons httpClient pour mettre en œuvre une API de repos.
Nous lisons la réponse du serveur à l'aide de: p> Quand nous faisons ce avertissement: p> le docs continuer à dire: P> httpclient est capable d'efficace
Demande / réponse Streaming corporel. Grand
Les entités peuvent être soumises ou reçues
sans être tamponné en mémoire. Cette
est particulièrement critique si plusieurs
Les méthodes HTTP peuvent être exécutées
simultanément. Bien qu'il y ait
méthodes de commodité pour traiter avec
Entités telles que des cordes ou des octets
tableaux, leur utilisation est découragée.
Sauf si utilisé soigneusement, ils peuvent facilement
conduire à des conditions de mémoire,
depuis qu'ils impliquent la mise en mémoire tampon de la
entité complète en mémoire. p>
blockQuote> Donc, ma question est, si vous avez besoin de la réponse complète en tant que chaîne (c.-à-d .: Pour stocker dans une DB ou pour analyser à l'aide de DOM), pourquoi est-ce plus efficace de mémoire pour utiliser un flux? < / p> p>
4 Réponses :
L'ensemble du processus n'est pas plus efficace de mémoire. Si vous lisez à partir d'un flux et mettez-le dans une chaîne, vous ne séparez simplement le processus en deux parties de sorte que la classe HTTPCLIENT ne le remarque pas. P>
Si vous avez vraiment besoin de la chaîne entière, vous pouvez ignorer l'avertissement. Il vous est alors à vous de vous assurer qu'il n'utilise pas trop de mémoire par demande, de sorte que le serveur ne puisse pas facilement être abattu par une attaque DOS. P>
Votre question confond le point. P>
Si vous avez absolument besoin de toute la réponse en tant que chaîne, faites-le, P>
Mais si vous pouvez du tout sortir avec elle, utilisez des flux. P>
Lorsque vous chargez toute la réponse dans une chaîne, tout le corps de réponse est présent en mémoire à la fois. P>
Utilisation des flux, seule une petite partie de la réponse est maintenue en mémoire à la fois. P>
La documentation dit que, en particulier avec plusieurs grosses demandes à la fois, charger le corps de la demande entière dans une chaîne nécessitera beaucoup de mémoire. P>
Il est plus efficace d'utiliser un flux plutôt que d'obtenir toute l'entité en tant que chaîne, car ce dernier signifie que P>
Si vous avez traité la réponse en tant que flux, ce que vous faites réellement, c'est le traitement n octets à la fois. Cela signifie que vous pouvez commencer à traiter le premier segment de réponse lorsque le serveur distant renvoie toujours le prochain segment des données. Par conséquent, cela a plus de sens comme une méthode d'accès si em> votre cas d'utilisation vous permet de traiter les données telles qu'elles sont reçues. P>
Si toutefois, vous avez besoin de toute la réponse en tant que chaîne pour une raison quelconque, toutes les gains de la méthode du flux n'ont pas de roulement à vous - car même si vous lisez la réponse en morceaux, vous devez toujours attendre le Réponse complète - et faites-la tout contenue dans une seule chaîne - avant de pouvoir le traiter. P>
L'efficacité de l'utilisation d'un flux n'est disponible que si vous avez un cas utile où vous pouvez commencer à traiter la réponse avant de disposer de l'ensemble du corps de réponse. P>
Si vous analyse dans un org.w3c.document code> (ou mieux encore, un
org.jdom.document code>), il est vraiment facile d'utiliser directement le flux . Ex:
org.apache.http.HttpResponse hr = httpClient.execute(httpRequest);
org.apache.http.HttpEntity he = hr.getEntity();
org.jdom.input.SAXBuilder builder = new SAXBuilder();
org.jdom.Document document = builder.build(he.getContent());