android 从okHttp的简单使用到理解

OkHttp是一个处理网络请求的开源项目,一个网络请求框架。

优点:

1.支持http请求,https请求。
2.支持文件下载、加载图片。
3.支持get,post请求。
4.基于Http的文件上传。

缺点:

1.callback回来是在子线程里面, 不能刷新UI,需要我们手动处理。
2.封装比较麻烦。

使用方式:

1.添加依赖

implementation 'com.squareup.okhttp3:okhttp:3.8.1'

2 请求

2.1.get请求
1.同步get请求

        String url = "http://wwww.baidu.com";
        OkHttpClient okHttpClient = new OkHttpClient();
        //默认get请求 可以省略
        Request request = new Request.Builder()
                .url(url)
                .get()
                .build();
        Call call = okHttpClient.newCall(request);
        try {
            Response response = call.execute();
        } catch (IOException e) {
            e.printStackTrace();
        } 

因为是同步方式(耗时操作) 不要在主线程执行耗时操作 改进代码:

  String url = "http://wwww.baidu.com";
  OkHttpClient okHttpClient = new OkHttpClient();
  //默认get请求 可以省略
  Request request = new Request.Builder().url(url).get().build();
  Call call = okHttpClient.newCall(request);
  new Thread(new Runnable() {
       @Override
        public void run() {
           try {
               Response response = call.execute();
           } catch (IOException e) {
               e.printStackTrace();
           }
        }
  }).start();

2.异步get请求

        String url = "http://wwww.baidu.com";
        OkHttpClient okHttpClient = new OkHttpClient();
        //默认get请求,可以省略
        Request request = new Request.Builder()
                .url(url)
                .get()
                .build();
        Call call = okHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.d(TAG, "onFailure: ");
            }
            @Override
            public void onResponse(Call call, Response response) throws IOException {
                Log.d(TAG, "onResponse: " + response.body().string());
            }
        });

call.execute 同步方式
call.enqueue 异步方式

2.2 post请求
get把参数包含在url中,post通过request body传递参数
在构造Request对象时,需要多构造一个RequestBody对象,用它来携带我们要提交的数据.


image.png

构造 RequestBody 需要指定MediaType,用于描述请求/响应 body 的内容类型

1.RequestBody--json数据提交

    //MediaType  设置Content-Type 标头中包含的媒体类型值
    public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
    
    String json="****";//json字符串数据
    Request request = new Request.Builder()
              .url(url)
              .post(RequestBody.create(JSON,json))
              .build();

2.FormBody--表单数据提交

       FormBody formBody = new FormBody.Builder()
                .add("id", "001")
                .add("name", "张三")
                .build();
        Request request=new Request.Builder().url(netUrl).post(formBody).build();

3.MultipartBody--文件上传

        MediaType mediaType = MediaType.parse("text/x-markdown; charset=utf-8");
    //上传文件
    public void uoloadFile(String localPath){
        String url = "http://wwww.baidu.com";
        OkHttpClient okHttpClient = new OkHttpClient();
        File file = new File(localPath);
        Request request = new Request.Builder()
                .url(url)
                .post(RequestBody.create(mediaType, file))
                .build();
        okHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.d(TAG, "onFailure: " + e.getMessage());
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                Log.d(TAG, "onResponse: " + response.body().string());
            }
        });
    }

你可能感兴趣的:(android 从okHttp的简单使用到理解)