Android入门:封装一个HTTP请求的辅助类

88263417 2012-07-08

经过自己的研究,封装了一个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;

importjava.io.BufferedReader;

importjava.io.ByteArrayOutputStream;

importjava.io.File;

importjava.io.FileInputStream;

importjava.io.FileNotFoundException;

importjava.io.InputStream;

importjava.io.InputStreamReader;

importjava.io.OutputStream;

importjava.net.HttpURLConnection;

importjava.net.InetAddress;

importjava.net.Socket;

importjava.net.URL;

importjava.net.URLConnection;

importjava.net.URLEncoder;

importjava.util.HashMap;

importjava.util.Map;

importjava.util.Map.Entry;

importjava.util.Set;

/*

*此类用来发送HTTP请求

**/

publicclassHttpRequestUtil{

/**

*发送GET请求

*@paramurl

*@paramparams

*@paramheaders

*@return

*@throwsException

*/

publicstaticURLConnectionsendGetRequest(Stringurl,

Map<String,String>params,Map<String,String>headers)

throwsException{

StringBuilderbuf=newStringBuilder(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);

}

URLurl1=newURL(buf.toString());

HttpURLConnectionconn=(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();

returnconn;

}

/**

*发送POST请求

*@paramurl

*@paramparams

*@paramheaders

*@return

*@throwsException

*/

publicstaticURLConnectionsendPostRequest(Stringurl,

Map<String,String>params,Map<String,String>headers)

throwsException{

StringBuilderbuf=newStringBuilder();

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);

}

URLurl1=newURL(url);

HttpURLConnectionconn=(HttpURLConnection)url1.openConnection();

conn.setRequestMethod("POST");

conn.setDoOutput(true);

OutputStreamout=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();//为了发送成功

returnconn;

}

/**

*直接通过HTTP协议提交数据到服务器,实现如下面表单提交功能:

*<FORMMETHOD=POSTACTION="http://192.168.0.200:8080/ssi/fileload/test.do"enctype="multipart/form-data">

<INPUTTYPE="text"name="name">

<INPUTTYPE="text"name="id">

<inputtype="file"name="imagefile"/>

<inputtype="file"name="zip"/>

</FORM>

*@parampath上传路径(注:避免使用localhost或127.0.0.1这样的路径测试,因为它会指向手机模拟器,你可以使用http://www.itcast.cn或http://192.168.1.10:8080这样的路径测试)

*@paramparams请求参数key为参数名,value为参数值

*@paramfile上传文件

*/

publicstaticbooleanuploadFiles(Stringpath,Map<String,String>params,FormFile[]files)throwsException{

finalStringBOUNDARY="---------------------------7da2137580612";//数据分隔线

finalStringendline="--"+BOUNDARY+"--\r\n";//数据结束标志

intfileDataLength=0;

if(files!=null&&files.length!=0){

for(FormFileuploadFile:files){//得到文件类型数据的总长度

StringBuilderfileExplain=newStringBuilder();

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;

}

}

}

StringBuildertextEntity=newStringBuilder();

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");

}

}

//计算传输给服务器的实体数据总长度

intdataLength=textEntity.toString().getBytes().length+fileDataLength+endline.getBytes().length;

URLurl=newURL(path);

intport=url.getPort()==-1?80:url.getPort();

Socketsocket=newSocket(InetAddress.getByName(url.getHost()),port);

OutputStreamoutStream=socket.getOutputStream();

//下面完成HTTP请求头的发送

Stringrequestmethod="POST"+url.getPath()+"HTTP/1.1\r\n";

outStream.write(requestmethod.getBytes());

Stringaccept="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());

Stringlanguage="Accept-Language:zh-CN\r\n";

outStream.write(language.getBytes());

Stringcontenttype="Content-Type:multipart/form-data;boundary="+BOUNDARY+"\r\n";

outStream.write(contenttype.getBytes());

Stringcontentlength="Content-Length:"+dataLength+"\r\n";

outStream.write(contentlength.getBytes());

Stringalive="Connection:Keep-Alive\r\n";

outStream.write(alive.getBytes());

Stringhost="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(FormFileuploadFile:files){

StringBuilderfileEntity=newStringBuilder();

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=newbyte[1024];

intlen=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());

BufferedReaderreader=newBufferedReader(newInputStreamReader(socket.getInputStream()));

if(reader.readLine().indexOf("200")==-1){//读取web服务器返回的数据,判断请求码是否为200,如果不是200,代表请求失败

returnfalse;

}

outStream.flush();

outStream.close();

reader.close();

socket.close();

returntrue;

}

/**

*提交数据到服务器

*@parampath上传路径(注:避免使用localhost或127.0.0.1这样的路径测试,因为它会指向手机模拟器,你可以使用http://www.itcast.cn或http://192.168.1.10:8080这样的路径测试)

*@paramparams请求参数key为参数名,value为参数值

*@paramfile上传文件

*/

publicstaticbooleanuploadFile(Stringpath,Map<String,String>params,FormFilefile)throwsException{

returnuploadFiles(path,params,newFormFile[]{file});

}

/**

*将输入流转为字节数组

*@paraminStream

*@return

*@throwsException

*/

publicstaticbyte[]read2Byte(InputStreaminStream)throwsException{

ByteArrayOutputStreamoutSteam=newByteArrayOutputStream();

byte[]buffer=newbyte[1024];

intlen=0;

while((len=inStream.read(buffer))!=-1){

outSteam.write(buffer,0,len);

}

outSteam.close();

inStream.close();

returnoutSteam.toByteArray();

}

/**

*将输入流转为字符串

*@paraminStream

*@return

*@throwsException

*/

publicstaticStringread2String(InputStreaminStream)throwsException{

ByteArrayOutputStreamoutSteam=newByteArrayOutputStream();

byte[]buffer=newbyte[1024];

intlen=0;

while((len=inStream.read(buffer))!=-1){

outSteam.write(buffer,0,len);

}

outSteam.close();

inStream.close();

returnnewString(outSteam.toByteArray(),"UTF-8");

}

/**

*发送xml数据

*@parampath请求地址

*@paramxmlxml数据

*@paramencoding编码

*@return

*@throwsException

*/

publicstaticbyte[]postXml(Stringpath,Stringxml,Stringencoding)throwsException{

byte[]data=xml.getBytes(encoding);

URLurl=newURL(path);

HttpURLConnectionconn=(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);

OutputStreamoutStream=conn.getOutputStream();

outStream.write(data);

outStream.flush();

outStream.close();

if(conn.getResponseCode()==200){

returnread2Byte(conn.getInputStream());

}

returnnull;

}

//测试函数

publicstaticvoidmain(Stringargs[])throwsException{

Map<String,String>params=newHashMap<String,String>();

params.put("name","xiazdong");

params.put("age","10");

HttpURLConnectionconn=(HttpURLConnection)HttpRequestUtil

.sendGetRequest(

"http://192.168.0.103:8080/Server/PrintServlet",

params,null);

intcode=conn.getResponseCode();

InputStreamin=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);
 

相关推荐