概述
HTTP访问网络工具类
现在git上有很多的http工具类向xutils,afinal等等,但是他们中有些功能不尽如人意,并且如果我们仅仅使用http这一小块功能就使用几M的java包,会使得我们的app很臃肿,我这里精简出了一个http访问网络的工具类(个人根据需求对其进行修改):
初步封装get 和post方法。
get方法初步封装
代码块语法遵循标准markdown代码,例如:
/**
* Get请求,获得返回数据
*
* @param urlStr
* @return
* @throws Exception
*/
public static String doGet(String urlStr, HashMap<String, String> headerMap) {
URL url = null;
HttpURLConnection conn = null;
InputStream is = null;
ByteArrayOutputStream baos = null;
try {
url = new URL(urlStr);
conn = (HttpURLConnection) url.openConnection();
//设置超时
conn.setReadTimeout(5000);
conn.setConnectTimeout(5000);
conn.setRequestMethod("GET");
//通用设置响
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("charset", "utf-8");
conn.setRequestProperty("connection", "Keep-Alive");
if (headerMap!=null){//判断是否需要填充请求头
for (Map.Entry<String, String> entry : headerMap.entrySet()) {
conn.setRequestProperty(entry.getKey(), entry.getValue());
}
}
if (conn.getResponseCode() == 200) {
is = conn.getInputStream();
baos = new ByteArrayOutputStream();
int len = -1;
byte[] buf = new byte[128];
while ((len = is.read(buf)) != -1) {
baos.write(buf, 0, len);
}
baos.flush();
return baos.toString();
} else {
throw new RuntimeException(" responseCode is not 200 ... ");
}
} catch (Exception e) {
//e.printStackTrace();
} finally {
try {
if (is != null)
is.close();
} catch (IOException e) {
}
try {
if (baos != null)
baos.close();
} catch (IOException e) {
}
conn.disconnect();
}
return null;
}
post初步封装
和get封装方式相近,文章最后会给出源码地址,,自己下载吧少年。
但是这还不是我们常用的封装类模式,下面我门在进行更深一步的封装
再度封装post和get方法的到同步和异步访问网络的方法
我们这里介绍一下异步封装的过程,我们简历线程使用的是RXJava中的观察者设计模式(这样可以保证OnRequestListener 的onOk和onFail方法在主线中运行),如果你不想导入Rxjava你可已自己建立线程(纯粹看个人喜好)。
异步封装
private static void requestAsyn(final String url, final HashMap<String,String> headerMap, final String param, final int type, final OnRequestListener listener) {
Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> arg0) {
if(TextUtils.isEmpty(url)) {//url不能为空
arg0.onNext(null);
} else {
String result = null;
if(type == 0) {//如果方式为get
result = HttpUtil.doGet(url,headerMap);
} else if(type == 1) {//如果方式为post
result = HttpUtil.doPost(url, headerMap, param);
}
if(result != null && !"".equals(result)) {//即如果不能为null或者""
if(!result.startsWith("{") && !result.startsWith("[")) {
//确保服务器返回数据为json,如果你的服务器不反悔json数据可以删掉此判断
//作此判断的原因就是路由器没有网络时,可能返回路由器登录页面,做成数据无法解析
//很多框架没有作此判断。。所以说别人的就是别人的,使用需谨慎
arg0.onNext(null);
} else {
arg0.onNext(result);
}
} else {
arg0.onNext(null);
}
}
arg0.onCompleted();
}
}).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Subscriber<String>() {
public void onCompleted() {
}
public void onError(Throwable arg0) {
}
public void onNext(String result) {
if(result == null) {
if(listener != null) {
listener.onFail();
}
} else if(listener != null) {
listener.onOk(result);
}
}
});
}
我们再次发现这还不符合我们常用的使用方法。。那我们只有在次进行封装了
最后的封装
也就是封装成get post格式了这就很简单了
/**
* 异步get访问网络
* @param url
* @param listener
*/
public static void getRequest( String url, OnRequestListener listener){
requestAsyn(url,null,null,GET,listener);
}
/**
* 异步get访问网络
* @param url
* @param headerMap 请求头数据
* @param listener
*/
public static void getRequest(String url, HashMap<String,String> headerMap, OnRequestListener listener){
requestAsyn(url,headerMap,null,GET,listener);
}
/**
* 异步post访问网络
* @param url
* @param param
* @param listener
*/
public static void postRequest(final String url, final String param, final OnRequestListener listener){
requestAsyn(url,null,param,POST,listener);
}
/**
* 异步post访问网络
* @param url
* @param headerMap 请求头数据
* @param param
* @param listener
*/
public static void postRequest(String url, HashMap<String,String> headerMap, String param, OnRequestListener listener) {
requestAsyn(url, headerMap, param, 1, listener);
}
最后
奉上源码地址。 —— [ http工具类];
第一次写这博客,有什么不好的地方请见谅, 后面计划封装udp tcp等等工具类,希望兄弟们支持一下
最后
以上就是英俊太阳为你收集整理的HTTP,UDP访问网络工具类HTTP访问网络工具类的全部内容,希望文章能够帮你解决HTTP,UDP访问网络工具类HTTP访问网络工具类所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复