获取 request 中用POST方式"Content-type"是"application/x-www-form-urlencoded;charset=utf-8"发送的 json 数据

来源:互联网 发布:淘宝买家不退货 编辑:程序博客网 时间:2024/05/17 21:52

request中发送json数据用post方式发送Content-type用application/json;charset=utf-8方式发送的话,直接用springMVC的@RequestBody标签接收后面跟实体对象就行了,spring会帮你自动拼装成对象,如果Content-type设置成application/x-www-form-urlencoded;charset=utf-8就不能用spring的东西了,只能以常规的方式获取json串了

方式一:通过流的方方式

import java.io.IOException;import javax.servlet.http.HttpServletRequest;/**       * request 对象的相关操作 * @author zhangtengda         * @version 1.0       * @created 2015年5月2日 下午8:25:43      */       public class GetRequestJsonUtils {    /***     * 获取 request 中 json 字符串的内容     *      * @param request     * @return : <code>byte[]</code>     * @throws IOException     */    public static String getRequestJsonString(HttpServletRequest request)            throws IOException {        String submitMehtod = request.getMethod();        // GET        if (submitMehtod.equals("GET")) {            return new String(request.getQueryString().getBytes("iso-8859-1"),"utf-8").replaceAll("%22", "\"");        // POST        } else {            return getRequestPostStr(request);        }    }    /**           * 描述:获取 post 请求的 byte[] 数组     * <pre>     * 举例:     * </pre>     * @param request     * @return     * @throws IOException           */    public static byte[] getRequestPostBytes(HttpServletRequest request)            throws IOException {        int contentLength = request.getContentLength();        if(contentLength<0){            return null;        }        byte buffer[] = new byte[contentLength];        for (int i = 0; i < contentLength;) {            int readlen = request.getInputStream().read(buffer, i,                    contentLength - i);            if (readlen == -1) {                break;            }            i += readlen;        }        return buffer;    }    /**           * 描述:获取 post 请求内容     * <pre>     * 举例:     * </pre>     * @param request     * @return     * @throws IOException           */    public static String getRequestPostStr(HttpServletRequest request)            throws IOException {        byte buffer[] = getRequestPostBytes(request);        String charEncoding = request.getCharacterEncoding();        if (charEncoding == null) {            charEncoding = "UTF-8";        }        return new String(buffer, charEncoding);    }}
方式二:通过获取Map的方式处理

这种刚方式存在弊端,如果json数据中存在=号,数据会在等号的地方断掉,后面的数据会被存储成map的values,需要重新拼装key和values的值,拼装成原来的json串

/**  * 方法说明 :通过获取map的方式 */ @SuppressWarnings("rawtypes")private String getParameterMap(HttpServletRequest request) {Map map = request.getParameterMap();String text = "";if (map != null) {Set set = map.entrySet();Iterator iterator = set.iterator();while (iterator.hasNext()) {Map.Entry entry = (Entry) iterator.next();if (entry.getValue() instanceof String[]) {logger.info("==A==entry的key: " + entry.getKey());String key = (String) entry.getKey();if (key != null && !"id".equals(key) && key.startsWith("[") && key.endsWith("]")) {text = (String) entry.getKey();break;}String[] values = (String[]) entry.getValue();for (int i = 0; i < values.length; i++) {logger.info("==B==entry的value: " + values[i]);key += "="+values[i];}if (key.startsWith("[") && key.endsWith("]")) {text = (String) entry.getKey();break;}} else if (entry.getValue() instanceof String) {logger.info("==========entry的key: " + entry.getKey());logger.info("==========entry的value: " + entry.getValue());}}}return text;}

方式三:通过获取所有参数名的方式

这种方式也存在弊端  对json串中不能传特殊字符,比如/=, \=, /, ~等的这样的符号都不能有如果存在也不会读出来,他的模式和Map的方式是差不多的,也是转成Map处理的

/**  * 方法说明 :通过获取所有参数名的方式 */ @SuppressWarnings({ "rawtypes", "unchecked" })private String getParamNames(HttpServletRequest request) {  Map map = new HashMap();          Enumeration paramNames = request.getParameterNames();          while (paramNames.hasMoreElements()) {              String paramName = (String) paramNames.nextElement();                String[] paramValues = request.getParameterValues(paramName);              if (paramValues.length == 1) {                  String paramValue = paramValues[0];                  if (paramValue.length() != 0) {                      map.put(paramName, paramValue);                  }              }          }            Set<Map.Entry<String, String>> set = map.entrySet();          String text = "";        for (Map.Entry entry : set) {          logger.info(entry.getKey() + ":" + entry.getValue());              text += entry.getKey() + ":" + entry.getValue();            logger.info("text------->"+text);        }          if(text.startsWith("[") && text.endsWith("]")){        return text;        }        return "";    }


附上一点常用的Content-type的方式

application/x-javascript text/xml->xml数据 application/x-javascript->json对象 application/x-www-form-urlencoded->表单数据 application/json;charset=utf-8 -> json数据

最后附上发送方式的连接

http://blog.csdn.net/mingtianhaiyouwo/article/details/51381853





0 0
原创粉丝点击