简单封装Http的Get和Post请求
2016-06-04 21:42
645 查看
虽然现在有许多成型的Http框架,比如OkHttp、Volley,但是有时候我们仅仅需要一个很简单的功能,比如仅需要一个Get和Post,那么我们用这些库就有种杀机用宰牛刀的感觉。于是就想着自己去封装一个简单的类来实现这部分功能。
以下是我的工具类:
因为我么的网络操作不可以在UI线程中执行,所以我们考虑在新线程中通过调用主线程的Handler把我们需要做的操作post到主线程中就可以了,我们进行一个简单的封装:
这个时候我们就可以在业务代码中进行调用(这个例子是百度CSDN这个关键词):
为了简单起见,我把参数用一个Map来封装,这样不仅代码看起来更加简介,使用的时候已能够很方便了!
以下是我的工具类:
public class HttpUtil { private HttpUtil() { } /** * get方法请求数据 * * @param url 请求地址 * @param params 请求参数 * @param callBack 回调接口 */ public static void get(final String url, final Map<String, String> params, final HttpResponseCallBack callBack) { if (callBack != null) { new Thread(new Runnable() { @Override public void run() { try { //拼装请求参数列表 final StringBuilder sb = new StringBuilder(64); if (params != null) { sb.append("?"); for (Map.Entry<String, String> entry : params.entrySet()) { sb.append(entry.getKey()); sb.append("="); sb.append(entry.getValue()); sb.append("&"); } sb.deleteCharAt(sb.length() - 1); } //构建新连接 URL httpUrl = new URL(url + sb.toString()); LogUtil.i(url + sb.toString()); HttpURLConnection conn = (HttpURLConnection) httpUrl.openConnection(); conn.setConnectTimeout(3000); conn.setReadTimeout(3000); conn.setRequestMethod("GET"); BufferedReader br = new BufferedReader( new InputStreamReader(conn.getInputStream(), "UTF-8")); //接受返回数据 sb.setLength(0); String strTemp; while ((strTemp = br.readLine()) != null) { sb.append(strTemp).append('\n'); } conn.disconnect(); AsyncRun.run(new Runnable() { @Override public void run() { callBack.onSuccess(sb.toString()); } }); } catch (final IOException e) { AsyncRun.run(new Runnable() { @Override public void run() { callBack.onFailure("失败信息:", e); } }); } } }).start(); } } /** * post方法请求数据 * * @param url 请求地址 * @param params 请求参数 * @param callBack 回调地址 */ public static void post(final String url, final Map<String, String> params, final HttpResponseCallBack callBack) { if (callBack != null) { new Thread(new Runnable() { @Override public void run() { try { final StringBuilder sb = new StringBuilder(64); URL httpUrl = new URL(url); HttpURLConnection conn = (HttpURLConnection) httpUrl.openConnection(); conn.setConnectTimeout(3000); conn.setReadTimeout(3000); conn.setRequestMethod("POST"); conn.setDoOutput(true); //拼装请求参数列表 if (params != null) { for (Map.Entry<String, String> entry : params.entrySet()) { sb.append(entry.getKey()); sb.append("="); sb.append(entry.getValue()); sb.append("&"); } sb.deleteCharAt(sb.length() - 1); conn.getOutputStream().write(sb.toString().getBytes()); } BufferedReader br = new BufferedReader( new InputStreamReader(conn.getInputStream(), "UTF-8")); //接受返回数据 sb.setLength(0); String strTemp; while ((strTemp = br.readLine()) != null) { sb.append(strTemp).append('\n'); } conn.disconnect(); AsyncRun.run(new Runnable() { @Override public void run() { callBack.onSuccess(sb.toString()); } }); } catch (final IOException e) { AsyncRun.run(new Runnable() { @Override public void run() { callBack.onFailure("失败信息:", e); } }); } } }).start(); } } /** * 获取回调 */ public interface HttpResponseCallBack { void onSuccess(String result); void onFailure(String result, Exception e); } }
因为我么的网络操作不可以在UI线程中执行,所以我们考虑在新线程中通过调用主线程的Handler把我们需要做的操作post到主线程中就可以了,我们进行一个简单的封装:
public final class AsyncRun { public static void run(Runnable runnable){ Handler handler = new Handler(Looper.getMainLooper()); handler.post(runnable); } }
这个时候我们就可以在业务代码中进行调用(这个例子是百度CSDN这个关键词):
HashMap<String, String> request = new HashMap<>(2); map.put("ie", "UTF-8"); map.put("wd", "CSDN"); HttpUtil.post("https://www.baidu.com/s", request, new HttpUtil.HttpResponseCallBack() { @Override public void onSuccess(String result) { Log.i("TAG", result); //这里已经实在主线程中运行了 //所以完全可以直接调用TextView之类的控件来显示我们的回调内容 } @Override public void onFailure(String result, Exception e) { Log.i("TAG", </span>result + e.toString()); } });
为了简单起见,我把参数用一个Map来封装,这样不仅代码看起来更加简介,使用的时候已能够很方便了!
相关文章推荐
- 基于深度学习的目标检测研究进展
- Android多媒体学习:播放网络上的视频
- 手机开发实战61——TCP/IP协议简介
- C# HttpListener 开发服务器示例
- TCP/IP的流量控制与拥塞控制机制
- 初探tcp和udp
- URLConnection类,HttpURLConnection类的使用和总结
- Java中的网络支持
- TCP三次握手和四次挥手
- Linux下的TCP/IP编程----IO复用及IO复用服务端
- Java 网络IO编程总结(BIO、NIO、AIO均含完整实例代码)
- IOS TCP通讯
- AsyncHttpClient 登录 Application Fragment 回调 监听 软键盘
- Retrofit分析与实现
- AsyncHttpClient httpURLCon httpClient AsyncTask 访问服务器
- 网络交互——实现从服务器获取文件(例如:图片)
- linux select()详解( 三)-- TCP最简实例
- In Gradle projects, always use http://schemas.android.com/apk/res-auto for custom attributes
- WebApi接口安全认证——HTTP之摘要认证
- 使用 acl 编写 UDP 网络程序(UDP 重传及可靠性机制)