我有一个servlet,它在请求中接收一个参数,执行一些操作,然后它必须(使用POST)重定向到另一个服务器,其中包含一些JSON参数(包括接收到的参数)。
我的代码是:
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String par = request.getParameter("myParameter");
String par2 = someStuff();
JSONObject json = new JSONObject();
json.put("myParameter", par);
json.put("otherParameter", par2);
response.setContentType("application/json");
response.getWriter().write(json.toString());
...
}
我想用以下内容替换点:
response.sendRedirect(...)
方法,但这是GET请求。
使用RequestDispatcher
方法的forward
,但我无法将请求发送到其他容器。
如何使用JSON参数向另一个容器发送POST请求?
答案 0 :(得分:2)
如果您必须能够联系其他服务器,则必须滚动自己的POST请求。我建议使用像Apache httpcomponents httpclient这样的库来做你的肮脏工作。然后你的代码将如下所示:
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String par = request.getParameter("myParameter");
String par2 = someStuff();
JSONObject json = new JSONObject();
json.put("myParameter", par);
json.put("otherParameter", par2);
HttpPost method = new HttpPost(new URI("https://host/service"));
method.setHeader("Content-Type", "application/json");
method.setEntity(new StringEntity(json.toString(), ContentType.APPLICATION_JSON));
HttpParams params=message.getParams();
HttpConnectionParams.setConnectionTimeout(params, timeout);
HttpConnectionParams.setSoTimeout(params, timeout);
HttpClient client = new DefaultHttpClient();
HttpResponse response = client.execute(method);
InputStream in = response.getEntity().getContent();
// Do whatever you want with the server response
// available in "in" InputStream
...
}
请注意,您需要添加一大堆错误处理,因为其中许多方法可能会失败(尤其是对HttpClient.execute
的调用),并且您希望设置适当的超时对于电话,否则当您联系可能会阻碍您的其他服务时,您将使您的HTTP客户端成为您想要的。
如果您发现JSON POST请求需要一段时间,您可以查看将您的工作放入单独的线程并使用Websocket等异步通信模型与您的客户进行通信的可能性。您可能会发现,通过这样的策略,您可以获得更好的整体服务器性能。
答案 1 :(得分:1)
对于第一个解决方案(不可靠):
在用户会话中设置JSON obj
,并将用户重定向到目标cgi/path
,目标路径将从会话中找到JSON对象。
//in source servlet
req.getSession().setAttribute("json_obj",json_obj);
req.getSession().setAttribute("another_param",<<anotehr_param>>);
//in the target servlet
JSONObject json=(JSONObject)req.getSession().getAttribute("json_obj");
<小时/> 第二种解决方案:
将JSON obj
设置为请求属性并分派请求,请注意某个容器(例如某些版本的tomcat)有关于使用调度请求进行编码的错误。
//in source servlet
req.setAttribute("json_obj",json_obj);
req.getRequestDispatcher("/target_cgi").forward(req,resp);
//in target servlet
JSONObject json=(JSONObject)req.getAttribute("json_obj");