您的位置:首页 > 理论基础 > 计算机网络

Util工具类 URLConnectionUtil - 20141211 封装为访问网络框架

2014-05-08 13:46 176 查看
输入访问地址和参数 返回流

/**
* 参考 [http://blog.csdn.net/chenlaic/article/details/6208292]
*/
public class URLConnectionUtil {

private static final String TAG = "URLConnectionUtil";

private static final String POST = "POST";
private static final String GET = "GET";
private static final String DELETE = "DELETE";
private static final String PUT = "PUT";

private static String prepareParam(Map<String, Object> paramMap) {
StringBuffer sb = new StringBuffer();
if (paramMap == null || paramMap.isEmpty()) {
return "";
} else {
for (String key : paramMap.keySet()) {
String value = (String) paramMap.get(key);
if (sb.length() < 1) {
sb.append(key).append("=").append(value);
} else {
sb.append("&").append(key).append("=").append(value);
}
}
return sb.toString();
}
}

public static InputStream doPost(String urlStr, Map<String, Object> paramMap) throws Exception {
URL url = new URL(urlStr);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod(POST);
String paramStr = prepareParam(paramMap);
conn.setDoInput(true);
conn.setDoOutput(true);
OutputStream os = conn.getOutputStream();
os.write(paramStr.toString().getBytes("utf-8"));
os.close();

return conn.getInputStream();
}

public static InputStream doGet(String urlStr, Map<String, Object> paramMap) throws Exception {
String paramStr = prepareParam(paramMap);
if (paramStr != null && paramStr.trim().length() > 0) {
urlStr += "?" + paramStr;
}
URL url = new URL(urlStr);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod(GET);
conn.setRequestProperty("Content-Type", "text/html; charset=UTF-8");

conn.connect();
return conn.getInputStream();
}

public static InputStream doPut(String urlStr, Map<String, Object> paramMap) throws Exception {
URL url = new URL(urlStr);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod(PUT);
String paramStr = prepareParam(paramMap);
conn.setDoInput(true);
conn.setDoOutput(true);
OutputStream os = conn.getOutputStream();
os.write(paramStr.toString().getBytes("utf-8"));
os.close();
return conn.getInputStream();
}

public static void doDelete(String urlStr, Map<String, Object> paramMap) throws Exception {
String paramStr = prepareParam(paramMap);
if (paramStr != null && paramStr.trim().length() > 0) {
urlStr += "?" + paramStr;
}
URL url = new URL(urlStr);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setRequestMethod(DELETE);
// shielding of code is wrong ,java.net.ProtocolException: HTTP method
// DELETE doesn't support output
/*
* OutputStream os = conn.getOutputStream();
* os.write(paramStr.toString().getBytes("utf-8")); os.close();
*/
if (conn.getResponseCode() == 200) {
Log.i(TAG, "doDelete() success");
} else {
Log.i(TAG, conn.getResponseCode() + "");
}
}

}


附送一个简单的流变字符串工具类

package com.example.demo.util;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import android.util.Log;

public class StreamUtil {

private static final String TAG = "StreamUtil";

public static String inputStreamToString(InputStream inputStream) {
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
String result = "";
try {
String line;
while ((line = br.readLine()) != null) {
result += "/n" + line;
}
br.close();
result = result.substring("/n".length());
} catch (IOException e) {
e.printStackTrace();
}
Log.i(TAG, "inputStreamToString() result:" + result);
return result;
}
}


完成!

2014-08-4-04 改进一下

public class HttpClient {

private static final String TAG = "HttpClient";

public static final String GET = "GET";
public static final String POST = "POST";
public static final String UTF_8 = "UTF-8";
public static final String httpStatusCode = "httpStatusCode";
public static final int ConnectTimeout = 30 * 1000;
public static final int ReadTimeout = 30 * 1000;

public static String post(String reqURL, Map<String, String> params)
throws Exception {
HttpURLConnection conn = null;
OutputStream out = null;
InputStream in = null;
try {
URL url = new URL(reqURL);
conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod(POST);
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setConnectTimeout(ConnectTimeout);
conn.setReadTimeout(ReadTimeout);

byte[] data = convertParams(params).getBytes(UTF_8);
if (data.length > 0) {
out = conn.getOutputStream();
out.write(data);
out.flush(); // 清空缓冲区,发送数据
}

int tatusCode = conn.getResponseCode();
if (tatusCode == 200) {
in = conn.getInputStream();
return Utils.inputStreamToString(in);
} else {
return httpStatusCode + tatusCode;
}
} catch (Exception e) {
Log.i(TAG, e.getMessage());
throw new Exception("HttpClient post Exception");
} finally {
if (out != null) {
try {
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if (in != null) {
try {
in.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if (conn != null) {
conn.disconnect();
conn = null;
}
}
}

public static String get(String reqURL, Map<String, String> params)
throws Exception {
HttpURLConnection conn = null;
OutputStream out = null;
InputStream in = null;
try {
String data = convertParams(params);
if (data.length() > 0)
reqURL = reqURL + "?" + data;
URL url = new URL(reqURL);
conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod(GET);
conn.setRequestProperty("Content-Type", "text/html; charset="
+ UTF_8);
conn.setConnectTimeout(ConnectTimeout);
conn.setReadTimeout(ReadTimeout);

conn.connect();

int statusCode = conn.getResponseCode();
if (statusCode == 200) {
in = conn.getInputStream();
return Utils.inputStreamToString(in);
} else {
return httpStatusCode + statusCode;
}
} catch (Exception e) {
Log.i(TAG, e.getMessage());
throw new Exception("HttpClient get Exception");
} finally {
if (out != null) {
try {
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if (in != null) {
try {
in.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if (conn != null) {
conn.disconnect();
conn = null;
}
}
}

private static String convertParams(Map<String, String> params) {
if (params == null || params.isEmpty())
return "";
StringBuffer sb = new StringBuffer();
for (String key : params.keySet()) {
if (sb.length() > 1)
sb.append("&");
sb.append(key).append("=").append(params.get(key));
}
return sb.toString();
}

}


2014-12-11 封装成自己的一个联网框架。 也许有些问题 ,高手帮忙看看

/**
* @author wangpeng
*
*/
public class HttpClient {

private static final String TAG = HttpClient.class.getSimpleName();

public static final String GET = "GET";
public static final String POST = "POST";
public static final String UTF_8 = "UTF-8";
public static final String httpStatusCode = "httpStatusCode";
public static final int ConnectTimeout = 20 * 1000;
public static final int ReadTimeout = 20 * 1000;

public static String post(String reqURL, Map<String, String> params) {
HttpURLConnection conn = null;
BufferedOutputStream out = null;
BufferedInputStream in = null;
try {
URL url = new URL(reqURL);
conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod(POST);
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setConnectTimeout(ConnectTimeout);
conn.setReadTimeout(ReadTimeout);

byte[] data = convertParams(params).getBytes(UTF_8);
if (data.length > 0) {
out = new BufferedOutputStream(conn.getOutputStream(), 8 * 1024);
out.write(data);
out.flush(); // clear cache, send data
}

int statusCode = conn.getResponseCode();
if (statusCode == 200) {
in = new BufferedInputStream(conn.getInputStream(), 8 * 1024);
return BaseUtils.inputStreamToString(in);
} else {
return httpStatusCode + statusCode;
}
} catch (Exception e) {
Log.i(TAG, e.getMessage());
throw new RuntimeException("HttpClient post Exception");
} finally {
if (conn != null)
conn.disconnect();
try {
if (in != null)
in.close();
if (out != null)
out.close();
} catch (Exception e) {
e.printStackTrace();
}

}
}

public static String get(String reqURL, Map<String, String> params) {
HttpURLConnection conn = null;
BufferedInputStream in = null;
try {
String data = convertParams(params);
if (data.length() > 0)
reqURL = reqURL + "?" + data;
URL url = new URL(reqURL);
conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod(GET);
conn.setRequestProperty("Content-Type", "text/html; charset="
+ UTF_8);
conn.setConnectTimeout(ConnectTimeout);
conn.setReadTimeout(ReadTimeout);

conn.connect();

int statusCode = conn.getResponseCode();
if (statusCode == 200) {
in = new BufferedInputStream(conn.getInputStream(), 8 * 1024);
return BaseUtils.inputStreamToString(in);
} else {
return httpStatusCode + statusCode;
}
} catch (Exception e) {
Log.i(TAG, e.getMessage());
throw new RuntimeException("HttpClient get Exception");
} finally {
if (conn != null)
conn.disconnect();
try {
if (in != null)
in.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}

private static String convertParams(Map<String, String> params) {
if (params == null || params.isEmpty())
return "";
StringBuffer sb = new StringBuffer();
for (String key : params.keySet()) {
if (sb.length() > 1)
sb.append("&");
sb.append(key).append("=").append(params.get(key));
}
return sb.toString();
}

}
/**
* @author wangpeng
*/
public class HttpManager {

private Activity activity;
private ExecutorService executor;

public HttpManager(final Activity activity) {
this.activity = activity;
this.executor = Executors.newSingleThreadExecutor();
}

public void request(final String method, final String url,
final Map<String, String> params, final Listener listener,
final ErrorListener errorListener, final boolean useDiskCache) {
LogUtils.logd("request:\n" + "url:" + url + ",params:" + params);
executor.execute(new Runnable() {
@Override
public void run() {
try {
if (useDiskCache) {
final InputStream in = DiskLruCacheUtils.get(activity,
DiskLruCacheUtils.object, url + params);

if (in != null) {
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
String cacheResult = BaseUtils
.inputStreamToString(in);
listener.onResponse(cacheResult);
}
});
}
}

final String result = method.equals(HttpClient.POST) ? HttpClient
.post(url, params) : HttpClient.get(url, params);
// receive success
if (!result.contains(HttpClient.httpStatusCode)) {
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
LogUtils.logd("response:\n" + result);
listener.onResponse(result);
}
});

if (useDiskCache)
DiskLruCacheUtils
.save(activity,
DiskLruCacheUtils.object,
url + params,
new ByteArrayInputStream(result
.getBytes()));
} else {
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
LogUtils.loge("http error for service [url:" + url
+ ",params:" + params + "]");
errorListener.onError();
}
});

}
} catch (Exception e) {
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
LogUtils.loge("http error for net [url:" + url
+ ",params:" + params + "]");
errorListener.onError();
}
});
}
}
});
}

public void stop() {
shutdownAndAwaitTermination();
}

public interface Listener {
void onResponse(String response);
}

public interface ErrorListener {
void onError();
}

private void shutdownAndAwaitTermination() {
// Disable new tasks from being submitted
executor.shutdown();
try {
// Wait a while for existing tasks to terminate
if (!executor.awaitTermination(60, TimeUnit.SECONDS)) {
executor.shutdownNow(); // Cancel currently executing tasks
// Wait a while for tasks to respond to being cancelled
if (!executor.awaitTermination(60, TimeUnit.SECONDS))
System.err.println("Pool did not terminate");
}
} catch (InterruptedException ie) {
// (Re-)Cancel if current thread also interrupted
executor.shutdownNow();
// Preserve interrupt status
Thread.currentThread().interrupt();
}
}
}


/**
* @author wangpeng
*/
public class HttpUtils {

public boolean useDiskCahce = true;

private Activity activity;
private ErrorListener errorListener;

private HttpUtils() {
}

public static HttpUtils init(Activity activity, ErrorListener errorListener) {
HttpUtils httpUtils = new HttpUtils();
httpUtils.activity = activity;
httpUtils.errorListener = errorListener;
return httpUtils;
}

public void post(String url, final Map<String, String> params,
final Listener listener) {
if (activity == null) {
throw new IllegalArgumentException(
"activity has not init in http utils");
}

HttpManager manager = new HttpManager(activity);

manager.request(HttpClient.POST, url, params, listener, errorListener,
useDiskCahce);
}

public void get(String url, final Map<String, String> params,
final Listener listener) {
if (activity == null) {
throw new IllegalArgumentException(
"activity has not init in http utils");
}

HttpManager manager = new HttpManager(activity);

manager.request(HttpClient.GET, url, params, listener, errorListener,
useDiskCahce);
}
}


使用方法:活动里面

HttpUtils httpUtils = HttpUtils.init(this, this); (@1)



String a= "http://www.baidu.com";

Map<String, String> params = BaseUtils.initMap("key1","value1","key2", value2);



httpUtils.post(a, params, new Listener() {

@Override

public void onResponse(String response) {

text.setText(response);

}

});



这样就可以了。先秒返回一次缓存(上次查询的数据),过几秒再返回一次联网查询数据。

@1 这行代码建议在BaseActivity里面初始化,BaseActivity可以统一实现联网失败回调.

缓存工具类 参考 郭林哥的。 http://blog.csdn.net/guolin_blog/article/details/28863651
最后补充本人一直使用的BaseUtils。

package com.example.f.demo.utils;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;

import android.graphics.Bitmap;
import android.os.Environment;

public class BaseUtils {
/**
* 根据传入参数,以key对应value的形式初始化一个hashmap对象
*
* @param <T>
*/
public static Map<String, String> initMap(Object... params) {
if (params == null || params.length < 1 || params.length % 2 != 0)
return null;
Map<String, String> map = new HashMap<String, String>();
for (int i = 0; i < params.length; i = i + 2)
map.put(String.valueOf(params[i]), String.valueOf(params[i + 1]));
return map;
}

public static boolean hasSDCard() {
return Environment.MEDIA_MOUNTED.equals(Environment
.getExternalStorageState());
}

public static String inputStreamToString(InputStream in) {
StringBuffer out = new StringBuffer();
byte[] b = new byte[8 * 1024];
try {
for (int n; (n = in.read(b)) != -1;) {
out.append(new String(b, 0, n));
}
} catch (IOException e) {
e.printStackTrace();
}
return out.toString();
}

public static boolean inputStreamToOutputStream(InputStream input,
OutputStream output) {
BufferedOutputStream out = null;
BufferedInputStream in = null;
in = new BufferedInputStream(input, 8 * 1024);
out = new BufferedOutputStream(output, 8 * 1024);
int b;
try {
while ((b = in.read()) != -1) {
out.write(b);
}
return true;
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (out != null)
out.close();
if (in != null)
in.close();
} catch (final IOException e) {
e.printStackTrace();
}
}
return false;
}

public static InputStream bitmapToInputStream(Bitmap bitmap) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
InputStream sbs = new ByteArrayInputStream(baos.toByteArray());
return sbs;
}

public static InputStream byteToInputStream(byte[] bytes) {
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
return bais;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: