Question

J'essaie de faire une requête Http POST à ​​l'aide du client HTTP Apache.J'essaie de copier le contenu d'une requête HTTP POST (reçue par mon application) vers une autre requête HTTP POST (initiée depuis mon application vers une autre URL).Le code est affiché ci-dessous :

httpPost = new HttpPost(inputURL);
// copy headers
for (Enumeration<String> e = request.getHeaderNames(); e.hasMoreElements();) {
      String headerName = e.nextElement().toString(); 
      httpPost.setHeader(headerName, request.getHeader(headerName));
}

BufferedInputStream clientToProxyBuf = new BufferedInputStream(request.getInputStream());
BasicHttpEntity basicHttpEntity = new BasicHttpEntity();
basicHttpEntity.setContent(clientToProxyBuf);
basicHttpEntity.setContentLength(clientToProxyBuf.available());

httpPost.setEntity(basicHttpEntity);

HttpResponse responseFromWeb = httpclient.execute(httpPost);

Fondamentalement, j'essaie d'implémenter une application proxy qui obtiendra une URL comme paramètre, transmettra la demande à l'URL, puis servira les pages, etc. dans une apparence personnalisée.

Ici request est HttpServletRequest.Je suis confronté à un problème lors de la définition de la longueur du contenu.Grâce au débogage, j'ai découvert que clientToProxyBuf.available() ne me donne pas la longueur correcte du flux d'entrée et j'obtiens une erreur HTTP 400 IE et Error 354 (net::ERR_CONTENT_LENGTH_MISMATCH): The server unexpectedly closed the connection en chrome.

Est-ce que je le fais mal ?Existe-t-il un autre moyen d'y parvenir ?

Était-ce utile?

La solution

C'était plutôt simple et très évident.J'avais juste besoin d'obtenir la longueur du contenu de l'en-tête comme :

basicHttpEntity.setContentLength(Integer.parseInt(request.getHeader("Content-Length")));

Autres conseils

Le available() la fonction ne fournit pas la longueur réelle du contenu du flux, mais plutôt

Renvoie le nombre d'octets pouvant être lus à partir de ce flux d'entrée sans blocage.(Depuis javadoc)

Je vous suggère de lire d'abord l'intégralité du contenu du flux, puis de le définir sur le contenu, plutôt que de transmettre l'objet flux.De cette façon, vous aurez également la longueur réelle du contenu.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top