okhttp3使用详解

okhttp是一个处理网络请求的开源项目,是安卓端最火热的轻量级框架,由移动支付Square公司开发。今天主要讲解下okhttp3的使用和实战。

首先okttp3的github官方地址是:https://square.github.io/okhttp

3.x以上api文档地址是:https://square.github.io/okhttp/3.x/okhttp/

android studio需要先引入相关依赖:

 

在build.gradle文件dependencies里面引入:implementation 'com.squareup.okhttp3:okhttp:3.10.0'

一、okhttp3的使用:

    okhttp3使用起来非常简单:

    get方式:

try {
            // 初始化 OkHttpClient
            OkHttpClient client = new OkHttpClient();
            // 初始化请求体
            Request request = new Request.Builder().get().url(url).build();
            // 得到返回Response
            Response response = client.newCall(request).execute();
            // 得到返回数据
            Log.i(TAG, "body="+response.body().string());
        } catch (IOException e) {
            e.printStackTrace();
        }

     post方式:

try {
            // 初始化 OkHttpClient
            OkHttpClient client = new OkHttpClient();
            //请求参数体
            RequestBody requestBody = new FormBody.Builder().add("name","张三").add("age","20").build();
            // 初始化请求体
            Request request = new Request.Builder().post(requestBody).url(url).build();
            // 得到返回Response
            Response response = client.newCall(request).execute();
            // 得到返回数据
            Log.i(TAG, "body="+response.body().string());
        } catch (IOException e) {
            e.printStackTrace();
        }    

   那么Json格式和文件格式的参数我们怎么上传呢?

   实际上我们只需要修改上传的请求参数体即可

//json格式:注:jsonString 为json格式的字符串参数
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"),jsonString);
// 文件格式:注:file为上传文件,"application/octet-stream" 即指定为二进制流,不知道具体下载文件类型
RequestBody requestBody = RequestBody.create(MediaType.parse("application/octet-stream; charset=utf-8"),file);

如果要同时上传文件和参数那就要用到MultipartBody

    //文件和混合参数请求
        MultipartBody.Builder body = new MultipartBody.Builder().setType(MultipartBody.FORM);
        //将字符串参数放入请求参数体body里面
        for(String key : params.keySet()){
            //addFormDataPart用来传入字符串参数
            body.addFormDataPart(key,params.get(key).toString());
        }
        //将文件参数放入请求参数体body里面
        for(String name : files.keySet()){
            RequestBody fileBody = RequestBody.create(FILE,files.get(name));
            //addPart用来传入文件参数
            body.addPart(Headers.of("Content-Disposition", "form-data; name=\""+name+"\";filename=\""+files.get(name).getName()+"\""),fileBody);
        }

下面将我封装的okhttp3的简单工具类贴上:

package com.lx.utils.util;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.concurrent.TimeUnit;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Headers;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

/**
 * Created by lixiao2 on 2018/4/27.
 */

public class OKHttpUtils {
    public static final String POST = "post";
    public static final String GET = "get";
    //使用JSON数据格式请求
    public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
    //文件请求格式
    public static final MediaType FILE = MediaType.parse("application/octet-stream");
    //设置连接超时时间 秒为单位 在OkHttpClient中设置单位
    public static final int CONNECT_TIMEOUT = 15;
    //设置读取超时时间 秒为单位 在OkHttpClient中设置单位
    public static final int READ_TIMEOUT = 15;
    //设置写入超时时间 秒为单位 在OkHttpClient中设置单位
    public static final int WRITE_TIMEOUT = 15;

    //请求回调
    public interface OKHttpCallBack{
        void success(String response);
        void fail();
    }

    /**
     * get请求方式
     * @param url 请求地址
     * @param method 请求方式 POST or GET
     * @param jsonParam 请求参数是JSON格式的字符串,POST方式的时候需要
     * @param callBack 请求回调
     */
    public static void doOKHttp(String url, String method, String jsonParam, final OKHttpCallBack callBack){
        //可设置请求相关参数 也可不设如:OkHttpClient client = new OkHttpClient();
        OkHttpClient client = new OkHttpClient().newBuilder().connectTimeout(CONNECT_TIMEOUT,TimeUnit.SECONDS).readTimeout(READ_TIMEOUT,TimeUnit.SECONDS).writeTimeout(WRITE_TIMEOUT,TimeUnit.SECONDS).build();
        //请求体
        Request request = null;
        if(POST.equals(method)){//POST方式
            // 设置为JSON格式的参数请求方式并且要与服务端一致。 默认请求参数方式如:RequestBody body = new FormBody.Builder().add("name","zhangsan").build();
            RequestBody body = RequestBody.create(JSON,jsonParam);
            //初始化请求体
            request = new Request.Builder().post(body).url(url).build();
        }else {//get方式
            //初始化请求体
            request = new Request.Builder().get().url(url).build();
        }
        //请求返回监听 另一只方式直接返回结果。如:Response response = client.newCall(request).execute();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {//失败
                callBack.fail();
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {//成功
                if(response.isSuccessful()) {
                    callBack.success(response.body().string());
                }else{
                    callBack.fail();
                }
            }
        });
    }

    /**
     * 带图片和参数的请求 必须为POST请求
     * @param url 请求地址
     * @param params 请求参数
     * @param files 请求参数 文件列表
     * @param callBack 请求回调
     */
    public static void doOKHttpFile(String url, HashMap params, HashMap files, final OKHttpCallBack callBack){
        OkHttpClient client = new OkHttpClient().newBuilder().readTimeout(READ_TIMEOUT,TimeUnit.SECONDS).writeTimeout(WRITE_TIMEOUT,TimeUnit.SECONDS).connectTimeout(CONNECT_TIMEOUT,TimeUnit.SECONDS).build();
        //文件和混合参数请求
        MultipartBody.Builder body = new MultipartBody.Builder().setType(MultipartBody.FORM);
        //将字符串参数放入请求参数体body里面
        for(String key : params.keySet()){
            //addFormDataPart用来传入字符串参数
            body.addFormDataPart(key,params.get(key).toString());
        }
        //将文件参数放入请求参数体body里面
        for(String name : files.keySet()){
            RequestBody fileBody = RequestBody.create(FILE,files.get(name));
            //addPart用来传入文件参数
            body.addPart(Headers.of("Content-Disposition", "form-data; name=\""+name+"\";filename=\""+files.get(name).getName()+"\""),fileBody);
        }
        //将数据放入请求头里面
        Request request = new Request.Builder().post(body.build()).url(url).build();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                callBack.fail();
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if(response.isSuccessful()) {
                    callBack.success(response.body().string());
                }else{
                    callBack.fail();
                }
            }
        });
    }

    /**
     * 下载图片 默认GET方式
     * @param url 图片地址
     */
    public static Bitmap downloadFile(Context context, String url){
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder().url(url).get().build();
        try {
            Response response = client.newCall(request).execute();
            InputStream input = response.body().byteStream();
            return BitmapFactory.decodeStream(input);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

 

 

 

你可能感兴趣的:(okhttp3使用详解)