OKHttp的简单使用

jopen 8年前

一方面,最近关于OKHttp的讨论甚嚣尘上,另一方面,我最近也更新了android6.0,发现在6.0中HttpClient不能使用了,于是决定抽时间也看一下OKHttp,总结了一点东西,与大家分享。

以前读书的时候在学校用过GitHub上的一个开源控件AsyncHttpClient,当时解决了不少问题,上传图片以及download都能实现,感觉还不错,这次看完OKHttp,暂未发现两者在功能上的差异(如果哪位小伙伴发现了可以告诉我一下)。

官网对OKHttp的介绍还是比较详细,英文好的同学可以直接看官网的内容。使用OKHttp我们就需要OKHttp的jar包,同时由于OKHttp依赖于Okio,我们也需要下载Okio的jar包。这两个准备工作做好了就可以开始了。


一、发送Get请求

Request是OKHttp访问的请求,Callback是回调,有两种调用方式,一种是call.execute,这种方式不会开启新的线程,要在android中使用这个需要自己开启一个新线程,然后在线程中调用这个东西,这样反而麻烦了,所以个人推荐使用 call.enqueue,call.enqueue会开启一个新的线程,在新线程中调用网络请求。这样的话我们就得通过Handler来与 android UI交互了。

      okHttpClient = new OkHttpClient();          request = new Request.Builder().url(HTTPURL).build();          Call call = okHttpClient.newCall(request);          // 开启异步线程访问网络          call.enqueue(new Callback() {                @Override              public void onResponse(Response response) throws IOException {                  String res = response.body().string();                  Message msg = new Message();                  msg.what = REFRESHDATA;                  msg.obj = res;                  mHandler.sendMessage(msg);              }                @Override              public void onFailure(Request arg0, IOException arg1) {                }          });

二、发送POST请求

发送POST请求,一种是提交JSON数据:

MediaType JSON = MediaType.parse("application/json; charset=utf-8");          RequestBody body = RequestBody.create(JSON,                  "{\"username\":\"lisi\",\"nickname\":\"李四\"}");          Request request = new Request.Builder().url(HTTPURL).post(body).build();          //后面的调用与GET相同

还有一种是提交键值对:

RequestBody formBody = new FormEncodingBuilder()                  .add("username", "lisi").add("nickname", "李四").build();          Request request = new Request.Builder().url(HTTPURL).post(formBody)                  .build();

总结

其实OKHttp相对于HttpURLConnection已经简单了许多,但是我还是觉得麻烦,而且官方亦不建议我们创建多个OkHttpClient实例,于是又对它进行了一层简单的封装。

import java.io.IOException;  import java.util.Map;  import java.util.Set;  import java.util.concurrent.TimeUnit;    import com.squareup.okhttp.Callback;  import com.squareup.okhttp.OkHttpClient;  import com.squareup.okhttp.Request;  import com.squareup.okhttp.Response;    /**   * OKHttp封装工具类   *    * @author wangsong   *    *         2015-10-9   */  public class OKHttpUtils {        private final static OkHttpClient M_OK_HTTP_CLIENT = new OkHttpClient();      static {          M_OK_HTTP_CLIENT.setConnectTimeout(30, TimeUnit.SECONDS);      }        /**       * 不开启异步线程       *        * @author wangsong 2015-10-9       * @param request       * @return       * @throws IOException       */      public static Response execute(Request request) throws IOException {          return M_OK_HTTP_CLIENT.newCall(request).execute();      }        /**       * 开启异步线程访问,访问结果自行处理       *        * @author wangsong 2015-10-9       * @param request       * @param responseCallback       */      public static void enqueue(Request request, Callback responseCallback) {          M_OK_HTTP_CLIENT.newCall(request).enqueue(responseCallback);      }      /**       * 开启异步线程访问,不对访问结果进行处理       *        * @author wangsong 2015-10-9       * @param request       * @param responseCallback       */      public static void enqueue(Request request) {          M_OK_HTTP_CLIENT.newCall(request).enqueue(new Callback() {                @Override              public void onResponse(Response arg0) throws IOException {              }                @Override              public void onFailure(Request arg0, IOException arg1) {              }          });      }        /**       * 为HttpGet请求拼接一个参数       *        * @author wangsong 2015-10-9       * @param url       * @param name       * @param value       */      public static String jointURL(String url, String name, String value) {          return url + "?" + name + "=" + value;      }        /**       * 为HttpGet请求拼接多个参数       *        * @author wangsong 2015-10-9       * @param url       * @param name       * @param value       */      public static String jointURL(String url, Map<String, String> values) {          StringBuffer result = new StringBuffer();          result.append(url).append("?");          Set<String> keys = values.keySet();          for (String key : keys) {              result.append(key).append("=").append(values.get(key)).append("&");          }          return result.toString().substring(0, result.toString().length()-1);      }    }

本文涉及到的工具类下载地址https://github.com/lenve/OKHttpUtils