Android入门:封装一个HTTP请求的辅助类
经过自己的研究,封装了一个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
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);