(转)获取 request 中用POST方式"Content-type"是"applicationx-www-form-urlencoded;charset=utf-8&

xiaoxiao2021-02-28  67

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串了

方式一:通过流的方式

 

[java] view plain copy   print? 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(""", "\"");          // 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);      }    }   //在controll中进行调用 String content = HttpJsonUtils.getPostByApplicationForm(request); LOGGER.info("content*************" + content); JSONObject jsObject = JSONObject.fromObject(content); try { ipbegin = jsObject.getLong("ipbegin"); ipend = jsObject.getLong("ipend"); province = jsObject.getString("province"); isopen = jsObject.getString("isopen"); opertime = jsObject.getString("opertime"); sign = jsObject.getString("sign"); } catch (Exception e) { // TODO: handle exception e.getMessage(); LOGGER.info("发生错误*****" + e.getMessage()); } LOGGER.info("ipbegin********************************" + ipbegin); LOGGER.info("ipend********************************" + ipend); LOGGER.info("province********************************" + province); LOGGER.info("isopen********************************" + isopen); LOGGER.info("opertime********************************" + opertime); LOGGER.info("sign********************************" + sign);

  

方式二:通过获取Map的方式处理

 

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

 

[java] view plain copy   print? /**       * 方法说明 :通过获取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处理的

 

[java] view plain copy   print? /**       * 方法说明 :通过获取所有参数名的方式      */       @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://www.cnblogs.com/SimonHu1993/p/7295765.html

转载请注明原文地址: https://www.6miu.com/read-79792.html

最新回复(0)