httphelp

来源:互联网 发布:文化部网络歌曲黑名单 编辑:程序博客网 时间:2024/06/01 07:19
package com.tianjun.internalcontacts.tool;


import java.io.DataOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;


import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.ParseException;
import org.apache.http.StatusLine;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.entity.BufferedHttpEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.util.EntityUtils;


import android.content.Context;
import android.content.SharedPreferences;
import android.os.Build;
import android.os.Environment;
import android.util.Log;
import android.widget.Toast;


import com.tianjun.internalcontacts.domain.FormFile;
import com.tianjun.internalcontacts.domain.ResultInterface;
import com.tianjun.internalcontacts.out.Out;
import com.tianjun.internalcontacts.ui.MainActivity;


/**
 *  网络相关及线程池管理
 *  上传下载以及线程池管理
 *  
 * @author LDD
 *
 */
public class HttpTool implements Constant.Net {


// public static String HOST = "http://yzt.tianjun.com";
// public static String ImageHost = "http://yzt.tianjun.com/";
/**主机地址*/
public static String HOST = "";
/**图片主机地址*/
public static String ImageHost = "";


/**根目录*/ 
public static final String ROOT_DIRECTORY = Environment
.getExternalStorageDirectory() + "/InteranlContacts";
/**缓存目录*/ 
public static final String CACHE_DIRECTORY = ROOT_DIRECTORY + "/cache";
/**apk存放目录*/ 
public static final String APK_DIRECTORY = ROOT_DIRECTORY + "/apk";
/**图片根目录*/ 
public static final String IMAGE_DIRECTORY = ROOT_DIRECTORY + "/image";
/**联系人图片目录*/ 
public static final String USER_IMAGE_DIRECTORY = IMAGE_DIRECTORY + "/user";
/** 新闻图片目录*/
public static final String NEWS_IMAGE_DIRECTORY = IMAGE_DIRECTORY + "/news";
/**通知图片目录*/ 
public static final String NOTICE_IMAGE_DIRECTORY = IMAGE_DIRECTORY + "/notice";
/**图片后缀*/ 
public static final String IMAGE_SUFFIX = ".jpg.ic";
/**图片后缀*/ 
public static final String IMAGE_SUFFIX_IC = ".ic";


/*********************************************************************************************/


/**新闻地址*/ 
public static final String NEWS_ADDRESS = "/M/MNews/%s";



// public static final String LOGIN = "/api/Login";
/** 登陆*/
// public static final String LOGIN = "http://login.tianjun.com/api/login";
//
public static final String LOGIN = "http://login.ipeixun.com/api/login";
//http://192.168.0.55:9998/
// public static final String LOGIN = "http://192.168.0.55:9998/api/login";
/**获取自己的信息*/ 
public static final String MY_INFO = "API/LOGIN/?ID=%s";
/**联系人*/ 
public static final String CONTACTS = "api/LinkInfo?id=%s";
/**获取联系人更新数据*/ 
public static final String POST_CONTACTS = "api/upLinkinfo";
/**部门*/ 
public static final String DEPARTMENT = "api/Department";
/**新闻*/ 
public static final String NEWS_All = "api/news/?UPDateTime=%s";
/**获取最新的五条新闻*/
public static final String NEWS_FIVE = "api/news5";
/**通知*/ 
public static final String NOTICES_ALL = "api/Notice/?UPDateTime=%s";
/**更新提醒*/
public static final String GET_UPDATE = "api/Update";
/**获取更新数据*/ 
public static final String GET_UPDATE_CONTACT = "api/LinkInfo";

/** 获取投票信息 */
// public static final String GET_VOTE="http://v1.tianjun.com/api/Vote";
//http://192.168.0.55:9998/
public static final String HTTP_VOTE="http://v1.ipeixun.com/";
public static final String GET_VOTE="api/Vote";
// /** 提交投票信息 */
// public static final String COMMIT_VOTE="http://v1.tianjun.com/api/Vote";

/**获取备注信息*/ 
public static final String GET_REMARKS = "api/remarks/%s";
/**下载组*/ 
public static final String GET_GROUP_DOWNLOAD = "api/LinkGroup/%s";
/**新建/修改组*/ 
public static final String POST_GROUP_ADD_OR_UPDATE = "api/LinkGroup";
/**删除组*/ 
public static final String GET_GROUP_DELETE = "api/linkgroup?gid=%s";
/**提交备注信息*/ 
public static final String POST_REMARK = "api/remarks";
/**提交本人信息号码*/ 
public static final String POST_MY_INFO = "api/LinkInfo";
/**提交个人头像*/ 
public static final String POST_AVATAR = "UpLoad.ashx";
/** 变更状态(是否可以变更,返回1为有变更未处理) */
public static final String Get_CHANGE_STATE = "api/linkinfo?linkinfoid=%s";
/**发送通知*/ 
public static final String SEND_NOTICE = "api/Notice";
/**获取最新版本*/ 
public static final String VERSION = "api/appup?id=Android";
/**下载apk*/ 
public static final String DOWNLOAD_APK = "";


/**新闻地址*/ 
public static final String NEW_LIST = "M/newslist/1";
/**发送通知地址*/ 
public static final String NOTICE_SEND_LIST = "M/sendnotices?linkinfoid=%s&page=1";
/**接收通知地址*/ 
public static final String NOTICE_RECEIVE_LIST = "M/receivenotices?linkinfoid=%s&page=1";

/**修改密码*/ 
public static final String CHANGE_PWD = "api/ChangePwd";
/**找回密码*/ 
// public static final String FIND_PWD = "http://login.tianjun.com/api/ForgetPwd?UserName=%s";
//http://v1.ipeixun.com/
public static final String FIND_PWD = "http://login.ipeixun.com/api/ForgetPwd?UserName=%s";
private static final ThreadPoolExecutor executor;


static {
Out.println("系统版本号:" + Build.VERSION.SDK_INT);
executor = (ThreadPoolExecutor) Executors.newCachedThreadPool();
}


/**
* 在线程池中运行任务

* @param runnable
*            待运行的任务
*/
public static void execInPool(Runnable runnable) {
executor.execute(runnable);
}


/**
* 发出请求,并在线程池中运行任务

* @param context
* @param url
* @param head
* @param paramMap
* @param ri
*/
public static void request(Context context, final String url,
final HashMap<String, Object> head,
final HashMap<String, Object> paramMap, final ResultInterface ri) {
Out.println("head:" + head);


if (!SmallTools.isNetworkConnected(context)) {
Toast.makeText(context, "没有可用的网络连接,请检查网络.", Toast.LENGTH_SHORT)
.show();
ri.failed(-1001);// 没有网络
return;
}


Runnable run = new Runnable() {


@Override
public void run() {
// TODO Auto-generated method stub
try {
HttpParams httpParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParams,
1000 * 10);
HttpConnectionParams.setSoTimeout(httpParams, 1000 * 30);
HttpClient httpClient = new DefaultHttpClient(httpParams);


// try {
String absoluteUrl = url;
if (!url.startsWith("http")) {
absoluteUrl = HOST + url;
}


// 执行实际请求
HttpUriRequest req = null;
if (paramMap == null) {
// Log.i("tjun", "get请求。。。");
// FIXME
Out.println("get url:" + absoluteUrl);
req = new HttpGet(absoluteUrl);
} else {
// Log.i("tjun", "post请求。。。");
HttpPost httpPost = new HttpPost(absoluteUrl);
List<NameValuePair> params = new ArrayList<NameValuePair>();
for (Map.Entry<String, Object> entry : paramMap.entrySet()) {
params.add(new BasicNameValuePair(entry.getKey(),
String.valueOf(entry.getValue())));
}
//无效冗余代码
// for (int i = 0; i < params.size(); i++) {
// Out.println(params.get(i).getName());
// Out.println(params.get(i).getValue());
// absoluteUrl += "&" + params.get(i).getName() + "="
// + params.get(i).getValue();
// }
// FIXME
Out.println("post url:" + absoluteUrl);
// httpPost.setEntity(new UrlEncodedFormEntity(params,
// "GBK"));
httpPost.setEntity(new UrlEncodedFormEntity(params,
"utf-8"));
req = httpPost;
}
Log.i("tjun", "uri="+req.getURI()+"    absoluteUrl="+absoluteUrl);

if (head != null) {
for (Map.Entry<String, Object> entry : head.entrySet()) {
Out.println("key:" + entry.getKey());
Out.println("value:" + entry.getValue());
req.setHeader(entry.getKey(),
String.valueOf(entry.getValue()));
}
}


// req.setHeader("charset", "utf-8");

HttpResponse httpResponse = httpClient.execute(req);
StatusLine status = httpResponse.getStatusLine();
// FIXME
Out.println("status:" + status.getStatusCode());
Log.i("tjun", "请求响应码="+status.getStatusCode());
if (status.getStatusCode() >= 300) {// 失败
ri.failed(-1002);// 数据获取失败
} else if (status.getStatusCode() == 204) {
ri.success("0");
} else {// 成功
HttpEntity entity = null;
HttpEntity tmp = httpResponse.getEntity();
if (tmp != null) {
//如果请求到数据,则将数据tmp封装成BufferedHttpEntity类型并赋值给entity(HttpEntity类型)
entity = new BufferedHttpEntity(tmp);
}
//如果tmp为空呢,那么entity也将为空
ri.success(EntityUtils.toString(entity));
}
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
ri.failed(-1003);// 编码异常
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
ri.failed(-1003);// 协议异常
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
ri.failed(-1003);// 数据异常
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
ri.failed(-1003);// 数据异常
}


// } catch (Exception ex) {
// ex.printStackTrace();
// ri.failed(-1003);// 数据异常
// }
}
};


execInPool(run);
}


/**
* 上传图片
* HttpURLConnection的方式
* @param actionUrl
* @param params
* @param files
* @return
* @throws Exception
*/
public static void postBitmap(Context context, final String actionUrl,
final Map<String, String> params,
final Map<String, InputStream> files, final ResultInterface ri) {


// HashMap<String, String> params = new HashMap<String, String>();
// params.put("fmat", "jpg");
// params.put("name", name);
// HashMap<String, InputStream> files = new HashMap<String,
// InputStream>();
// files.put("photoFile", fileInputStream);


if (!SmallTools.isNetworkConnected(context)) {
Toast.makeText(context, "没有可用的网络连接,请检查网络.", Toast.LENGTH_SHORT)
.show();
ri.failed(-1001);// 没有网络
return;
}


Out.println("HttpTool.postBitmap..............start.........");
Runnable run = new Runnable() {


@Override
public void run() {
try {
String absoluteUrl = actionUrl;
if (!absoluteUrl.startsWith("http")) {
absoluteUrl = HOST + absoluteUrl;
}


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


// FIXME
Out.println("Util.post  url:" + absoluteUrl);


URL uri = new URL(absoluteUrl);
HttpURLConnection conn = (HttpURLConnection) uri
.openConnection();
// 缓存的最长时间
conn.setReadTimeout(5 * 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);


DataOutputStream outStream = new DataOutputStream(
conn.getOutputStream());


// 首先组拼文本类型的参数
StringBuilder sb = new StringBuilder();

if (params != null) {
for (Map.Entry<String, String> 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);
}
}
// FIXME
Out.println("文本类型数据:" + sb.toString());
outStream.write(sb.toString().getBytes());
// 发送文件数据
if (files != null)
for (Map.Entry<String, InputStream> file : files
.entrySet()) {
StringBuilder sb1 = new StringBuilder();
sb1.append(PREFIX);
sb1.append(BOUNDARY);
sb1.append(LINEND);
sb1.append("Content-Disposition: form-data; name=\""
+ file.getKey()
+ "\"; filename=\""
+ "1.jpg" + "\"" + LINEND);
// application/octet-stream
// image/jpeg
sb1.append("Content-Type: application/octet-stream; charset="
+ CHARSET + LINEND);
sb1.append(LINEND);
// FIXME
Out.println("文件类型数据:" + sb1.toString());
outStream.write(sb1.toString().getBytes());


byte[] buffer = new byte[1024];
int len = 0;
while ((len = file.getValue().read(buffer)) != -1) {
Out.println("len:" + len);
outStream.write(buffer, 0, len);
}


file.getValue().close();
outStream.write(LINEND.getBytes());
}
// 请求结束标志־
byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND)
.getBytes();
outStream.write(end_data);
outStream.flush();
// 得到响应码
int res = conn.getResponseCode();
// FIXME
Out.println("postBitmap.响应码:" + res);


StringBuilder sb2 = new StringBuilder();
InputStream in = null;
if (res == 200) {
in = conn.getInputStream();
int ch;


while ((ch = in.read()) != -1) {
sb2.append((char) ch);
}
ri.success(sb2.toString());
} else {
ri.failed(-1002);// 数据获取失败
}
outStream.close();
conn.disconnect();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
ri.failed(-1003);// 数据异常
} catch (ProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
ri.failed(-1003);// 数据异常
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
ri.failed(-1003);// 数据异常
}
}
};


execInPool(run);
}


/**
* 如果是文本的文件的话那么通过map类传递进来如果是文件的话通过FormFile传递进来
* HttpURLConnection的方式
* @param context
* @param actionUrl
* @param params
* @param files
* @return
* @throws IOException
*/
public static String post(Context context, String actionUrl,
Map<String, String> params, FormFile[] files) throws IOException {
Out.println("url:" + actionUrl);
String BOUNDARY = "743520vjdk4e";
String MULTIPART_FROM_DATA = "multipart/form-data";


URL uri = new URL(actionUrl);
HttpURLConnection conn = (HttpURLConnection) uri.openConnection();
conn.setReadTimeout(5 * 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);


// 首先组拼文本类型的参数
StringBuilder sb = new StringBuilder();


// 这个地方使用了Map循环 map循环的方式需要注意一下了
for (Map.Entry entry : params.entrySet()) {
sb.append("–");
sb.append(BOUNDARY);
// 回车换行
sb.append("\r\n");
sb.append("Content-Disposition:form-data:name\"" + entry.getKey()
+ "\r\n\r\n");
sb.append(entry.getValue());
sb.append("\r\n");
}
DataOutputStream outStream = new DataOutputStream(
conn.getOutputStream());
outStream.write(sb.toString().getBytes());


// 前面必须是数组才可以
// 发送文件数据
for (FormFile file : files) {


StringBuilder sb1 = new StringBuilder();
sb1.append("—");
sb1.append(BOUNDARY);
sb1.append("\r\n");
// 这个地方没有完
sb1.append("Content-Disposition:form-data:name=\"" + file.Formnames);
sb1.append("Content-Type" + file.contentType + "\r\n\r\n");
outStream.write(sb1.toString().getBytes());


// 先判断formfile里面是否为空 如果不为空的话则写出 获取formfile的data里面的
if (file.inStream != null) {
// 提供流的的方式的话就是一边读一边写了
byte[] buffer = new byte[1024];
int len = 0;
while ((len = file.inStream.read(buffer)) != -1) {
outStream.write(buffer, 0, len);
}
file.inStream.close();
} else {
outStream.write(file.data, 0, file.data.length);


}
outStream.write("\r\n".getBytes());


}
byte[] end_data = ("–" + BOUNDARY + "\r\n").getBytes();
outStream.write(end_data);
outStream.flush();


// 得到响应码
int res = conn.getResponseCode();
Out.println("ResponseCode:" + res);
if (res != 200) {
throw new RuntimeException("请求失败 ");
} else {


}


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


/**
* 通知栏下载apk

* @param handler
* @param name
*/
public static void downloadApkNotification(Context context, String name) {
/**下载更新的handler,包括通知*/
final DownloadApkHandler handler = new DownloadApkHandler(context);
//设置APK文件名
final String apkName = "InternalContacts"
+ (MainActivity.versionCode + 1) + ".apk";
File apkfile = new File(HttpTool.APK_DIRECTORY, apkName);
SharedPreferences sp = context.getSharedPreferences("info",
context.MODE_PRIVATE);
//是否已经下载好了升级APK文件
boolean isFinish = sp.getBoolean("apk_download_finish", false);
if (apkfile.exists()) {// 升级版本存在,直接升级
if (isFinish) {
// handler.sendMessage(handler.obtainMessage(140, apkfile));
UpgradeTool.installApk(context, apkfile);
return;
} else {
apkfile.delete();
}
}
// final String downloadpath = String.format(HttpTool.DOWNLOAD_APK,
// name);
final String downloadpath = name;


Runnable run = new Runnable() {


@Override
public void run() {
// TODO Auto-generated method stub
Out.println("download start........................");
File file = null;
try {
File dir = new File(APK_DIRECTORY);
if (!dir.exists()) {
//apk目录不存在则创建
dir.mkdir();
}
file = new File(dir, apkName);
if (!file.exists()) {
//如果文件不存在则创建
file.createNewFile();
} else {
//问已经存在则先删除
file.delete();
file.createNewFile();
}


// 下载开始
handler.sendMessage(handler.obtainMessage(110, file));


String absoluteUrl = downloadpath;
if (!downloadpath.startsWith("http")) {
absoluteUrl = HOST + downloadpath;
}
Out.println("url:" + absoluteUrl);
URL url = new URL(absoluteUrl);


HttpURLConnection connection = (HttpURLConnection) url
.openConnection();
Out.println("connection...........................");
// 以下为java IO部分,大体来说就是先检查文件夹是否存在,不存在则创建,然后的文件名重复问题,没有考虑
InputStream is = connection.getInputStream();


OutputStream os = new FileOutputStream(file);
byte[] buffer = new byte[1024];
int index = 0;
int sum = 0;
int max = connection.getContentLength();


if (handler != null) {
handler.sendMessage(handler.obtainMessage(120, max));
}


long a, b;
a = System.currentTimeMillis();


while ((index = is.read(buffer)) != -1) {
sum += index;
Out.println("sum:" + sum);
os.write(buffer, 0, index);


b = System.currentTimeMillis();
if (b - a > 1000 || sum == max) {
a = b;
if (handler != null) {
handler.sendMessage(handler.obtainMessage(130,
sum));
}
}
}
Out.println("下完了  sum:" + sum);
os.close();
is.close();


if (handler != null) {
handler.sendMessage(handler.obtainMessage(140, file));
}
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
if (handler != null) {
handler.sendMessage(handler.obtainMessage(150, file));
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
if (handler != null) {
handler.sendMessage(handler.obtainMessage(150, file));
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
if (handler != null) {
handler.sendMessage(handler.obtainMessage(150, file));
}
}
}


};


execInPool(run);
}


// public static ArrayList<AreaInfo> sortList(ArrayList<AreaInfo> l) {
// if (l == null)
// return null;
//
// ArrayList<AreaInfo> list = new ArrayList<AreaInfo>();
// int len = l.size();
// AreaInfo a;
// AreaInfo b;
// int index;
// for (int i = 0; i < len; i++) {
// // Out.println("BusinessDatabase i:"+i);
// a = l.get(0);
// index = 0;
// for (int j = 1; j < len - i; j++) {
// b = l.get(j);
// if (a.s_FirstLetter.compareTo(b.s_FirstLetter) > 0) {
// // Out.println("BusinessDatabase j:"+j);
// a = b;
// index = j;
// }
// }
// // Out.println("BusinessDatabase 首字�?"+a.s_FirstLetter);
// list.add(a);
// l.remove(index);
// }
// return list;
// }


}
0 0