Вопрос

Я пытаюсь выполнить запрос Http POST с помощью HTTP-клиента Apache.Я пытаюсь скопировать содержимое запроса HTTP POST (полученного моим приложением) в другой запрос HTTP POST (инициированный моим приложением на другой URL-адрес).Код показан ниже:

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

По сути, я пытаюсь реализовать прокси-приложение, которое будет получать URL-адрес в качестве параметра, перенаправлять запрос на URL-адрес, а затем обслуживать страницы и т. д. в индивидуальном стиле.

Здесь request это HttpServletRequest.Я столкнулся с проблемой установки длины контента.Путем отладки я узнал, что clientToProxyBuf.available() не дает мне правильную длину входного потока, и я получаю ошибку Http 400 IE и Error 354 (net::ERR_CONTENT_LENGTH_MISMATCH): The server unexpectedly closed the connection в хроме.

Я делаю это неправильно?Есть ли другой способ добиться этого?

Это было полезно?

Решение

Это было довольно просто и очень очевидно.Мне просто нужно было получить длину контента из заголовка как:

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

Другие советы

А available() функция не предоставляет фактическую длину содержимого потока, а скорее

Возвращает количество байтов, которые можно прочитать из этого входного потока без блокировки.(От Javadoc)

Я бы предложил вам сначала прочитать весь контент из потока, а затем установить его в контент, а не передавать объект потока.Таким образом, вы также получите фактическую длину контента.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top