Java代理POST请求到辅助服务器

时间:2017-03-09 14:30:06

标签: java tomcat8 http-proxy

这是我到目前为止的代码。

从原始请求中读取所有表单名称/值的作用是什么。 什么不起作用是新服务器没有收到任何新分配的表单名称/值。基本上他们似乎没有传输到辅助服务器。

可能有一种更简单的方法吗?我需要的是从新服务器触发特定表单字段并重定向到将处理请求的子服务器,并将结果通过主服务器传递回客户端(代理)。

String value = String.format("https://%s.myotherserver.com%s", "sub1", request.getRequestURI());

HttpPost uploadFile = new HttpPost(value);
uploadFile.addHeader("Content-Type", request.getContentType());
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);

ContentBody cbFile = new InputStreamBody(request.getPart("audio").getInputStream(), ContentType.create("audio/webm"),"audio.ogg");
builder.addPart("audio", cbFile);

builder.addPart("text", new StringBody(request.getParameter("text"),ContentType.DEFAULT_TEXT));
builder.addPart("email", new StringBody(request.getParameter("email"),ContentType.DEFAULT_TEXT));

// now add the other original form name/values to new request
do
{
    String parameterName = reqParameterNames.nextElement().toString();
    Object parameterValue = request.getParameter(parameterName);
    if (!privateParameters.contains("p_"+parameterName)) {
        builder.addPart(new FormBodyPart(parameterName, new StringBody((String) parameterValue,ContentType.DEFAULT_TEXT)));
    }
} while (reqParameterNames.hasMoreElements());

HttpEntity multipart = builder.build();
uploadFile.setEntity(multipart);

CloseableHttpClient httpClient2 = HttpClients.createDefault();
CloseableHttpResponse statusCode = httpClient2.execute(uploadFile);
HttpEntity responseEntity = statusCode.getEntity();
StringBuffer responseBuffer = new StringBuffer();
OutputStream output = response.getOutputStream();
ByteStreams.copy(responseEntity.getContent(), output);
output.flush();

1 个答案:

答案 0 :(得分:0)

我终于设法让它使用以下代码。我希望这可以帮助别人;

MultipartEntityBuilder mb = null; 
org.apache.http.HttpEntity entity =null;
String value = String.format("https://%s.myotherserver.com%s", "sub1", request.getRequestURI());

mb = MultipartEntityBuilder.create();
mb.addTextBody("noproxy", "true");
mb.addTextBody("text", request.getParameter("text"));
mb.addTextBody("email", request.getParameter("email"));
mb.addBinaryBody("audio", new File(inputAudioFilename));

entity = mb.build();
URLConnection conn = new URL(urlStr[i]).openConnection();
conn.setDoOutput(true);
conn.addRequestProperty(entity.getContentType().getName(), entity.getContentType().getValue());
conn.addRequestProperty("Content-Length", String.valueOf(entity.getContentLength()));
OutputStream fout = conn.getOutputStream();
entity.writeTo(fout);//write multi part data...
fout.flush();
fout.close();
OutputStream output = response.getOutputStream();
output.flush();
                    ByteStreams.copy(conn.getInputStream(),response.getOutputStream());

conn.getInputStream().close();