zoukankan      html  css  js  c++  java
  • Android入门:封装一个HTTP请求的辅助类

    前面的文章中,我们曾经实现了一个HTTP的GET 和 POST 请求;

    此处我封装了一个HTTP的get和post的辅助类,能够更好的使用;


    类名:HttpRequestUtil

    提供了如下功能:

    (1)模拟GET请求;

    (2)模拟POST请求;

    (3)模拟文件上传请求;

    (4)发送XML数据;


    发送GET请求


    (1) public static URLConnection sendGetRequest(String url, Map<String, String> params, Map<String, String> headers)

    参数:

    (1)url:单纯的URL,不带任何参数;

    (2)params:参数;

    (3)headers:需要设置的HTTP请求头;

    返回:

    HttpURLConnection


    发送POST请求


    (2)public static URLConnection sendPostRequest(String url, Map<String, String> params, Map<String, String> headers)

    参数:

    (1)url:单纯的URL,不带任何参数;

    (2)params:参数;

    (3)headers:需要设置的HTTP请求头;

    返回:

    HttpURLConnection


    文件上传


    (3)public static boolean uploadFiles(String url, Map<String, String> params, FormFile[] files)

    参数:

    (1)url:单纯URL

    (2)params:参数;

    (3)files:多个文件

    返回:是否上传成功

    (4)public static boolean uploadFile(String path, Map<String, String> params, FormFile file)

    参数:

    (1)url:单纯URL

    (2)params:参数;

    (3)file:一个文件

    返回:是否上传成功


    发送XML数据


    (5)public static byte[] postXml(String url, String xml, String encoding)

    参数:

    (1)url:单纯URL

    (2)xml:XML数据

    (3)XML数据编码


    对于上传文件,FormFile的构造函数声明如下:

    (1)public FormFile(String filname, byte[] data, String parameterName, String contentType)

    参数:

    (1)filname:文件的名称

    (2)data:文件的数据

    (3)parameterName:HTML的文件上传控件的参数的名字

    (4)contentType:文件类型,比如text/plain为txt

    (2)public FormFile(String filname, File file, String parameterName, String contentType)

    参数:

    (1)filname:文件的名称

    (2)file:文件名

    (3)parameterName:HTML的文件上传控件的参数的名字

    (4)contentType:文件类型,比如text/plain为txt



    FormFile.java


    package com.xiazdong.netword.http.util;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.InputStream;
    
    /**
     * 上传文件
     */
    public class FormFile {
    	/* 上传文件的数据 */
    	private byte[] data;
    	private InputStream inStream;
    	private File file;
    	/* 文件名称 */
    	private String filname;
    	/* 请求参数名称*/
    	private String parameterName;
    	/* 内容类型 */
    	private String contentType = "application/octet-stream";
    	
    	/**
    	 * 此函数用来传输小文件
    	 * @param filname
    	 * @param data
    	 * @param parameterName
    	 * @param contentType
    	 */
    	public FormFile(String filname, byte[] data, String parameterName, String contentType) {
    		this.data = data;
    		this.filname = filname;
    		this.parameterName = parameterName;
    		if(contentType!=null) this.contentType = contentType;
    	}
    	/**
    	 * 此函数用来传输大文件
    	 * @param filname
    	 * @param file
    	 * @param parameterName
    	 * @param contentType
    	 */
    	public FormFile(String filname, File file, String parameterName, String contentType) {
    		this.filname = filname;
    		this.parameterName = parameterName;
    		this.file = file;
    		try {
    			this.inStream = new FileInputStream(file);
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		}
    		if(contentType!=null) this.contentType = contentType;
    	}
    	
    	public File getFile() {
    		return file;
    	}
    
    	public InputStream getInStream() {
    		return inStream;
    	}
    
    	public byte[] getData() {
    		return data;
    	}
    
    	public String getFilname() {
    		return filname;
    	}
    
    	public void setFilname(String filname) {
    		this.filname = filname;
    	}
    
    	public String getParameterName() {
    		return parameterName;
    	}
    
    	public void setParameterName(String parameterName) {
    		this.parameterName = parameterName;
    	}
    
    	public String getContentType() {
    		return contentType;
    	}
    
    	public void setContentType(String contentType) {
    		this.contentType = contentType;
    	}
    	
    }
    

    HttpRequestUtil.java

    package com.xiazdong.netword.http.util;
    import java.io.BufferedReader;
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.net.HttpURLConnection;
    import java.net.InetAddress;
    import java.net.Socket;
    import java.net.URL;
    import java.net.URLConnection;
    import java.net.URLEncoder;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Map.Entry;
    import java.util.Set;
    
    /*
     * 此类用来发送HTTP请求
     * */
    public class HttpRequestUtil {
    	/**
    	 * 发送GET请求
    	 * @param url
    	 * @param params
    	 * @param headers
    	 * @return
    	 * @throws Exception
    	 */
    	public static URLConnection sendGetRequest(String url,
    			Map<String, String> params, Map<String, String> headers)
    			throws Exception {
    		StringBuilder buf = new StringBuilder(url);
    		Set<Entry<String, String>> entrys = null;
    		// 如果是GET请求,则请求参数在URL中
    		if (params != null && !params.isEmpty()) {
    			buf.append("?");
    			entrys = params.entrySet();
    			for (Map.Entry<String, String> entry : entrys) {
    				buf.append(entry.getKey()).append("=")
    						.append(URLEncoder.encode(entry.getValue(), "UTF-8"))
    						.append("&");
    			}
    			buf.deleteCharAt(buf.length() - 1);
    		}
    		URL url1 = new URL(buf.toString());
    		HttpURLConnection conn = (HttpURLConnection) url1.openConnection();
    		conn.setRequestMethod("GET");
    		// 设置请求头
    		if (headers != null && !headers.isEmpty()) {
    			entrys = headers.entrySet();
    			for (Map.Entry<String, String> entry : entrys) {
    				conn.setRequestProperty(entry.getKey(), entry.getValue());
    			}
    		}
    		conn.getResponseCode();
    		return conn;
    	}
    	/**
    	 * 发送POST请求
    	 * @param url	
    	 * @param params
    	 * @param headers
    	 * @return 
    	 * @throws Exception
    	 */
    	public static URLConnection sendPostRequest(String url,
    			Map<String, String> params, Map<String, String> headers)
    			throws Exception {
    		StringBuilder buf = new StringBuilder();
    		Set<Entry<String, String>> entrys = null;
    		// 如果存在参数,则放在HTTP请求体,形如name=aaa&age=10
    		if (params != null && !params.isEmpty()) {
    			entrys = params.entrySet();
    			for (Map.Entry<String, String> entry : entrys) {
    				buf.append(entry.getKey()).append("=")
    						.append(URLEncoder.encode(entry.getValue(), "UTF-8"))
    						.append("&");
    			}
    			buf.deleteCharAt(buf.length() - 1);
    		}
    		URL url1 = new URL(url);
    		HttpURLConnection conn = (HttpURLConnection) url1.openConnection();
    		conn.setRequestMethod("POST");
    		conn.setDoOutput(true);
    		OutputStream out = conn.getOutputStream();
    		out.write(buf.toString().getBytes("UTF-8"));
    		if (headers != null && !headers.isEmpty()) {
    			entrys = headers.entrySet();
    			for (Map.Entry<String, String> entry : entrys) {
    				conn.setRequestProperty(entry.getKey(), entry.getValue());
    			}
    		}
    		conn.getResponseCode(); // 为了发送成功
    		return conn;
    	}
    	/**
    	 * 直接通过HTTP协议提交数据到服务器,实现如下面表单提交功能:
    	 *   <FORM METHOD=POST ACTION="http://192.168.0.200:8080/ssi/fileload/test.do" enctype="multipart/form-data">
    			<INPUT TYPE="text" NAME="name">
    			<INPUT TYPE="text" NAME="id">
    			<input type="file" name="imagefile"/>
    		    <input type="file" name="zip"/>
    		 </FORM>
    	 * @param path 上传路径(注:避免使用localhost或127.0.0.1这样的路径测试,因为它会指向手机模拟器,你可以使用http://www.itcast.cn或http://192.168.1.10:8080这样的路径测试)
    	 * @param params 请求参数 key为参数名,value为参数值
    	 * @param file 上传文件
    	 */
    	public static boolean uploadFiles(String path, Map<String, String> params, FormFile[] files) throws Exception{     
            final String BOUNDARY = "---------------------------7da2137580612"; //数据分隔线
            final String endline = "--" + BOUNDARY + "--\r\n";//数据结束标志
            
            int fileDataLength = 0;
            if(files!=null&&files.length!=0){
    	        for(FormFile uploadFile : files){//得到文件类型数据的总长度
    	        	StringBuilder fileExplain = new StringBuilder();
    	 	        fileExplain.append("--");
    	 	        fileExplain.append(BOUNDARY);
    	 	        fileExplain.append("\r\n");
    	 	        fileExplain.append("Content-Disposition: form-data;name=\""+ uploadFile.getParameterName()+"\";filename=\""+ uploadFile.getFilname() + "\"\r\n");
    	 	        fileExplain.append("Content-Type: "+ uploadFile.getContentType()+"\r\n\r\n");
    	 	        fileExplain.append("\r\n");
    	 	        fileDataLength += fileExplain.length();
    	        	if(uploadFile.getInStream()!=null){
    	        		fileDataLength += uploadFile.getFile().length();
    		 	    }else{
    		 	    	fileDataLength += uploadFile.getData().length;
    		 	    }
    	        }
            }
            StringBuilder textEntity = new StringBuilder();
            if(params!=null&&!params.isEmpty()){
    	        for (Map.Entry<String, String> entry : params.entrySet()) {//构造文本类型参数的实体数据
    	            textEntity.append("--");
    	            textEntity.append(BOUNDARY);
    	            textEntity.append("\r\n");
    	            textEntity.append("Content-Disposition: form-data; name=\""+ entry.getKey() + "\"\r\n\r\n");
    	            textEntity.append(entry.getValue());
    	            textEntity.append("\r\n");
    	        }
            }
            //计算传输给服务器的实体数据总长度
            int dataLength = textEntity.toString().getBytes().length + fileDataLength +  endline.getBytes().length;
            
            URL url = new URL(path);
            int port = url.getPort()==-1 ? 80 : url.getPort();
            Socket socket = new Socket(InetAddress.getByName(url.getHost()), port);	       
            OutputStream outStream = socket.getOutputStream();
            //下面完成HTTP请求头的发送
            String requestmethod = "POST "+ url.getPath()+" HTTP/1.1\r\n";
            outStream.write(requestmethod.getBytes());
            String accept = "Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*\r\n";
            outStream.write(accept.getBytes());
            String language = "Accept-Language: zh-CN\r\n";
            outStream.write(language.getBytes());
            String contenttype = "Content-Type: multipart/form-data; boundary="+ BOUNDARY+ "\r\n";
            outStream.write(contenttype.getBytes());
            String contentlength = "Content-Length: "+ dataLength + "\r\n";
            outStream.write(contentlength.getBytes());
            String alive = "Connection: Keep-Alive\r\n";
            outStream.write(alive.getBytes());
            String host = "Host: "+ url.getHost() +":"+ port +"\r\n";
            outStream.write(host.getBytes());
            //写完HTTP请求头后根据HTTP协议再写一个回车换行
            outStream.write("\r\n".getBytes());
            //把所有文本类型的实体数据发送出来
            outStream.write(textEntity.toString().getBytes());	       
            //把所有文件类型的实体数据发送出来
            if(files!=null&&files.length!=0){
    	        for(FormFile uploadFile : files){
    	        	StringBuilder fileEntity = new StringBuilder();
    	 	        fileEntity.append("--");
    	 	        fileEntity.append(BOUNDARY);
    	 	        fileEntity.append("\r\n");
    	 	        fileEntity.append("Content-Disposition: form-data;name=\""+ uploadFile.getParameterName()+"\";filename=\""+ uploadFile.getFilname() + "\"\r\n");
    	 	        fileEntity.append("Content-Type: "+ uploadFile.getContentType()+"\r\n\r\n");
    	 	        outStream.write(fileEntity.toString().getBytes());
    	 	        if(uploadFile.getInStream()!=null){
    	 	        	byte[] buffer = new byte[1024];
    	 	        	int len = 0;
    	 	        	while((len = uploadFile.getInStream().read(buffer, 0, 1024))!=-1){
    	 	        		outStream.write(buffer, 0, len);
    	 	        	}
    	 	        	uploadFile.getInStream().close();
    	 	        }else{
    	 	        	outStream.write(uploadFile.getData(), 0, uploadFile.getData().length);
    	 	        }
    	 	        outStream.write("\r\n".getBytes());
    	        }
            }
            //下面发送数据结束标志,表示数据已经结束
            outStream.write(endline.getBytes());
            BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            if(reader.readLine().indexOf("200")==-1){//读取web服务器返回的数据,判断请求码是否为200,如果不是200,代表请求失败
            	return false;
            }
            outStream.flush();
            outStream.close();
            reader.close();
            socket.close();
            return true;
    	}
    	/**
    	 * 提交数据到服务器
    	 * @param path 上传路径(注:避免使用localhost或127.0.0.1这样的路径测试,因为它会指向手机模拟器,你可以使用http://www.itcast.cn或http://192.168.1.10:8080这样的路径测试)
    	 * @param params 请求参数 key为参数名,value为参数值
    	 * @param file 上传文件
    	 */
    	public static boolean uploadFile(String path, Map<String, String> params, FormFile file) throws Exception{
    	   return uploadFiles(path, params, new FormFile[]{file});
    	}
    	/**
    	 * 将输入流转为字节数组
    	 * @param inStream
    	 * @return
    	 * @throws Exception
    	 */
    	public static byte[] read2Byte(InputStream inStream)throws Exception{
    		ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
    		byte[] buffer = new byte[1024];
    		int len = 0;
    		while( (len = inStream.read(buffer)) !=-1 ){
    			outSteam.write(buffer, 0, len);
    		}
    		outSteam.close();
    		inStream.close();
    		return outSteam.toByteArray();
    	}
    	/**
    	 * 将输入流转为字符串
    	 * @param inStream
    	 * @return
    	 * @throws Exception
    	 */
    	public static String read2String(InputStream inStream)throws Exception{
    		ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
    		byte[] buffer = new byte[1024];
    		int len = 0;
    		while( (len = inStream.read(buffer)) !=-1 ){
    			outSteam.write(buffer, 0, len);
    		}
    		outSteam.close();
    		inStream.close();
    		return new String(outSteam.toByteArray(),"UTF-8");
    	}
    	/**
    	 * 发送xml数据
    	 * @param path 请求地址
    	 * @param xml xml数据
    	 * @param encoding 编码
    	 * @return
    	 * @throws Exception
    	 */
    	public static byte[] postXml(String path, String xml, String encoding) throws Exception{
    		byte[] data = xml.getBytes(encoding);
    		URL url = new URL(path);
    		HttpURLConnection conn = (HttpURLConnection)url.openConnection();
    		conn.setRequestMethod("POST");
    		conn.setDoOutput(true);
    		conn.setRequestProperty("Content-Type", "text/xml; charset="+ encoding);
    		conn.setRequestProperty("Content-Length", String.valueOf(data.length));
    		conn.setConnectTimeout(5 * 1000);
    		OutputStream outStream = conn.getOutputStream();
    		outStream.write(data);
    		outStream.flush();
    		outStream.close();
    		if(conn.getResponseCode()==200){
    			return read2Byte(conn.getInputStream());
    		}
    		return null;
    	}
    	//测试函数
    	public static void main(String args[]) throws Exception {
    		Map<String, String> params = new HashMap<String, String>();
    		params.put("name", "xiazdong");
    		params.put("age", "10");
    		HttpURLConnection conn = (HttpURLConnection) HttpRequestUtil
    				.sendGetRequest(
    						"http://192.168.0.103:8080/Server/PrintServlet",
    						params, null);
    		int code = conn.getResponseCode();
    		InputStream in = conn.getInputStream();
    		byte[]data = read2Byte(in);
    	}
    }
    



    测试代码:

    Map<String,String> params = new HashMap<String,String>();
    params.put("name", name.getText().toString());
    params.put("age", age.getText().toString());
    HttpURLConnection conn = (HttpURLConnection) HttpRequestUtil.sendGetRequest("http://192.168.0.103:8080/Server/PrintServlet", params, null);


    文件上传测试代码:


    FormFile formFile = new FormFile(file.getName(), file, "document", "text/plain");
    boolean isSuccess = HttpRequestUtil.uploadFile("http://192.168.0.103:8080/Server/FileServlet", null, formFile);


    简单了很多,对吧?





  • 相关阅读:
    [LeetCode] Power of Three 判断3的次方数
    [LeetCode] 322. Coin Change 硬币找零
    [LeetCode] 321. Create Maximum Number 创建最大数
    ITK 3.20.1 VS2010 Configuration 配置
    VTK 5.10.1 VS2010 Configuration 配置
    FLTK 1.3.3 MinGW 4.9.1 Configuration 配置
    FLTK 1.1.10 VS2010 Configuration 配置
    Inheritance, Association, Aggregation, and Composition 类的继承,关联,聚合和组合的区别
    [LeetCode] Bulb Switcher 灯泡开关
    [LeetCode] Maximum Product of Word Lengths 单词长度的最大积
  • 原文地址:https://www.cnblogs.com/xiazdong/p/3058323.html
Copyright © 2011-2022 走看看