package com.android.pc.ioc.internet;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.StringWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import org.xmlpull.v1.XmlSerializer;
import android.annotation.SuppressLint;
import android.os.Build;
import android.os.Handler;
import android.os.Message;
import android.util.Xml;
import com.android.pc.ioc.app.Ioc;
import com.android.pc.util.Handler_Network;
/**
* ----------------------同步----------------------<br>
* 需要自己开启新的线程 和构造handler<br>
* 网络请求类 封装:<br>
* 1 支持同步get请求<br>
* 2 支持同步post请求<br>
* 3 支持同步webserver请求<br>
* 4 支持同步form请求<br>
* ----------------------异步----------------------<br>
* 无需开新的线程 无需handler<br>
* 5 支持异步get请求<br>
* 6 支持异步post请求<br>
* 7 支持异步webserver请求<br>
* 8 支持异步form请求<br>
* ----------------------轮询----------------------<br>
* 9 支持get定时轮训<br>
* 10 支持post定时轮训<br>
* 11 支持webserver定时轮询<br>
* 12 支持自定义配置文件InternetConfig 可以配置编码格式 以及轮询时间(默认为30秒)<br>
* (注意:返回的数据ResponseEntity,根据getStatus来获取状态<br>
* 如果为FastHttp.result_ok则返回正常<br>
* 如果为FastHttp.result_url_err则为url错误<br>
* 如果为FastHttp.result_net_err则为网络错误<br>
* 如果为FastHttp.result_file_err则为表单提交时文件不存在<br>
* 如果为FastHttp.result_protocol_err则为协议错误<br>
* 返回的数据格式为字符串 自己解析成需要格式)
*
* @author gdpancheng@gmail.com 2013-5-22 下午5:31:30
*/
public class FastHttp {
public static final int result_ok = 0;
public static final int result_net_err = 1;
private static final String METHOD = "method";
public static final String BOUNDARY = java.util.UUID.randomUUID().toString();
public static final String PREFIX = "--", LINEND = "\r\n";
public static final String MULTIPART_FROM_DATA = "multipart/form-data";
public static String cookies;
private static MyHostnameVerifier hnv = new MyHostnameVerifier();
/**
* 同步 get请求 无参数 使用默认的配置文件
*
* @author gdpancheng@gmail.com 2013-5-20 下午2:39:53
* @param url
* 请求的url
* @return ResponseEntity 返回的数据
*/
public static ResponseEntity get(String url) {
return get(url, null, InternetConfig.defaultConfig());
}
/**
* 同步 get请求 无参数 使用自定义的配置文件
*
* @author gdpancheng@gmail.com 2013-5-20 下午2:40:21
* @param url
* url 请求的url
* @param config
* 自定义的配置文件
* @return ResponseEntity 返回的数据
*/
public static ResponseEntity get(String url, InternetConfig config) {
return get(url, null, config);
}
/**
* 同步 get请求 有参数 默认配置
*
* @author gdpancheng@gmail.com 2013-5-20 下午2:41:20
* @param url
* 请求的连接
* @param params
* 请求的参数
* @return ResponseEntity 返回的数据
*/
public static ResponseEntity get(String url, LinkedHashMap<String, String> params) {
return get(url, params, InternetConfig.defaultConfig());
}
/**
* 同步 get请求 有参数 自定义配置
*
* @author gdpancheng@gmail.com 2013-6-8 下午1:58:23
* @param url
* 请求的连接
* @param params
* 请求的参数
* @param config
* 配置
* @return ResponseEntity 返回结果
*/
public static ResponseEntity get(String url, LinkedHashMap<String, String> params, InternetConfig config) {
config.setRequest_type(InternetConfig.request_get);
if (params != null) {
if (url.indexOf("\\?") != -1) {
url = url + "?";
} else {
url = url + "&";
}
for (Map.Entry<String, String> entry : params.entrySet()) {
url = url + entry.getKey() + "=" + entry.getValue() + "&";
}
url = url.substring(0, url.length() - 1);
}
ResponseEntity responseEntity = new ResponseEntity();
responseEntity.setUrl(url);
responseEntity.setParams(params);
responseEntity.setKey(config.getKey());
// 判断是否需要离线
if (config.isSave()) {
if (!Handler_Network.isNetworkAvailable(Ioc.getIoc().getApplication())) {
Ioc.getIoc().getLogger().e("无法连接到网络 将获取离线数据");
String result = HttpCache.getUrlCache(url, params);
if (result != null) {
responseEntity.setContent(result, false);
responseEntity.setStatus(result_ok);
return responseEntity;
}
}
}
try {
HttpURLConnection conn = getDefaultHttpClient(url, config);
InputStream inStream = conn.getInputStream();
getCookies(config, responseEntity, conn);
responseEntity.setContent(inputStreamToString(inStream, config.getCharset()), config.isSave());
responseEntity.setConfig(config);
conn.disconnect();
responseEntity.setStatus(result_ok);
if (responseEntity.getContentAsString().length() == 0) {
responseEntity.setStatus(result_net_err);
}
return responseEntity;
} catch (Exception e) {
responseEntity.setStatus(result_net_err);
e.printStackTrace();
}
return responseEntity;
}
/**
* 同步 post请求 默认下载配置 无参数
*
* @author gdpancheng@gmail.com 2013-5-20 下午2:46:18
* @param url
* 请求Url
* @return ResponseEntity 返回的结果
*/
public static ResponseEntity post(String url) {
return post(url, null, InternetConfig.defaultConfig());
}
/**
* 同步 post请求 有参数 默认下载配置
*
* @author gdpancheng@gmail.com 2013-5-20 下午2:47:38
* @param url
* 请求的连接
* @param params
* 请求的参数
* @return ResponseEntity 返回的数据
*/
public static ResponseEntity post(String url, LinkedHashMap<String, String> params) {
return post(url, params, InternetConfig.defaultConfig());
}
/**
* 同步 post请求 有参数 自定义下载配置
*
* @author gdpancheng@gmail.com 2013-5-20 下午2:48:49
* @param url
* 请求url
* @param params
* 请求参数
* @param config
* 下载配置
* @return ResponseEntity 返回值
*/
public static ResponseEntity post(String url, LinkedHashMap<String, String> params, InternetConfig config) {
config.setRequest_type(InternetConfig.request_post);
ResponseEntity responseEntity = new ResponseEntity();
responseEntity.setUrl(url);
responseEntity.setParams(params);
responseEntity.setKey(config.getKey());
// 判断是否需要离线
if (config.isSave()) {
if (!Handler_Network.isNetworkAvailable(Ioc.getIoc().getApplication())) {
Ioc.getIoc().getLogger().e("无法连接到网络 将获取离线数据");
String result = HttpCache.getUrlCache(url, params);
if (result != null) {
responseEntity.setContent(result, false);
responseEntity.setStatus(result_ok);
return responseEntity;
}
}
}
try {
HttpURLConnection conn = getDefaultHttpClient(url, config);
conn.setDoOutput(true);
conn.setDoInput(true);
conn.connect();
OutputStream out = conn.getOutputStream();
String values = "";
if (params != null && params.size() > 0) {
for (Map.Entry<String, String> entry : params.entrySet()) {
values = values + entry.getKey() + "=" + entry.getValue() + "&";
}
values = values.substring(0, values.length() - 1);
out.write(values.getBytes(config.getCharset()));
}
out.flush();
out.close();
InputStream inStream = conn.getInputStream();
getCookies(config, responseEntity, conn);
responseEntity.setContent(inputStreamToString(inStream, config.getCharset()), config.isSave());
responseEntity.setConfig(config);
conn.disconnect();
responseEntity.setStatus(result_ok);
if (responseEntity.getContentAsString().length() == 0) {
responseEntity.setStatus(result_net_err);
}
return responseEntity;
} catch (Exception e) {
responseEntity.setStatus(result_net_err);
e.printStackTrace();
}
return responseEntity;
}
public static ResponseEntity postString(String url, String params, InternetConfig config) {
config.setRequest_type(InternetConfig.request_post);
ResponseEntity responseEntity = new ResponseEntity();
responseEntity.setUrl(url);
try {
HttpURLConnection conn = getDefaultHttpClient(url, config);
conn.setDoOutput(true);
conn.setDoInput(true);
conn.connect();
OutputStream out = conn.getOutputStream();
if (params != null && params.length() > 0) {
out.write(params.getBytes(config.getCharset()));
}
out.flush();
out.close();
InputStream inStream = conn.getInputStream();
cookies = conn.getHeaderField("set-cookie");
if (config.isCookies() && cookies != null) {
String[] cook = cookies.split(";");
for (String cook2 : cook) {
String[] cook3 = cook2.split("=");
if (cook3.length > 1) {
responseEntity.cookie(cook3[0], cook3[1]);
}
}
}
responseEntity.setContent(inputStreamToString(inStream, config.getCharset()), config.isSave());
conn.disconnect();
responseEntity.setStatus(result_ok);
if (responseEntity.getContentAsString().length() == 0) {
responseEntity.setStatus(result_net_err);
}
return responseEntity;
} catch (Exception e) {
responseEntity.setStatus(result_net_err);
e.printStackTrace();
}
return responseEntity;
}
/**
* 同步 表单请求 默认下载配置 无参数
*
* @author gdpancheng@gmail.com 2013-5-20 下午2:46:18
* @param url
* 请求Url
* @return ResponseEntity 返回的结果
*/
public static ResponseEntity form(String url) {
return form(url, null, null, InternetConfig.defaultConfig());
}
/**
* 同步 表单请求 有参数 默认下载配置
*
* @author gdpancheng@gmail.com 2013-5-20 下午2:47:38
* @param url
* 请求的连接
* @param params
* 请求的参数
* @return ResponseEntity 返回的数据
*/
public static ResponseEntity form(String url, LinkedHashMap<String, String> params) {
return form(url, params, null, InternetConfig.defaultConfig());
}
/**
* 同步 表单请求 有参数 有上传文件 默认下载配置
*
* @author gdpancheng@gmail.com 2013-6-8 下午2:01:54
* @param url
* 请求的连接
* @param params
* 请求的参数
* @param files
* 需要上传的文件集合
* @return
* @return ResponseEntity
*/
public static ResponseEntity form(String url, LinkedHashMap<String, String> params, HashMap<String, File> files) {
return form(url, params, files, InternetConfig.defaultConfig());
}
/**
* 同步 表单请求 有参数 有上传文件 自定义下载配置 TODO(这里用一句话描述这个方法的作用)
*
* @author gdpancheng@gmail.com 2013-6-8 下午2:02:21
* @param url
* 请求的连接
* @param params
* 请求的参数
* @param files
* 需要上传的文件集合
* @param config
* @return
* @return ResponseEntity
*/
public static ResponseEntity form(String url, LinkedHashMap<String, String> params, HashMap<String, File> files, InternetConfig config) {
params = params == null ? new LinkedHashMap<String, String>() : params;
config.setRequest_type(InternetConfig.request_form);
ResponseEntity responseEntity = new ResponseEntity();
responseEntity.setUrl(url);
responseEntity.setParams(params);
responseEntity.setKey(config.getKey());
// 判断是否需要离线
if (config.isSave()) {
if (!Handler_Network.isNetworkAvailable(Ioc.getIoc().getApplication())) {
Ioc.getIoc().getLogger().e("无法连接到网络 将获取离线数据");
String result = HttpCache.getUrlCache(url, params);
if (result != null) {
responseEntity.setContent(result, false);
responseEntity.setStatus(result_ok);
return responseEntity;
}
}
}
try {
HttpURLConnection conn = getDefaultHttpClient(url, config);
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false); // 不允许使用缓存
StringBuilder sb = new StringBuilder();
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=" + config.getCharset() + LINEND);
sb.append("Content-Transfer-Encoding: 8bit" + LINEND);
sb.append(LINEND);
sb.append(entry.getValue());
sb.append(LINEND);
}
DataOutputStream outStream = new DataOutputStream(conn.getOutputStream());
if (sb.length() > 0) {
outStream.write(sb.toString().getBytes());
}
InputStream in = null;
if (files != null) {
for (Map.Entry<String, File> file : files.entrySet()) {
if (!file.getValue().exists()) {
continue;
}
StringBuilder sb1 = new StringBuilder();
sb1.append(PREFIX);
sb1.append(BOUNDARY);
sb1.append(LINEND);
sb1.append("Content-Disposition: form-data; name=\"" + file.getKey() + "\"; filename=\"" + file.getValue().getName() + "\"" + LINEND);
sb1.append("Content-Type: image/pjpeg; " + LINEND);
sb1.append(LINEND);
outStream.write(sb1.toString().getBytes());
InputStream is = new FileInputStream(file.getValue());
byte[] buffer = new byte[1024];
int len = 0;
int count = 0;
while ((len = is.read(buffer)) != -1) {
outStream.write(buffer, 0, len);
count = count + len;
}
is.close();
outStream.write(LINEND.getBytes());
}
// 请求结束标志
byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes();
outStream.write(end_data);
outStream.flush();
// 得到响应码
// int res = conn.getResponseCode();
// if (res == 200) {
in = conn.getInputStream();
getCookies(config, responseEntity, conn);
responseEntity.setContent(inputStreamToString(in, config.getCharset()), config.isSave());
responseEntity.setKey(config.getKey());
outStream.close();
conn.disconnect();
responseEntity.setStatus(result_ok);
if (responseEntity.getContentAsString().length() == 0) {
responseEntity.setStatus(result_net_err);
}
} else {
InputStream inStream = conn.getInputStream();
responseEntity.setContent(inputStreamToString(inStream, config.getCharset()), config.isSave());
conn.disconnect();
responseEntity.setStatus(result_ok);
if (responseEntity.getContentAsString().length() == 0) {
responseEntity.setStatus(result_net_err);
}
}
} catch (Exception e) {
responseEntity.setStatus(result_net_err);
e.printStackTrace();
}
return responseEntity;
}
public interface Progress {
public void progress(int progress);
}
public static ResponseEntity formProgress(String url, LinkedHashMap<String, String> params, HashMap<String, File> files, InternetConfig config, Progress progress) {
params = params == null ? new LinkedHashMap<String, String>() : params;
config.setRequest_type(InternetConfig.request_form);
ResponseEntity responseEntity = new ResponseEntity();
responseEntity.setUrl(url);
responseEntity.setParams(params);
responseEntity.setKey(config.getKey());
// 判断是否需要离线
if (config.isSave()) {
if (!Handler_Network.isNetworkAvailable(Ioc.getIoc().getApplication())) {
Ioc.getIoc().getLogger().e("无法连接到网络 将获取离线数据");
String result = HttpCache.getUrlCache(url, params);
if (result != null) {
responseEntity.setContent(result, false);
responseEntity.setStatus(result_ok);
return responseEntity;
}
}
}
try {
long all_count = getOrtherLength(params, files, config);
long read_count = 0;
config.setAll_length(all_count);
HttpURLConnection conn = getDefaultHttpClient(url, config);
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false); // 不允许使用缓存
StringBuilder sb = new StringBuilder();
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=" + config.getCharset() + LINEND);
sb.append("Content-Transfer-Encoding: 8bit" + LINEND);
sb.append(LINEND);
sb.append(entry.getValue());
sb.append(LINEND);
}
BufferedOutputStream outStream = new BufferedOutputStream(conn.getOutputStream());
if (sb.length() > 0) {
outStream.write(sb.toString().getBytes());
if (progress != null) {
read_count = read_count + sb.toString().getBytes().length;
progress.progress((int) (read_count * 100 / all_count));
}
}
InputStream in = null;
if (files != null) {
for (Map.Entry<String, File> file : files.entrySet()) {
if (!file.getValue().exists()) {
continue;
}
StringBuilder sb1 = new StringBuilder();
sb1.append(PREFIX);
sb1.append(BOUNDARY);
sb1.append(LINEND);
sb1.append("Content-Disposition: form-data; name=\"" + file.getKey() + "\"; filename=\"" + file.getValue().getName() + "\"" + LINEND);
sb1.append("Content-Type: image/pjpeg; " + LINEND);
sb1.append(LINEND);
outStream.write(sb1.toString().getBytes());
if (progress != null) {
read_count = read_count + sb1.toString().getBytes().length;
progress.progress((int) (read_count * 100 / all_count));
}
InputStream is = new FileInputStream(file.getValue());
byte[] buffer = new byte[1024];
int len = 0;
while ((len = is.read(buffer)) != -1) {
outStream.write(buffer, 0, len);
read_count = read_count + len;
if (progress != null) {
progress.progress((int) (read_count * 100 / all_count));
}
}
is.close();
outStream.write(LINEND.getBytes());
if (progress != null) {
read_count = read_count + LINEND.getBytes().length;
progress.progress((int) (read_count * 100 / all_count));
}
}
// 请求结束标志
byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes();
outStream.write(end_data);
outStream.flush();
if (progress != null) {
read_count = read_count + end_data.length;
progress.progress((int) (read_count * 100 / all_count));
}
// 得到响应码
// int res = conn.getResponseCode();
// if (res == 200) {
in = conn.getInputStream();
getCookies(config, responseEntity, conn);
responseEntity.setContent(inputStreamToString(in, config.getCharset()), config.isSave());
responseEntity.setKey(config.getKey());
responseEntity.setConfig(config);
outStream.close();
conn.disconnect();
responseEntity.setStatus(result_ok);
if (responseEntity.getContentAsString().length() == 0) {
responseEntity.setStatus(result_net_err);
}
} else {
InputStream inStream = conn.getInputStream();
responseEntity.setContent(inputStreamToString(inStream, config.getCharset()), config.isSave());
conn.disconnect();
responseEntity.setStatus(result_ok);
if (responseEntity.getContentAsString().length() == 0) {
responseEntity.setStatus(result_net_err);
}
}
} catch (Exception e) {
responseEntity.setStatus(result_net_err);
e.printStackTrace();
}
return responseEntity;
}
/**
* 异步表单提交
*
* @author gdpancheng@gmail.com 2013-6-8 下午2:03:10
* @param url
* @param callBack
* @return void
*/
public static void ajaxForm(String url, AjaxCallBack callBack) {
ajaxForm(url, null, null, InternetConfig.defaultConfig(), callBack);
}
/**
* 异步表单提交 自定义配置
*
* @author gdpancheng@gmail.com 2013-6-8 下午2:03:22
* @param url
* @param config
* @param callBack
* @return void
*/
public static void ajaxForm(String url, InternetConfig config, AjaxCallBack callBack) {
ajaxForm(url, null, null, config, callBack);
}
/**
* 异步表单提交 有参数
*
* @author gdpancheng@gmail.com 2013-6-8 下午2:03:37
* @param url
* @param params
* @param callBack
* @return void
*/
public static void ajaxForm(String url, LinkedHashMap<String, String> params, AjaxCallBack callBack) {
ajaxForm(url, params, null, InternetConfig.defaultConfig(), callBack);
}
/**
* 自定义表单提交有参数 有文件
*
* @author gdpancheng@gmail.com 2013-6-8 下午2:03:57
* @param url
* @param params
* @param files
* @param callBack
* @return void
*/
public static void ajaxForm(String url, LinkedHashMap<String, String> params, HashMap<String, File> files, AjaxCallBack callBack) {
ajaxForm(url, params, files, InternetConfig.defaultConfig(), callBack);
}
/**
* 自定义表单提交有参数 有文件 自定义下载配置
*
* @author gdpancheng@gmail.com 2013-6-8 下午2:04:38
* @param url
* @param params
* @param files
* @param config
* @param callBack
* @return void
*/
public static void ajaxForm(String url, LinkedHashMap<String, String> params, HashMap<String, File> files, InternetConfig config, AjaxCallBack callBack) {
config.setRequest_type(InternetConfig.request_form);
config.setFiles(files);
new Thread(new AjaxTask(url, params, config, callBack)).start();
}
/**
* 异步 post请求 无参数 默认下载配置器
*
* @author gdpancheng@gmail.com 2013-5-20 下午2:49:57
* @param url
* 请求url
* @param callBack
* 回调函数
* @return void
*/
public static void ajax(String url, AjaxCallBack callBack) {
ajax(url, null, InternetConfig.defaultConfig(), callBack);
}
/**
* 异步 post请求 无参数 自定义下载配置
*
* @author gdpancheng@gmail.com 2013-5-20 下午2:50:48
* @param url
* 请求连接
* @param config
* 自定义下载配置
* @param callBack
* 回调函数
* @return void
*/
public static void ajax(String url, InternetConfig config, AjaxCallBack callBack) {
ajax(url, null, config, callBack);
}
/**
* 异步 post请求 有参数 默认下载配置
*
* @author gdpancheng@gmail.com 2013-5-20 下午2:51:48
* @param url
* 请求url
* @param params
* 请求参数
* @param callBack
* 回调函数
* @return void
*/
public static void ajax(String url, LinkedHashMap<String, String> params, AjaxCallBack callBack) {
ajax(url, params, InternetConfig.defaultConfig(), callBack);
}
/**
* 异步 post异步获取 有参数 自定义下载配置
*
* @author gdpancheng@gmail.com 2013-5-20 下午2:54:08
* @param url
* 请求连接
* @param params
* 请求参数
* @param config
* 请求配置
* @param callBack
* 回调函数
* @return void
*/
public static void ajax(String url, LinkedHashMap<String, String> params, InternetConfig config, AjaxCallBack callBack) {
config.setRequest_type(InternetConfig.request_post);
new Thread(new AjaxTask(url, params, config, callBack)).start();
}
/**
* 异步post定时轮询
*
* @author gdpancheng@gmail.com 2013-6-8 下午2:05:07
* @param url
* @param callBack
* @return void
*/
public static void ajax(String url, AjaxTimeCallBack callBack) {
InternetConfig config = InternetConfig.defaultConfig();
config.setRequest_type(InternetConfig.request_post);
ajax(url, null, config, callBack);
}
/**
* 异步post定时轮询
*
* @author gdpancheng@gmail.com 2013-6-8 下午2:06:54
* @param url
* @param params
* @param callBack
* @return void
*/
public static void ajax(String url, LinkedHashMap<String, String> params, AjaxTimeCallBack callBack) {
InternetConfig config = InternetConfig.defaultConfig();
config.setRequest_type(InternetConfig.request_post);
ajax(url, params, config, callBack);
}
/**
* 异步 post异步获取 定时请求(轮询)有参数 自定义下载配置 回调函数
*
* @author gdpancheng@gmail.com 2013-5-20 下午2:52:52
* @param url
* 请求连接
* @param params
* 请求参数
* @param config
* 请求配置
* @param callBack
* 回调函数
* @return void
*/
public static void ajax(String url, LinkedHashMap<String, String> params, InternetConfig config, AjaxTimeCallBack callBack) {
config.setRequest_type(InternetConfig.request_post);
new Thread(new TimeTask(url, params, config, callBack)).start();
}
// -----------------------------------------------------------------------------------------------------------------------------------
// webservers请求处理
/**
* 同步 WebServer get请求 无参数 使用默认的配置文件
*
* @author gdpancheng@gmail.com 2013-5-20 下午2:39:53
* @param url
* 请求的url
* @return T 返回的数据
*/
public static ResponseEntity webServer(String url, String method) {
return webServer(url, null, InternetConfig.defaultConfig(), method);
}
/**
* 同步 WebServer get请求 无参数 使用自定义的配置文件
*
* @author gdpancheng@gmail.com 2013-5-20 下午2:40:21
* @param url
* url 请求的url
* @param config
* 自定义的配置文件
* @return T 返回的数据
*/
public static ResponseEntity webServer(String url, InternetConfig config, String method) {
return webServer(url, null, config, method);
}
/**
* 同步 WebServer get请求 有参数 默认配置
*
* @author gdpancheng@gmail.com 2013-5-20 下午2:41:20
* @param url
* 请求的连接
* @param params
* 请求的参数
* @return T 返回的数据
*/
public static ResponseEntity webServer(String url, LinkedHashMap<String, String> params, String method) {
return webServer(url, params, InternetConfig.defaultConfig(), method);
}
/**
* 同步 WebServer get请求 有参数 自定义下载配置
*
* @author gdpancheng@gmail.com 2013-5-20 下午2:45:04
* @param url
* 请求连接
* @param params
* 参数
* @param config
* 下载的配置
* @return T 返回的数据
*/
public static ResponseEntity webServer(String url, LinkedHashMap<String, String> params, InternetConfig config, String method) {
config.setRequest_type(InternetConfig.request_webserver);
ResponseEntity responseEntity = new ResponseEntity();
responseEntity.setUrl(url);
responseEntity.setParams(params);
responseEntity.setKey(config.getKey());
// 判断是否需要离线
if (config.isSave()) {
if (!Handler_Network.isNetworkAvailable(Ioc.getIoc().getApplication())) {
Ioc.getIoc().getLogger().e("无法连接到网络 将获取离线数据");
String result = HttpCache.getUrlCache(url, params);
if (result != null) {
responseEntity.setContent(result, false);
responseEntity.setStatus(result_ok);
return responseEntity;
}
}
}
try {
config.setMethod(method);
HttpURLConnection conn = getDefaultHttpClient(url, config);
conn.setDoOutput(true);
conn.setDoInput(true);
conn.connect();
OutputStream out = conn.getOutputStream();
String content = "";
if (params == null) {
params = new LinkedHashMap<String, String>();
}
content = getXml(params, method, config.getName_space());
content = content.replace(" standalone='yes' ", "");
out.write(content.getBytes("UTF-8"));
out.flush();
out.close();
InputStream inStream = conn.getInputStream();
getCookies(config, responseEntity, conn);
responseEntity.setContent(XMLtoJsonUtil.XMLtoJson(inputStreamToString(inStream, config.getCharset()), method, config.getCharset()), config.isSave());
responseEntity.setKey(config.getKey());
responseEntity.setConfig(config);
conn.disconnect();
responseEntity.setStatus(result_ok);
if (responseEntity.getContentAsString().length() == 0) {
responseEntity.setStatus(result_net_err);
}
return responseEntity;
} catch (Exception e) {
responseEntity.setStatus(result_net_err);
e.printStackTrace();
}
return responseEntity;
}
/**
* 异步 post请求 无参数 默认下载配置器
*
* @author gdpancheng@gmail.com 2013-5-20 下午2:49:57
* @param url
* 请求url
* @param callBack
* 回调函数
* @return void
*/
public static void ajaxWebServer(String url, String method, AjaxCallBack callBack) {
InternetConfig config = new InternetConfig();
config.setMethod(method);
config.setRequest_type(InternetConfig.request_webserver);
ajaxWebServer(url, method, null, config, callBack);
}
/**
* 异步 post请求 无参数 自定义下载配置
*
* @author gdpancheng@gmail.com 2013-5-20 下午2:50:48
* @param url
* 请求连接
* @param config
* 自定义下载配置
* @param callBack
* 回调函数
* @return void
*/
public static void ajaxWebServer(String url, String method, InternetConfig config, AjaxCallBack callBack) {
ajaxWebServer(url, method, null, config, callBack);
}
/**
* 异步 post请求 有参数 默认下载配置
*
* @author gdpancheng@gmail.com 2013-5-20 下午2:51:48
* @param url
* 请求url
* @param params
* 请求参数
* @param callBack
* 回调函数
* @return void
*/
public static void ajaxWebServer(String url, String method, LinkedHashMap<String, String> params, AjaxCallBack callBack) {
InternetConfig config = InternetConfig.defaultConfig();
config.setMethod(method);
config.setRequest_type(InternetConfig.request_webserver);
ajaxWebServer(url, method, params, config, callBack);
}
/**
* 异步 post异步获取 有参数 自定义下载配置
*
* @author gdpancheng@gmail.com 2013-5-20 下午2:54:08
* @param url
* 请求连接
* @param params
* 请求参数
* @param config
* 请求配置
* @param callBack
* 回调函数
* @return void
*/
public static void ajaxWebServer(String url, String method, LinkedHashMap<String, String> params, InternetConfig config, AjaxCallBack callBack) {
if (config == null) {
config = InternetConfig.defaultConfig();
}
config.setMethod(method);
config.setRequest_type(InternetConfig.request_webserver);
new Thread(new AjaxTask(url, params, config, callBack)).start();
}
/**
* 异步 post异步获取 定时请求(轮询)有参数 默认下载配置 回调函数
*
* @author gdpancheng@gmail.com 2013-5-20 下午2:52:52
* @param url
* 请求连接
* @param params
* 请求参数
* @param config
* 请求配置
* @param callBack
* 回调函数
* @return void
*/
public static void ajaxWebServer(String url, String method, LinkedHashMap<String, String> params, AjaxTimeCallBack callBack) {
InternetConfig config = InternetConfig.defaultConfig();
config.setMethod(method);
config.setRequest_type(InternetConfig.request_webserver);
new Thread(new TimeTask(url, params, config, callBack)).start();
}
/**
* 异步 post异步获取 定时请求(轮询)有参数 自定义下载配置 回调函数
*
* @author gdpancheng@gmail.com 2013-5-20 下午2:52:52
* @param url
* 请求连接
* @param params
* 请求参数
* @param config
* 请求配置
* @param callBack
* 回调函数
* @return void
*/
public static void ajaxWebServer(String url, String method, LinkedHashMap<String, String> params, InternetConfig config, AjaxTimeCallBack callBack) {
if (config == null) {
config = InternetConfig.defaultConfig();
}
config.setMethod(method);
config.setRequest_type(InternetConfig.request_webserver);
new Thread(new TimeTask(url, params, config, callBack)).start();
}
/**
* 异步get获取
*
* @author gdpancheng@gmail.com 2013-5-22 下午1:34:42
* @param url
* 请求路径
* @param callBack
* 回调函数
* @return void
*/
public static void ajaxGet(String url, AjaxCallBack callBack) {
ajaxGet(url, null, InternetConfig.defaultConfig(), callBack);
}
/**
* 异步get获取
*
* @author gdpancheng@gmail.com 2013-5-22 下午1:35:20
* @param url
* 请求路径
* @param config
* 配置文件
* @param callBack
* 回调函数
* @return void
*/
public static void ajaxGet(String url, InternetConfig config, AjaxCallBack callBack) {
ajaxGet(url, null, config, callBack);
}
/**
* 异步get获取
*
* @author gdpancheng@gmail.com 2013-5-22 下午1:36:13
* @param url
* 请求路径
* @param params
* 参数
* @param callBack
* 回调函数
* @return void
*/
public static void ajaxGet(String url, LinkedHashMap<String, String> params, AjaxCallBack callBack) {
ajaxGet(url, params, InternetConfig.defaultConfig(), callBack);
}
/**
* get异步获取
*
* @author gdpancheng@gmail.com 2013-5-22 下午1:36:39
* @param url
* 请求路径
* @param params
* 参数
* @param config
* 下载配置
* @param callBack
* 回调函数
* @return void
*/
public static void ajaxGet(String url, LinkedHashMap<String, String> params, InternetConfig config, AjaxCallBack callBack) {
if (config == null) {
config = InternetConfig.defaultConfig();
}
config.setRequest_type(InternetConfig.request_get);
new Thread(new AjaxTask(url, params, config, callBack)).start();
}
/**
* get异步获取 定时请求(轮询)
*
* @author gdpancheng@gmail.com 2013-5-22 下午1:38:32
* @param url
* 请求路径
* @param params
* 参数
* @param config
* 下载配置
* @param callBack
* 回调函数
* @return void
*/
public static void ajaxGet(String url, LinkedHashMap<String, String> params, InternetConfig config, AjaxTimeCallBack callBack) {
if (config == null) {
config = InternetConfig.defaultConfig();
}
config.setRequest_type(InternetConfig.request_get);
new Thread(new TimeTask(url, params, config, callBack)).start();
}
@SuppressLint("HandlerLeak")
static class AjaxTask extends basicRunable implements Runnable {
private AjaxCallBack mCallBack;
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
if (mCallBack.stop()) {
return;
}
mCallBack.callBack((ResponseEntity) msg.obj);
}
};
public AjaxTask(String url, LinkedHashMap<String, String> params, InternetConfig internetConfig, AjaxCallBack callBack) {
this.mCallBack = callBack;
this.internetConfig = internetConfig;
this.url = url;
this.params = params;
}
public void run() {
Message msg = new Message();
switch (internetConfig.getRequest_type()) {
case InternetConfig.request_post:
msg.obj = post(url, params, internetConfig);
break;
case InternetConfig.request_get:
msg.obj = get(url, params, internetConfig);
break;
case InternetConfig.request_file:
break;
case InternetConfig.request_webserver:
msg.obj = webServer(url, params, internetConfig, internetConfig.getMethod());
break;
case InternetConfig.request_form:
// if (internetConfig.getProgress()!=null) {
msg.obj = formProgress(url, params, internetConfig.getFiles(), internetConfig, internetConfig.getProgress());
// }else {
// msg.obj = form(url, params, internetConfig.getFiles(), internetConfig);
// }
break;
default:
break;
}
mHandler.sendMessage(msg);
}
}
static class basicRunable {
InternetConfig internetConfig;
String url;
LinkedHashMap<String, String> params;
}
@SuppressLint("HandlerLeak")
static class TimeTask extends basicRunable implements Runnable {
private AjaxTimeCallBack mCallBack;
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
mCallBack.callBack((ResponseEntity) msg.obj);
}
};
public TimeTask(String url, LinkedHashMap<String, String> params, InternetConfig internetConfig, AjaxTimeCallBack callBack) {
this.mCallBack = callBack;
this.internetConfig = internetConfig;
this.url = url;
this.params = params;
}
public void run() {
while (mCallBack.getIsContinue()) {
Message msg = new Message();
switch (internetConfig.getRequest_type()) {
case InternetConfig.request_post:
msg.obj = post(url, params, internetConfig);
break;
case InternetConfig.request_get:
msg.obj = get(url, params, internetConfig);
break;
case InternetConfig.request_file:
break;
case InternetConfig.request_webserver:
msg.obj = webServer(url, params, internetConfig, internetConfig.getMethod());
break;
default:
break;
}
mHandler.sendMessage(msg);
try {
Thread.sleep(internetConfig.getTime());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
private static HttpURLConnection getDefaultHttpClient(String urls, InternetConfig config) throws ProtocolException, MalformedURLException, IOException {
if (config.isHttps()) {
SSLContext sslContext = null;
SSLSocketFactoryEx socketFactoryEx = null;
try {
socketFactoryEx = new SSLSocketFactoryEx(null);
} catch (Exception e) {
e.printStackTrace();
}
sslContext = socketFactoryEx.sslContext;
if (sslContext != null) {
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
}
// HttpsURLConnection.setDefaultHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
HttpsURLConnection.setDefaultHostnameVerifier(hnv);
}
System.out.println(urls);
URL url = new URL(urls);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
if (config.getFiles() != null) {
conn.setFixedLengthStreamingMode((int) config.getAll_length());
}
conn.setConnectTimeout(config.getTimeout());
conn.setReadTimeout(config.getTimeout());
String method = "POST";
if (Build.VERSION.SDK!=null&&Build.VERSION.SDK_INT>13) {
conn.setRequestProperty("Connection", "close");
}
if (config.getRequest_type() == InternetConfig.request_get) {
method = "GET";
conn.setRequestMethod(method);
conn.setRequestProperty("Charsert", config.getCharset());
conn.setRequestProperty("Content-Type", config.getContent_type_web());
} else if (config.getRequest_type() == InternetConfig.request_post) {
method = "POST";
conn.setRequestMethod(method);
// conn.setRequestProperty("Charsert", config.getCharset());
conn.setRequestProperty("Content-Type", config.getContent_type_web());
} else if (config.getRequest_type() == InternetConfig.request_webserver) {
method = "POST";
conn.setRequestMethod(method);
conn.setRequestProperty("Charsert", config.getCharset());
conn.setRequestProperty("Content-Type", InternetConfig.content_type_xml);
conn.setRequestProperty("SOAPAction", config.getName_space() + config.getMethod());
conn.setRequestProperty(METHOD, config.getMethod());
} else if (config.getRequest_type() == InternetConfig.request_form) {
method = "POST";
conn.setRequestMethod(method);
conn.setRequestProperty("connection", "keep-alive");
conn.setRequestProperty("Charsert", config.getCharset());
conn.setRequestProperty("Content-Type", MULTIPART_FROM_DATA + ";boundary=" + BOUNDARY);
}
conn.setRequestProperty("User-Agent", InternetConfig.UA);
if (config.isCookies() && cookies != null) {
conn.setRequestProperty("cookie", cookies);
}
if (config.getHead() != null) {
HashMap<String, Object> head = config.getHead();
for (String key : head.keySet()) {
conn.setRequestProperty(key, head.get(key).toString());
}
}
return conn;
}
public static String inputStreamToString(InputStream in, String charset) throws IOException {
StringBuffer out = new StringBuffer();
BufferedReader input = new BufferedReader(new InputStreamReader(in, charset));
String s;
while ((s = input.readLine()) != null) {
out.append(s);
}
// byte[] b = new byte[4096];
// for (int n; (n = in.read(b)) != -1;) {
// out.append(new String(b, 0, n, charset));
// }
return out.toString();
}
private static String getXml(LinkedHashMap<String, String> data, String method, String name_space) {
XmlSerializer serializer = Xml.newSerializer();
StringWriter writer = new StringWriter();
try {
serializer.setOutput(writer);
serializer.startDocument("UTF-8", true);
serializer.startTag("", "soap:Envelope");
serializer.attribute("", "xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
serializer.attribute("", "xmlns:xsd", "http://www.w3.org/2001/XMLSchema");
serializer.attribute("", "xmlns:soap", "http://schemas.xmlsoap.org/soap/envelope/");
serializer.startTag("", "soap:Body");
serializer.startTag("", method);
serializer.attribute("", "xmlns", name_space);
for (String key : data.keySet()) {
serializer.startTag("", key);
serializer.text(data.get(key).toString());
serializer.endTag("", key);
}
serializer.endTag("", method);
serializer.endTag("", "soap:Body");
serializer.endTag("", "soap:Envelope");
serializer.endDocument();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return writer.getBuffer().toString();
}
static class MyHostnameVerifier implements HostnameVerifier {
public boolean verify(String hostname, SSLSession session) {
Ioc.getIoc().getLogger().w("Warning: URL Host: " + hostname + " vs. " + session.getPeerHost());
return true;
}
}
private static void getCookies(InternetConfig config, ResponseEntity responseEntity, HttpURLConnection conn) {
if (!config.isCookies()) {
return;
}
Map<String, List<String>> resHeaders = conn.getHeaderFields();
for (Map.Entry<String, List<String>> entry : resHeaders.entrySet()) {
String name = entry.getKey();
if (name == null) {
continue;
}
if (!name.equalsIgnoreCase("Set-Cookie")) {
continue;
}
for (String cok : entry.getValue()) {
String[] cook = cok.split(";");
for (String cook2 : cook) {
String[] cook3 = cook2.split("=");
if (cook3.length > 1) {
responseEntity.cookie(cook3[0], cook3[1]);
}
}
}
}
}
private static int getOrtherLength(LinkedHashMap<String, String> params, HashMap<String, File> files, InternetConfig config) {
long count = 0;
StringBuilder sb = new StringBuilder();
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=" + config.getCharset() + LINEND);
sb.append("Content-Transfer-Encoding: 8bit" + LINEND);
sb.append(LINEND);
sb.append(entry.getValue());
sb.append(LINEND);
}
count = count + sb.toString().getBytes().length;
if (files != null) {
for (Map.Entry<String, File> file : files.entrySet()) {
if (!file.getValue().exists()) {
continue;
}
count = count + file.getValue().length();
StringBuilder sb1 = new StringBuilder();
sb1.append(PREFIX);
sb1.append(BOUNDARY);
sb1.append(LINEND);
sb1.append("Content-Disposition: form-data; name=\"" + file.getKey() + "\"; filename=\"" + file.getValue().getName() + "\"" + LINEND);
sb1.append("Content-Type: image/pjpeg; " + LINEND);
sb1.append(LINEND);
count = count + sb1.toString().getBytes().length;
count = count + LINEND.getBytes().length;
}
byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes();
count = count + end_data.length;
}
return (int) count;
}
}