Domanda

Sto cercando di creare una richiesta di post HTTP usando il client HTTP Apache.Sto cercando di copiare i contenuti di una richiesta di post HTTP (ricevuta alla mia applicazione) a un'altra richiesta di post HTTP (avviata dalla mia applicazione a un altro URL).Il codice è mostrato sotto:

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);
.

Fondamentalmente, sto cercando di implementare un'applicazione proxy che riceverà un URL come parametro, scattando la richiesta all'URL e quindi servono pagine ecc. Nell'aspetto personalizzato.

Qui request è httpsvletRequest.Sto affrontando il problema nella regolazione della lunghezza del contenuto.Attraverso il debugging ho scoperto che clientToProxyBuf.available() non mi dà la lunghezza corretta del flusso di input e ricevo l'errore HTTP 400 IE e Error 354 (net::ERR_CONTENT_LENGTH_MISMATCH): The server unexpectedly closed the connection in Chrome.

Sto facendo male?C'è qualche altro modo per raggiungerlo?

È stato utile?

Soluzione

era piuttosto semplice e molto ovvio.Avevo solo bisogno di ottenere la lunghezza del contenuto dall'intestazione come:

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

Altri suggerimenti

La funzione available() non fornisce la lunghezza effettiva del contenuto del flusso, piuttosto

.

Restituisce il numero di byte che possono essere letti da questo flusso di ingresso senza blocco.(Da javadoc )

Ti suggerirei di leggere prima l'intero contenuto dal flusso, quindi impostare il contenuto, anziché passare l'oggetto del flusso.In questo modo, avrai anche la lunghezza effettiva del contenuto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top