packagecom.wiker;importjava.io.BufferedReader;importjava.io.ByteArrayOutputStream;importjava.io.IOException;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.nio.charset.Charset;importjava.util.HashMap;importjava.util.Map;importjava.util.Map.Entry;importjava.util.Set;importjava.util.Vector;/***@authorWiker Yong Email:wikeryong@gmail.com
* @date 2013-11-8 下午7:22:43
*@version1.0-SNAPSHOT*/
public classHttpUtils {privateString defaultContentEncoding;publicHttpUtils() {this.defaultContentEncoding =Charset.defaultCharset().name();
}/*** 发送GET请求
*
*@paramurlString URL地址
*@return响应对象
*@throwsIOException*/
public HttpRespons sendGet(String urlString) throwsIOException {return this.send(urlString, "GET", null, null);
}/*** 发送GET请求
*
*@paramurlString URL地址
*@paramparams 参数集合
*@return响应对象
*@throwsIOException*/
public HttpRespons sendGet(String urlString, Map params) throwsIOException {return this.send(urlString, "GET", params, null);
}/*** 发送GET请求
*
*@paramurlString URL地址
*@paramparams 参数集合
*@parampropertys 请求属性
*@return响应对象
*@throwsIOException*/
public HttpRespons sendGet(String urlString, Map params, Mappropertys)throwsIOException {return this.send(urlString, "GET", params, propertys);
}/*** 发送POST请求
*
*@paramurlString URL地址
*@return响应对象
*@throwsIOException*/
public HttpRespons sendPost(String urlString) throwsIOException {return this.send(urlString, "POST", null, null);
}/*** 发送POST请求
*
*@paramurlString URL地址
*@paramparams 参数集合
*@return响应对象
*@throwsIOException*/
public HttpRespons sendPost(String urlString, Map params) throwsIOException {return this.send(urlString, "POST", params, null);
}/*** 发送POST请求
*
*@paramurlString URL地址
*@paramparams 参数集合
*@parampropertys 请求属性
*@return响应对象
*@throwsIOException*/
public HttpRespons sendPost(String urlString, Map params, Mappropertys)throwsIOException {return this.send(urlString, "POST", params, propertys);
}/*** 发送HTTP请求
*
*@paramurlString 地址
*@parammethod get/post
*@paramparameters 添加由键值对指定的请求参数
*@parampropertys 添加由键值对指定的一般请求属性
*@return响映对象
*@throwsIOException*/
private HttpRespons send(String urlString, String method, Mapparameters,
Map propertys) throwsIOException {
HttpURLConnection urlConnection= null;if (method.equalsIgnoreCase("GET") && parameters != null) {
StringBuffer param= newStringBuffer();int i = 0;for(String key : parameters.keySet()) {if (i == 0)
param.append("?");elseparam.append("&");
param.append(key).append("=").append(parameters.get(key));
i++;
}
urlString+=param;
}
URL url= newURL(urlString);
urlConnection=(HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod(method);
urlConnection.setDoOutput(true);
urlConnection.setDoInput(true);
urlConnection.setUseCaches(false);if (propertys != null)for(String key : propertys.keySet()) {
urlConnection.addRequestProperty(key, propertys.get(key));
}if (method.equalsIgnoreCase("POST") && parameters != null) {
StringBuffer param= newStringBuffer();for(String key : parameters.keySet()) {
param.append("&");
param.append(key).append("=").append(parameters.get(key));
}
urlConnection.getOutputStream().write(param.toString().getBytes());
urlConnection.getOutputStream().flush();
urlConnection.getOutputStream().close();
}return this.makeContent(urlString, urlConnection);
}/*** 得到响应对象
*
*@paramurlConnection
*@return响应对象
*@throwsIOException*/
private HttpRespons makeContent(String urlString, HttpURLConnection urlConnection) throwsIOException {
HttpRespons httpResponser= newHttpRespons();try{
InputStream in=urlConnection.getInputStream();
BufferedReader bufferedReader= new BufferedReader(newInputStreamReader(in));
httpResponser.contentCollection= new Vector();
StringBuffer temp= newStringBuffer();
String line=bufferedReader.readLine();while (line != null) {
httpResponser.contentCollection.add(line);
temp.append(line).append("\r\n");
line=bufferedReader.readLine();
}
bufferedReader.close();
String ecod=urlConnection.getContentEncoding();if (ecod == null)
ecod= this.defaultContentEncoding;
httpResponser.urlString=urlString;
httpResponser.defaultPort=urlConnection.getURL().getDefaultPort();
httpResponser.file=urlConnection.getURL().getFile();
httpResponser.host=urlConnection.getURL().getHost();
httpResponser.path=urlConnection.getURL().getPath();
httpResponser.port=urlConnection.getURL().getPort();
httpResponser.protocol=urlConnection.getURL().getProtocol();
httpResponser.query=urlConnection.getURL().getQuery();
httpResponser.ref=urlConnection.getURL().getRef();
httpResponser.userInfo=urlConnection.getURL().getUserInfo();
httpResponser.content= newString(temp.toString().getBytes(), ecod);
httpResponser.contentEncoding=ecod;
httpResponser.code=urlConnection.getResponseCode();
httpResponser.message=urlConnection.getResponseMessage();
httpResponser.contentType=urlConnection.getContentType();
httpResponser.method=urlConnection.getRequestMethod();
httpResponser.connectTimeout=urlConnection.getConnectTimeout();
httpResponser.readTimeout=urlConnection.getReadTimeout();returnhttpResponser;
}catch(IOException e) {throwe;
}finally{if (urlConnection != null)
urlConnection.disconnect();
}
}/*** 默认的响应字符集*/
publicString getDefaultContentEncoding() {return this.defaultContentEncoding;
}/*** 发送GET请求
*@paramurl
*@paramparams
*@paramheaders
*@return*@throwsException*/
public staticURLConnection sendGetRequest(String url,
Map params, Mapheaders)throwsException {
StringBuilder buf= newStringBuilder(url);
Set> entrys = null;//如果是GET请求,则请求参数在URL中
if (params != null && !params.isEmpty()) {
buf.append("?");
entrys=params.entrySet();for (Map.Entryentry : entrys) {
buf.append(entry.getKey()).append("=")
.append(URLEncoder.encode(entry.getValue(),"UTF-8"))
.append("&");
}
buf.deleteCharAt(buf.length()- 1);
}
URL url1= newURL(buf.toString());
HttpURLConnection conn=(HttpURLConnection) url1.openConnection();
conn.setRequestMethod("GET");//设置请求头
if (headers != null && !headers.isEmpty()) {
entrys=headers.entrySet();for (Map.Entryentry : entrys) {
conn.setRequestProperty(entry.getKey(), entry.getValue());
}
}
conn.getResponseCode();returnconn;
}/*** 发送POST请求
*@paramurl
*@paramparams
*@paramheaders
*@return*@throwsException*/
public staticURLConnection sendPostRequest(String url,
Map params, Mapheaders)throwsException {
StringBuilder buf= newStringBuilder();
Set> entrys = null;//如果存在参数,则放在HTTP请求体,形如name=aaa&age=10
if (params != null && !params.isEmpty()) {
entrys=params.entrySet();for (Map.Entryentry : entrys) {
buf.append(entry.getKey()).append("=")
.append(URLEncoder.encode(entry.getValue(),"UTF-8"))
.append("&");
}
buf.deleteCharAt(buf.length()- 1);
}
URL url1= newURL(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.Entryentry : entrys) {
conn.setRequestProperty(entry.getKey(), entry.getValue());
}
}
conn.getResponseCode();//为了发送成功
returnconn;
}/*** 直接通过HTTP协议提交数据到服务器,实现如下面表单提交功能:
*
*@parampath 上传路径(注:避免使用localhost或127.0.0.1这样的路径测试,因为它会指向手机模拟器,你可以使用http://www.itcast.cn或http://192.168.1.10:8080这样的路径测试)
*@paramparams 请求参数 key为参数名,value为参数值
*@paramfile 上传文件*/
public static boolean uploadFiles(String path, Map params, FormFile[] files) throwsException{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 = 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;
}
}
}
StringBuilder textEntity= newStringBuilder();if(params!=null&&!params.isEmpty()){for (Map.Entry 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= newURL(path);int port = url.getPort()==-1 ? 80: url.getPort();
Socket socket= newSocket(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= 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 = 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(newInputStreamReader(socket.getInputStream()));if(reader.readLine().indexOf("200")==-1){//读取web服务器返回的数据,判断请求码是否为200,如果不是200,代表请求失败
return false;
}
outStream.flush();
outStream.close();
reader.close();
socket.close();return true;
}/*** 提交数据到服务器
*@parampath 上传路径(注:避免使用localhost或127.0.0.1这样的路径测试,因为它会指向手机模拟器,你可以使用http://www.itcast.cn或http://192.168.1.10:8080这样的路径测试)
*@paramparams 请求参数 key为参数名,value为参数值
*@paramfile 上传文件*/
public static boolean uploadFile(String path, Map params, FormFile file) throwsException{return uploadFiles(path, params, newFormFile[]{file});
}/*** 将输入流转为字节数组
*@paraminStream
*@return*@throwsException*/
public static byte[] read2Byte(InputStream inStream)throwsException{
ByteArrayOutputStream outSteam= newByteArrayOutputStream();byte[] buffer = new byte[1024];int len = 0;while( (len = inStream.read(buffer)) !=-1){
outSteam.write(buffer,0, len);
}
outSteam.close();
inStream.close();returnoutSteam.toByteArray();
}/*** 将输入流转为字符串
*@paraminStream
*@return*@throwsException*/
public static String read2String(InputStream inStream)throwsException{
ByteArrayOutputStream outSteam= newByteArrayOutputStream();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数据
*@parampath 请求地址
*@paramxml xml数据
*@paramencoding 编码
*@return*@throwsException*/
public static byte[] postXml(String path, String xml, String encoding) throwsException{byte[] data =xml.getBytes(encoding);
URL url= newURL(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){returnread2Byte(conn.getInputStream());
}return null;
}//测试函数
public static void main(String args[]) throwsException {
Map params = new HashMap();
params.put("name", "xiazdong");
params.put("age", "10");
HttpURLConnection conn=(HttpURLConnection)
sendGetRequest("http://192.168.0.103:8080/Server/PrintServlet",
params,null);int code =conn.getResponseCode();
InputStream in=conn.getInputStream();byte[]data =read2Byte(in);
}/*** 设置默认的响应字符集*/
public voidsetDefaultContentEncoding(String defaultContentEncoding) {this.defaultContentEncoding =defaultContentEncoding;
}
}
需要引用到的文件FormFile.java如下:packagecom.wiker;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.InputStream;/*** 上传文件*/
public classFormFile {/*上传文件的数据*/
private byte[] data;privateInputStream inStream;privateFile file;/*文件名称*/
privateString filname;/*请求参数名称*/
privateString parameterName;/*内容类型*/
private String contentType = "application/octet-stream";/*** 此函数用来传输小文件
*@paramfilname
*@paramdata
*@paramparameterName
*@paramcontentType*/
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;
}/*** 此函数用来传输大文件
*@paramfilname
*@paramfile
*@paramparameterName
*@paramcontentType*/
publicFormFile(String filname, File file, String parameterName, String contentType) {this.filname =filname;this.parameterName =parameterName;this.file =file;try{this.inStream = newFileInputStream(file);
}catch(FileNotFoundException e) {
e.printStackTrace();
}if(contentType!=null) this.contentType =contentType;
}publicFile getFile() {returnfile;
}publicInputStream getInStream() {returninStream;
}public byte[] getData() {returndata;
}publicString getFilname() {returnfilname;
}public voidsetFilname(String filname) {this.filname =filname;
}publicString getParameterName() {returnparameterName;
}public voidsetParameterName(String parameterName) {this.parameterName =parameterName;
}publicString getContentType() {returncontentType;
}public voidsetContentType(String contentType) {this.contentType =contentType;
}
}