Comment diffuser le corps de la réponse avec apache HttpClient
Il y a une api j'ai besoin pour effectuer octet-streaming de qui n'ont pas de longueur. C'est juste un flux de données en temps réel. Le problème que je rencontre est que lorsque je fais ma demande, il semble vouloir attendre pour la fin du contenu avant la lecture de l'information dans l'inputstream, cependant, c'est ne pas voir la fin de la teneur et des timingout avec NoHttpResponse exception. Ci-dessous est une version simplifiée de mon code:
private static HttpPost getPostRequest() {
//Build uri
URI uri = new URIBuilder()
.setScheme("https")
.setHost(entity.getStreamUrl())
.setPath("/")
.build();
//Create http http
HttpPost httpPost = new HttpPost(uri);
String nvpsStr = "";
Object myArray[] = nvps.toArray();
for(int i = 0; i < myArray.length; i ++) {
nvpsStr += myArray[i].toString();
if(i < myArray.length - 1) {
nvpsStr += "&";
}
}
//Build http payload
String request = nvpsStr + scv + streamRequest + "\n\n";
//Attach http data
httpPost.setEntity(new StringEntity(URLEncoder.encode(request,"UTF-8")));
return httpPost;
}
//Where client is simply
//private static final CloseableHttpClient client = HttpClients.createDefault();
private static runPostRequest (HttpPost request) {
CloseableHttpResponse response = client.execute(request);
try {
HttpEntity ent = response.getEntity();
InputStream is = ent.getContent();
DataInputStream dis = new DataInputStream(is);
//Only stream the first 200 bytes
for(int i = 0; i < 200; i++) {
System.out.println(( (char)dis.readByte()));
}
} finally {
response.close();
}
}
Cela fonctionne très bien pour moi. Peut-être nous montrer votre côté serveur.
Je n'ai aucun contrôle de code côté serveur. C'est juste une 3e partie de l'api que j'utilise pour diffuser des cours de la bourse.
Pouvez-vous nous donner un exemple? J'ai essayé avec une simple servlet qui serait diffuser quelques octets toutes les quelques secondes et je n'ai eu aucun problèmes de réception de contenu.
Malheureusement, l'api j'utilise m'a fait signer une clause de confidentialité. Je vais certainement vérifier avec leur personnel sur cette question. Merci pour la vérification de la validité de ce code.
double possible de Apache HTTPClient Streaming Requête HTTP POST?
Je n'ai aucun contrôle de code côté serveur. C'est juste une 3e partie de l'api que j'utilise pour diffuser des cours de la bourse.
Pouvez-vous nous donner un exemple? J'ai essayé avec une simple servlet qui serait diffuser quelques octets toutes les quelques secondes et je n'ai eu aucun problèmes de réception de contenu.
Malheureusement, l'api j'utilise m'a fait signer une clause de confidentialité. Je vais certainement vérifier avec leur personnel sur cette question. Merci pour la vérification de la validité de ce code.
double possible de Apache HTTPClient Streaming Requête HTTP POST?
OriginalL'auteur Dr.Knowitall | 2014-12-09
Vous devez vous connecter pour publier un commentaire.
EDIT 2
Donc, si u pas à l'aise avec les threads/runnables/Gestionnaires et pas à l'aise avec android AsyncTask, je voudrais juste aller directement à HttpUrlConnection (baisse de l'ensemble de l'exercice avec des apacheHttpClient parce que , fondamentalement, googl dit que HttpUrlConn soutiendra flux avais la réponse et il fonctionne!)
Il peut ne pas être aussi facile instrumentant tous les détails, comme le dumping des en-têtes. Mais , avec un normal en streaming réponse de l'Objet, je pense qu'il devrait fonctionner.... voir modifier 3 pour UrlConn exemple de code
EndEdit2
Pas clairement la question de ce que "stream", le protocole utilisé est le protocole (progressive dwnld | http streaming) OU comment vous êtes réellement gérer le flux de réponse sur votre client.
Recommandé de vider les en-têtes de la connexion pour voir exactement ce que le Client et le serveur sont d'accord sur??
En supposant que u sont sur le thread d'INTERFACE utilisateur (que ce soit dans asyncTask ou dans le callback partie d'un Gestionnaire d') donc vous pouvez avoir à refactoriser un peu.
En supposant flux http à utiliser avec apache client 4.3.5+
Si il n'y a pas de longueur dans les en-têtes de la réponse, alors vous faites un "bloc" de la réponse sur Http 1.1 où vous devez lire un tampon til u obtenir un "dernier morceau" ou décider de FERMER le flux de données ou la Connexion:
Le serveur commence à envoyer (streaming) et le client doit utiliser le 'entrée de jet" qu'il obtient à partir de la réponse http en utilisant un tampon que par le détail apache notes sur entité qui produit le contenu.
Je ne me souviens pas de la main gauche si le socket-délai d'attente de 30 secondes anticiper un flux actif? Rappelez-vous dans apache, séparé des paramètres dans le constructeur pour la prise du délai d'attente, et que le délai d'attente. Ne veux pas de prise à proximité sur u et, ne veulent pas de délai d'attente sur un lisible du flux d'octets disponibles pendant que le serveur est de fournir la réponse.
De toute façon, le côté client, le gestionnaire doit juste être conscient de la façon dont le flux se termine par l'inspection de ce qui est lu dans le tampon...
Si le protocole est de "continuer" & "chunked", alors la réponse du gestionnaire sur le client devrait être dans un flux de données gestionnaire de la boucle JUSQU'à ce qu'il voit le DERNIER MORCEAU de l' http spec.
devrait vous donner la référence que vous avez besoin pour traiter la réponse du ruisseau jusqu'au dernier morceau'...
Je pense que u doit lire ici sur la façon de consommer un tampon entité où plus d'une seule lecture va être besoin de vent jusqu'au dernier morceau de " dans la réponse. Son une autre raison pour laquelle HttpUrlConn peut-être plus facile...
De faire une boucle qui gère tampon lit jusqu'à la FIN signalé par les octets correspondant à "dernier morceau'.
Puis CLO soit le cours d'eau ou CONN comme par le détail apache notes sur les entités consommatrices et de la réutilisation des Connexions.
MODIFIER code pour streaming réponse dans apache HttpClient
Dans un " gestionnaire de rappel ou en asyncTask
MODIFIER 3
httpUrlConnection version si u se passent de cette façon. ( utilise un MessageHandler, mais u peut consommer les octets en place, car c'est à partir d'un flux de parole et l'exemple et les mots du texte sont envoyés à l'INTERFACE utilisateur ici)
hmmm. à partir de votre code ressemble à un apache httpclient. OMI et 4.3.5 + si vous définissez les en-têtes pour continuer et pour chunked, j'ai pensé que le pseudo-code dans mon montage consomme de la réponse.de l'entité.
Je n'ai pas encore essayé, je vais vérifier. Je suis seulement en espérant que le serveur supporte le protocole http 1.1 comme vous l'avez dit. J'ai marqué ce la réponse, car il semble certainement comme ce que je cherchais. Je vais vous revenir avec les résultats. Merci!!!!
Ouais. Gardez à l'esprit que sous android, avec des flux/entités, il peut toujours exister une situation où httpUrlconnection sera mieux pour la manipulation du flux encapsulé. Je voudrais expérience avec apache pour trouver la bonne personne morale, 'wrapper . Ensuite, si pas de travail , à l'httpUrlConn
Remarque. Curl POST avec "trace-asques' exécuter sur de très courtes stream vous fournir quelques bonnes contexte sur les détails.
OriginalL'auteur Robert Rowntree