HttpUrlConnection支持Header,Body传值,支持Multipart上传文件

 Http请求之基于HttpUrlConnection,支持Header,Body传值,支持Multipart上传文件:

public static String post(String actionUrl, Map headParams,
			Map params,
			Map files) throws IOException {

		String BOUNDARY = java.util.UUID.randomUUID().toString();
		String PREFIX = "--", LINEND = "\r\n";
		String MULTIPART_FROM_DATA = "multipart/form-data";
		String CHARSET = "UTF-8";

		URL uri = new URL(actionUrl);
		HttpURLConnection conn = (HttpURLConnection) uri.openConnection();
		conn.setReadTimeout(30 * 1000); // 缓存的最长时间
		conn.setDoInput(true);// 允许输入
		conn.setDoOutput(true);// 允许输出
		conn.setUseCaches(false); // 不允许使用缓存
		conn.setRequestMethod("POST");
		conn.setRequestProperty("connection", "keep-alive");
		conn.setRequestProperty("Charsert", "UTF-8");
		conn.setRequestProperty("Content-Type", MULTIPART_FROM_DATA
				+ ";boundary=" + BOUNDARY);
		if(headParams!=null){
			for(String key : headParams.keySet()){
				conn.setRequestProperty(key, headParams.get(key));
			}
		}
		StringBuilder sb = new StringBuilder();

		if (params!=null) {
			// 首先组拼文本类型的参数
			for (Map.Entry entry : params.entrySet()) {
				sb.append(PREFIX);
				sb.append(BOUNDARY);
				sb.append(LINEND);
				sb.append("Content-Disposition: form-data; name=\""
						+ entry.getKey() + "\"" + LINEND);
				sb.append("Content-Type: text/plain; charset=" + CHARSET + LINEND);
				sb.append("Content-Transfer-Encoding: 8bit" + LINEND);
				sb.append(LINEND);
				sb.append(entry.getValue());
				sb.append(LINEND);
			}
			
		}
		
		DataOutputStream outStream = new DataOutputStream(
				conn.getOutputStream());
		if (!TextUtils.isEmpty(sb.toString())) {
			outStream.write(sb.toString().getBytes());
		}
		

		// 发送文件数据
		if (files != null)
			for (Map.Entry file : files.entrySet()) {
				StringBuilder sb1 = new StringBuilder();
				sb1.append(PREFIX);
				sb1.append(BOUNDARY);
				sb1.append(LINEND);
				sb1.append("Content-Disposition: form-data; name=\"file\"; filename=\""
						+ file.getKey() + "\"" + LINEND);
				sb1.append("Content-Type: application/octet-stream; charset="
						+ CHARSET + LINEND);
				sb1.append(LINEND);
				outStream.write(sb1.toString().getBytes());

				InputStream is = new FileInputStream(file.getValue());
				byte[] buffer = new byte[1024];
				int len = 0;
				while ((len = is.read(buffer)) != -1) {
					outStream.write(buffer, 0, len);
					Log.i("HttpUtil", "写入中...");
				}

				is.close();
				outStream.write(LINEND.getBytes());
			}

		// 请求结束标志
		byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes();
		outStream.write(end_data);
		outStream.flush();
		Log.i("HttpUtil", "conn.getContentLength():"+conn.getContentLength());

		// 得到响应码
		int res = conn.getResponseCode();
		InputStream in = conn.getInputStream();
		if (res == 200) {
			 BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in, "UTF-8"));  
			       StringBuffer buffer = new StringBuffer();  
			     String line = "";  
		     while ((line = bufferedReader.readLine()) != null){  
			       buffer.append(line);  
		     }  

//			int ch;
//			StringBuilder sb2 = new StringBuilder();
//			while ((ch = in.read()) != -1) {
//				sb2.append((char) ch);
//			}
			return buffer.toString();
		}
		outStream.close();
		conn.disconnect();
		return in.toString();

	}


 

你可能感兴趣的:(android应用开发基础)