美文网首页
Android OkHttp学习

Android OkHttp学习

作者: 一期一会la | 来源:发表于2018-08-01 16:21 被阅读14次

前言

各种各样的网络框架,每次都是上网随便一搜,然后照着写一写最简单的用法,然后下次又遇到需要网络请求的时候,又忘记怎么用了。。。好无奈。所以在这里仔细记录一下,能加深印象和理解。

本文主要讲解的有以下知识点

  • get请求
  • post请求
  • 基于Http的文件上传
  • 文件下载
  • 加载图片
  • 支持请求回调,直接返回对象,对象集合
  • 支持session的保持

使用

老规矩,添加依赖
compile 'com.squareup.okhttp:okhttp:2.4.0'
而因为okhttp内部依赖okio,所以:
compile 'com.squareup.okio:okio:1.5.0'

一.Http Get

1.创建okHttpClient对象
2.构造Request对象(参数至少有url,可以通过Requesr.Builder设置更多的参数)
3.newCall(request),将request对象传入,去构造得到Call对象。也就是将你的请求封装成了任务,既然是,就有cancelexecute方法。
4.请求加入调度,enqueue,在回调者中处理请求结果。

//创建okHttpClient对象
OkHttpClient mOkHttpClient = new OkHttpClient();
//创建一个Request
final Request request = new Request.Builder()
                .url("https://github.com/hongyangAndroid")
                .build();
//new call
Call call = mOkHttpClient.newCall(request); 
//请求加入调度
call.enqueue(new Callback()
        {
            @Override
            public void onFailure(Request request, IOException e)
            {
            }

            @Override
            public void onResponse(final Response response) throws IOException
            {
                    //String htmlStr =  response.body().string();
            }
        });      

我们这里是异步的方式去执行,当然也支持阻塞的方式,上面我们也说了Call有一个execute()方法,你也可以直接调用call.execute()通过返回一个Response。

注意:在这里onResponse,并不是运行在UI线程。返回的response可以转化为:
字符串:response.body().string()
二进制字节数组:response.body().bytes()
输入流(读)inputsream:response.body().byteStream()

二.Http Post携带参数

Post与Get主要是Request的构造不同。通过FormEncodingBuilder,添加多个String键值对,然后去构造RequestBody,最后完成Request的构造。

FormEncodingBuilder builder = new FormEncodingBuilder();   
builder.add("username","一期一会");

Request request = new Request.Builder()
                   .url(url)
                .post(builder.build())
                .build();
 mOkHttpClient.newCall(request).enqueue(new Callback(){});

Post提交json数据

public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
OkHttpClient client = new OkHttpClient();
String post(String url, String json) throws IOException {
     RequestBody body = RequestBody.create(JSON, json);
      Request request = new Request.Builder()
      .url(url)
      .post(body)
      .build();
      Response response = client.newCall(request).execute();
    f (response.isSuccessful()) {
        return response.body().string();
    } else {
        throw new IOException("Unexpected code " + response);
    }
}

POST提交键值对

OkHttpClient client = new OkHttpClient();
String post(String url, String json) throws IOException {
 
     RequestBody formBody = new FormEncodingBuilder()
    .add("platform", "android")
    .add("name", "bug")
    .add("subject", "XXXXXXXXXXXXXXX")
    .build();
 
      Request request = new Request.Builder()
      .url(url)
      .post(formBody)
      .build();
 
      Response response = client.newCall(request).execute();
    if (response.isSuccessful()) {
        return response.body().string();
    } else {
        throw new IOException("Unexpected code " + response);
    }
}

基于Http的文件上传

先介绍一个可以构造RequestBody的Builder,叫做MultipartBuilder(可用于表单上传
如果想向服务端上传一个键值对username:hy和一个文件,怎么写?看以下代码:

File file = new File(Environment.getExternalStorageDirectory(), "balabala.mp4");

RequestBody fileBody = RequestBody.create(MediaType.parse("application/octet-stream"), file);

RequestBody requestBody = new MultipartBuilder()
     .type(MultipartBuilder.FORM)
     .addPart(Headers.of(
          "Content-Disposition", 
              "form-data; name=\"username\""), 
          RequestBody.create(null, "张鸿洋"))
     .addPart(Headers.of(
         "Content-Disposition", 
         "form-data; name=\"mFile\"; 
         filename=\"wjd.mp4\""), fileBody)
     .build();

Request request = new Request.Builder()
    .url("http://192.168.1.103:8080/okHttpServer/fileUpload")
    .post(requestBody)
    .build();

Call call = mOkHttpClient.newCall(request);
call.enqueue(new Callback()
{
    //...
});

下载文件/下载图片

文件和图片区别就是在得到response.body,如何转换。文件一般是拿到inputStream做写文件操作,而图片是拿到byte[]然后decode成图片
同步Get
若返回的文件较小,可response.body.string,若文件较大,超过1mb,用流的方式来处理body.

private final OkHttpClient client = new OkHttpClient();
 
public void run() throws Exception {
    Request request = new Request.Builder()
        .url("http://publicobject.com/helloworld.txt")
        .build();
 
    Response response = client.newCall(request).execute();
    if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
 
    Headers responseHeaders = response.headers();
    for (int i = 0; i < responseHeaders.size(); i++) {
      System.out.println(responseHeaders.name(i) + ": " + responseHeaders.value(i));
    }
 
    System.out.println(response.body().string());
}

异步Get.
在一个工作线程中下载文件,当响应可读时回调Callback接口。读取响应时会阻塞当前线程。OkHttp现阶段不提供异步api来接收响应体。

private final OkHttpClient client = new OkHttpClient();
 
public void run() throws Exception {
    Request request = new Request.Builder()
        .url("http://publicobject.com/helloworld.txt")
        .build();
 
    client.newCall(request).enqueue(new Callback() {
      @Override public void onFailure(Request request, Throwable throwable) {
        throwable.printStackTrace();
      }
 
      @Override public void onResponse(Response response) throws IOException {
        if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
 
        Headers responseHeaders = response.headers();
        for (int i = 0; i < responseHeaders.size(); i++) {
          System.out.println(responseHeaders.name(i) + ": " + responseHeaders.value(i));
        }
 
        System.out.println(response.body().string());
      }
    });
}

封装

以上使用,代码都太多了有木有,而且还很难记住用法。
在这里推荐鸿洋大神写的OKhttpUtils工具类。挺好听的,减少了很多代码量,代码也简洁明了。
在as添加依赖即可使用该工具:
compile 'com.zhy:okhttputils:2.6.2'
或者直接添加jar包
嗯。。原来只能上传图片。。
那还是去这里下载吧:
https://github.com/hongyangAndroid/okhttputils
里面还有详细的使用步骤~

下面是我第一次使用okhttp,以表单的形式,同时提交键值对和图片。刚开始接触okhttp,看了很多博客,写出来的提交代码都不成功。后来用okhttpUtils解决了!

public static void uploadImage(String user, String path,String name, String seabillno,final Handler mHandler){
        Map<String, String> params = new HashMap<String, String>();
        params.clear();
        //键值对
        params.put("user",user);
        params.put("seabillno",seabillno);
        params.put("token","dylpda2018");

        File file=new File(path);
        OkHttpUtils.post()//
                .addFile("file", name, file)//图片
                .url(URL_UPLOAD_PICTURE)
                .params(params)//
                .build()//
                .execute(new StringCallback() {
                    @Override
                    public void onError(Call call, Exception e, int i) {

                    }

                    @Override
                    public void onResponse(String s, int i) {
                        System.out.println( "onSuccess: "+e);
                        Message message=Message.obtain();
                        message.what= Constants.UPLOAD_PIC_SUCCESS;
                        message.obj=s;
                        mHandler.sendMessage(message);
                        System.out.println(s);
                    }
                });


    }

参考文章:
https://blog.csdn.net/lmj623565791/article/details/47911083
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0106/2275.html

相关文章

  • ConnectionSpec

    OkHttp okhttp是Android 平台的网络请求框架,已经被Android吸收了。并且OkHttp很好的...

  • OKhttp

    okhttputils Android OkHttp完全解析 是时候来了解OkHttp了 Android Http...

  • Android OkHttp学习

    前言 各种各样的网络框架,每次都是上网随便一搜,然后照着写一写最简单的用法,然后下次又遇到需要网络请求的时候,又忘...

  • OkHttp的使用

    1、OkHttp的介绍 OkHttp 支持 Android 2.3 及以上版本Android平台, 对于 Java...

  • OkHttp基础学习(一),Get请求

    学习资料: 张鸿洋大神的Android OkHttp完全解析 是时候来了解OkHttp了 打算花段时间,系统性的学...

  • android okHttp的完全解析

    Android OkHttp完全解析 是时候来了解OkHttp了

  • OkHttp使用教程

    OkHttp使用教程 Android OkHttp官方教程解析-彻底入门OkHttp使用 How to ret...

  • Android网络框架

    Android OKHttp3.0 以上使用方法 Android OKHttp3.0 以上使用方法详解Retrof...

  • 彻底理解OkHttp - OkHttp 源码解析及OkHttp的

    OkHttp 现在统治了Android的网络请求领域,最常用的框架是:Retrofit+okhttp。OkHttp...

  • 图解OkHttp -- <一> OkHttp使用入门

    本文涉及源码均基于okhttp 3.14.9 OkHttp简介 OkHttp是Android开发最常用的网络请求框...

网友评论

      本文标题:Android OkHttp学习

      本文链接:https://www.haomeiwen.com/subject/ottrvftx.html