在servlet的processRequest方法中发送POST请求

时间:2015-08-26 11:20:37

标签: java tomcat servlets post

我有一个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());

    ...
}

我想用以下内容替换点:

  1. response.sendRedirect(...)方法,但这是GET请求。

  2. 使用RequestDispatcher方法的forward,但我无法将请求发送到其他容器。

  3. 如何使用JSON参数向另一个容器发送POST请求?

2 个答案:

答案 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");