在做項目的API通知接口的時候,發現在SSH框架中無法獲取到對方服務器發來的異步通知信息。
最后排查到的原因可能是struts2對HttpServletRequest進行了二次處理,那么該如何拿到post的請求數據呢,方法很多,下面只給出一種方式。
在servlet中GET請求可以通過HttpServletRequest的getRequestURL方法和getQueryString()得到完 整的請求路徑和請求所有參數列表,
POST的需要getParameterMap()方法遍歷得到,不論GET或POST都可以通過 getRequestURL+getParameterMap()來得到請求完整路徑。
package com.xxx import java.io.IOException; import java.io.PrintWriter; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class GetParams extends HttpServlet { private static final long serialVersionUID = 1L; public GetParams() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter writer = response.getWriter(); writer.println("GET " + request.getRequestURL() + " " + request.getQueryString()); Map<String, String[]> params = request.getParameterMap(); String queryString = ""; for (String key : params.keySet()) { String[] values = params.get(key); for (int i = 0; i < values.length; i++) { String value = values[i]; queryString += key + "=" + value + "&"; } } // 去掉最后一個空格 queryString = queryString.substring(0, queryString.length() - 1); writer.println("GET " + request.getRequestURL() + " " + queryString); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter writer = response.getWriter(); Map<String, String[]> params = request.getParameterMap(); String queryString = ""; for (String key : params.keySet()) { String[] values = params.get(key); for (int i = 0; i < values.length; i++) { String value = values[i]; queryString += key + "=" + value + "&"; } } // 去掉最后一個空格 queryString = queryString.substring(0, queryString.length() - 1); writer.println("POST " + request.getRequestURL() + " " + queryString); } }
根據上面的代碼,稍微改動一下,實現如下:
/** * 獲取POST數據,不支持數組形式數據,一般使用場景是對方使用POST方式傳遞數據過來 * TODO 待完善 * @author phpdragon * @date 2014-12-24 下午3:45:22 * @return * @description : * @return Map<String,String> * @throws */ @SuppressWarnings("unchecked") private static Map<String, String> getPostData() { Map<String, String> param = new HashMap<String, String>(); HttpServletRequest request = ServletActionContext.getRequest(); Map<String, String[]> params = request.getParameterMap(); for (String key : params.keySet()) { String[] values = params.get(key); for (int i = 0; i < values.length; i++) { param.put(key, values[i]); } } return param; }
雖然有所不足,但對於手上的項目中API接口場景已經滿足需求了。