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

equest中发送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 ?
  1. import java.io.IOException;  
  2.   
  3. import javax.servlet.http.HttpServletRequest;  
  4.   
  5.   
  6. /**       
  7.  * request 对象的相关操作 
  8.  * @author zhangtengda         
  9.  * @version 1.0       
  10.  * @created 2015年5月2日 下午8:25:43      
  11.  */         
  12. public class GetRequestJsonUtils {  
  13.   
  14.     /*** 
  15.      * 获取 request 中 json 字符串的内容 
  16.      *  
  17.      * @param request 
  18.      * @return : <code>byte[]</code> 
  19.      * @throws IOException 
  20.      */  
  21.     public static String getRequestJsonString(HttpServletRequest request)  
  22.             throws IOException {  
  23.         String submitMehtod = request.getMethod();  
  24.         // GET  
  25.         if (submitMehtod.equals("GET")) {  
  26.             return new String(request.getQueryString().getBytes("iso-8859-1"),"utf-8").replaceAll("%22""\"");  
  27.         // POST  
  28.         } else {  
  29.             return getRequestPostStr(request);  
  30.         }  
  31.     }  
  32.   
  33.     /**       
  34.      * 描述:获取 post 请求的 byte[] 数组 
  35.      * <pre> 
  36.      * 举例: 
  37.      * </pre> 
  38.      * @param request 
  39.      * @return 
  40.      * @throws IOException       
  41.      */  
  42.     public static byte[] getRequestPostBytes(HttpServletRequest request)  
  43.             throws IOException {  
  44.         int contentLength = request.getContentLength();  
  45.         if(contentLength<0){  
  46.             return null;  
  47.         }  
  48.         byte buffer[] = new byte[contentLength];  
  49.         for (int i = 0; i < contentLength;) {  
  50.   
  51.             int readlen = request.getInputStream().read(buffer, i,  
  52.                     contentLength - i);  
  53.             if (readlen == -1) {  
  54.                 break;  
  55.             }  
  56.             i += readlen;  
  57.         }  
  58.         return buffer;  
  59.     }  
  60.   
  61.     /**       
  62.      * 描述:获取 post 请求内容 
  63.      * <pre> 
  64.      * 举例: 
  65.      * </pre> 
  66.      * @param request 
  67.      * @return 
  68.      * @throws IOException       
  69.      */  
  70.     public static String getRequestPostStr(HttpServletRequest request)  
  71.             throws IOException {  
  72.         byte buffer[] = getRequestPostBytes(request);  
  73.         String charEncoding = request.getCharacterEncoding();  
  74.         if (charEncoding == null) {  
  75.             charEncoding = "UTF-8";  
  76.         }  
  77.         return new String(buffer, charEncoding);  
  78.     }  
  79.   
  80. }  
方式二:通过获取Map的方式处理

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

[java]  view plain  copy
 print ?
  1. /**  
  2.      * 方法说明 :通过获取map的方式 
  3.      */   
  4.     @SuppressWarnings("rawtypes")  
  5.     private String getParameterMap(HttpServletRequest request) {  
  6.         Map map = request.getParameterMap();  
  7.         String text = "";  
  8.         if (map != null) {  
  9.             Set set = map.entrySet();  
  10.             Iterator iterator = set.iterator();  
  11.             while (iterator.hasNext()) {  
  12.                 Map.Entry entry = (Entry) iterator.next();  
  13.                 if (entry.getValue() instanceof String[]) {  
  14.                     logger.info("==A==entry的key: " + entry.getKey());  
  15.                     String key = (String) entry.getKey();  
  16.                     if (key != null && !"id".equals(key) && key.startsWith("[") && key.endsWith("]")) {  
  17.                         text = (String) entry.getKey();  
  18.                         break;  
  19.                     }  
  20.                     String[] values = (String[]) entry.getValue();  
  21.                     for (int i = 0; i < values.length; i++) {  
  22.                         logger.info("==B==entry的value: " + values[i]);  
  23.                         key += "="+values[i];  
  24.                     }  
  25.                     if (key.startsWith("[") && key.endsWith("]")) {  
  26.                         text = (String) entry.getKey();  
  27.                         break;  
  28.                     }  
  29.                 } else if (entry.getValue() instanceof String) {  
  30.                     logger.info("==========entry的key: " + entry.getKey());  
  31.                     logger.info("==========entry的value: " + entry.getValue());  
  32.                 }  
  33.             }  
  34.         }  
  35.         return text;  
  36.     }  

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

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

[java]  view plain  copy
 print ?
  1. /**  
  2.      * 方法说明 :通过获取所有参数名的方式 
  3.      */   
  4.     @SuppressWarnings({ "rawtypes""unchecked" })  
  5.     private String getParamNames(HttpServletRequest request) {    
  6.         Map map = new HashMap();    
  7.         Enumeration paramNames = request.getParameterNames();    
  8.         while (paramNames.hasMoreElements()) {    
  9.             String paramName = (String) paramNames.nextElement();    
  10.     
  11.             String[] paramValues = request.getParameterValues(paramName);    
  12.             if (paramValues.length == 1) {    
  13.                 String paramValue = paramValues[0];    
  14.                 if (paramValue.length() != 0) {    
  15.                     map.put(paramName, paramValue);    
  16.                 }    
  17.             }    
  18.         }    
  19.     
  20.         Set<Map.Entry<String, String>> set = map.entrySet();    
  21.         String text = "";  
  22.         for (Map.Entry entry : set) {    
  23.             logger.info(entry.getKey() + ":" + entry.getValue());    
  24.             text += entry.getKey() + ":" + entry.getValue();  
  25.             logger.info("text------->"+text);  
  26.         }    
  27.         if(text.startsWith("[") && text.endsWith("]")){  
  28.             return text;  
  29.         }  
  30.         return "";  
  31.     }  


附上一点常用的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

 

java代码发送JSON格式的httpPOST请求


  1. import Java.io.BufferedReader;  
  2. import java.io.DataOutputStream;  
  3. import java.io.IOException;  
  4. import java.io.InputStreamReader;  
  5. import java.io.UnsupportedEncodingException;  
  6. import java.net.HttpURLConnection;  
  7. import java.net.MalformedURLException;  
  8. import java.net.URL;  
  9. import net.sf.json.JSONObject;  
  10.   
  11. public class AppAddTest {  
  12.   
  13.     public static final String ADD_URL = "www.2cto.com";  
  14.   
  15.     public static void appadd() {  
  16.   
  17.         try {  
  18.             //创建连接  
  19.             URL url = new URL(ADD_URL);  
  20.             HttpURLConnection connection = (HttpURLConnection) url  
  21.                     .openConnection();  
  22.             connection.setDoOutput(true);  
  23.             connection.setDoInput(true);  
  24.             connection.setRequestMethod("POST");  
  25.             connection.setUseCaches(false);  
  26.             connection.setInstanceFollowRedirects(true);  
  27.         //application/x-javascript text/xml->xml数据 application/x-javascript->json对象 application/x-www-form-urlencoded->表单数据 application/json;charset=utf-8 -> json数据  
  28.             connection.setRequestProperty("Content-Type",  
  29.                     "application/x-www-form-urlencoded");  
  30.         connection.setRequestProperty("accept""*/*");  
  31.             connection.setRequestProperty("user-agent",  
  32.                     "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");  
  33.   
  34.             connection.connect();  
  35.   
  36.             //POST请求  
  37.             DataOutputStream out = new DataOutputStream(  
  38.                     connection.getOutputStream());  
  39.             JSONObject obj = new JSONObject();  
  40.             obj.element("app_name""asdf");  
  41.             obj.element("app_ip""10.21.243.234");  
  42.             obj.element("app_port"8080);  
  43.             obj.element("app_type""001");  
  44.             obj.element("app_area""asd");  
  45.   
  46.             out.writeBytes(obj.toString());  
  47.             out.flush();  
  48.             out.close();  
  49.   
  50.             //读取响应  
  51.             BufferedReader reader = new BufferedReader(new InputStreamReader(  
  52.                     connection.getInputStream()));  
  53.             String lines;  
  54.             StringBuffer sb = new StringBuffer("");  
  55.             while ((lines = reader.readLine()) != null) {  
  56.                 lines = new String(lines.getBytes(), "utf-8");  
  57.                 sb.append(lines);  
  58.             }  
  59.             System.out.println(sb);  
  60.             reader.close();  
  61.             // 断开连接  
  62.             connection.disconnect();  
  63.         } catch (MalformedURLException e) {  
  64.             // TODO Auto-generated catch block  
  65.             e.printStackTrace();  
  66.         } catch (UnsupportedEncodingException e) {  
  67.             // TODO Auto-generated catch block  
  68.             e.printStackTrace();  
  69.         } catch (IOException e) {  
  70.             // TODO Auto-generated catch block  
  71.             e.printStackTrace();  
  72.         }  
  73.   
  74.     }  
  75.   
  76.     public static void main(String[] args) {  
  77.         appadd();  
  78.     }  
  79.   
  80. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值