Okhttp的基础使用

1.添加依赖:

 implementation("com.squareup.okhttp3:okhttp:4.9.0")

2.配置请求:

  • 2.1 GET请求:
  • GET 同步请求:
 //同步请求,请求时没回应,会阻塞
    public void getSync(View view) {
    OkHttpClient okHttpClient = new OkHttpClient();
        //网络请求必须在子线程执行
        new Thread(){
            @Override
            public void run() {
                //Request代表请求对象,会将域名,请求地址,参数封装
                //若是要在get后面直接加参数格式是在get后面加:?a=1&b=2
                Request request = new Request.Builder().url("https://www.httpbin.org/get?a=1&b=2").build();
                //准备好请求的Call对象
                Call call = okHttpClient.newCall(request);
                try {
                    Response response = call.execute();
                    Log.i(TAG, "getSync: "+response.body().string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }.start();
    }
  • GET异步请求:
 public void getAsync(View view) {
        OkHttpClient okHttpClient = new OkHttpClient();
        Request request = new Request.Builder().url("https://www.httpbin.org/get?a=1&b=2").build();
        //准备好请求的Call对象
        Call call = okHttpClient.newCall(request);
        //进行异步请求
        call.enqueue(new Callback() {
            @Override
            public void onFailure(@NotNull Call call, @NotNull IOException e) {

            }

            @Override
            public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
           //响应码 200~299成功,400~500服务器错误,跟服务器的通信是成功的都会回调这个函数,但是服务器处理请求的数据不一定成功
                if (response.isSuccessful()){
                    Log.i(TAG, "getAsync: "+response.body().string());
                }
            }
        });
    }
  • 2.2 POST请求:
  • POST同步请求:
   public void postSync(View view) {
        OkHttpClient okHttpClient = new OkHttpClient();
        //okhttp创建的request对象默认是get请求,如果是post要使用FormBody配合.post()设置
        //而POST请求要设置RequestBody
        new Thread(){
            @Override
            public void run() {
                FormBody formBody = new FormBody.Builder()
                        .add("a", "1")
                        .add("b", "2")
                        .build();
                Request request = new Request.Builder()
                        .url("https://www.httpbin.org/post")
                        .post(formBody)
                        .build();
                //准备好请求的Call对象
                Call call = okHttpClient.newCall(request);
                try {
                    Response response = call.execute();
                    Log.i(TAG, "PostSync: "+response.body().string());
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        }.start();
    }
  • POST异步请求:
 public void postAsync(View view) {
        OkHttpClient okHttpClient = new OkHttpClient();
        FormBody formBody = new FormBody.Builder()
                .add("a", "1")
                .add("b", "2")
                .build();
        Request request = new Request.Builder()
                .url("https://www.httpbin.org/post")
                .post(formBody)
                .build();
        //准备好请求的Call对象
        Call call = okHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(@NotNull Call call, @NotNull IOException e) {

            }

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

两者综合来看,request对应的是get请求,而formbody对应的是post请求

3.添加拦截器:

 public void interceptorTest(){
        //addInterceptor一定在前面执行,addNetworkInterceptor一定在后面执行
        //使用cache缓存
        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                //开启缓存
                .cache(new Cache(new File("C:\\Users\\Administrator\\Desktop\\cache"),1024*1024))
                .addInterceptor(new Interceptor() {
            @NotNull
            @Override
            public Response intercept(@NotNull Chain chain) throws IOException {
                //请求之前的前置处理,和请求之后的后置处理
                //例如请求前,添加平台,版本号
                //在请求前可以拿到这个request对象,再重新封装一个新的request,把平台信息和版本号封装进去,再发出去
                //拦截器可以添加多个,按照顺序来执行
                Request request = chain.request().newBuilder().addHeader("os", "android").addHeader("version", "1.1.0").build();
                Response response = chain.proceed(request);
                return response;
            }
        }).addNetworkInterceptor(new Interceptor() {
            @NotNull
            @Override
            public Response intercept(@NotNull Chain chain) throws IOException {
                System.out.println("version:"+chain.request().header("version"));
                return chain.proceed(chain.request());
            }
        }).build();

        Request request = new Request.Builder().url("https://www.httpbin.org/get?a=1&b=2").build();
        Call call = okHttpClient.newCall(request);
        try {
            Response response = call.execute();
            System.out.println(response.body().string());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

4.文件上传:

public void uploadFileTest(){
        //上传的是:文件的key,文件的名字,文件本身
        //采用的是MultipartBody来封装
        //MediaType详情参考:https://blog.csdn.net/sinat_34241861/article/details/110648469
        //Content_Type:application/x-www-form-urlencoded 默认是这种提交,采取的形式是键值对形式:key1:value1&key2:value2&key3:value3
        //Content_type:multipart/form-data,数据被编码为一条消息,一般用于文件上传
        //Content_Type:application/octet-stream,提交二进制数据,如果用于文件上传,只能上传一个文件
        //Content_Type:application/json,提交json数据
       OkHttpClient okHttpClient = new OkHttpClient();
        File file1 = new File("C:\\Users\\Administrator\\Desktop\\1.txt");
        File file2 = new File("C:\\Users\\Administrator\\Desktop\\2.txt");
        MultipartBody multipartBody = new MultipartBody.Builder()
                .addFormDataPart("file1", file1.getName(), RequestBody.create(file1, MediaType.parse("text/plain")))
                .addFormDataPart("file2", file2.getName(), RequestBody.create(file1, MediaType.parse("text/plain")))
                .addFormDataPart("a","1")//还可以添加额外的参数
                .build();
        Request request = new Request.Builder().url("https://www.httpbin.org/post").post(multipartBody).build();
        Call call = okHttpClient.newCall(request);
        try {
            Response response = call.execute();
            System.out.println(response.body().string());
        } catch (IOException e) {
            e.printStackTrace();
        }

5.Json数据上传:

         //上传json数据
        //使用的RequestBody来封装
        OkHttpClient okHttpClient = new OkHttpClient();
        RequestBody requestBody = RequestBody.create("{\"a\":1,\"b\":2}", MediaType.parse("application/json"));
        Request request = new Request.Builder().url("https://www.httpbin.org/post").post(requestBody).build();
        Call call = okHttpClient.newCall(request);
        try {
            Response response = call.execute();
            System.out.println(response.body().string());
        } catch (IOException e) {
            e.printStackTrace();
        }

.使用cookies:

cookie是某些网站为了辨别用户的身份,进行会话跟踪(比如确定登录状态)而存储在本地终端上的数据,由客户端保存信息

public class UseCookie {
    //cookie的相关配置
    Map> cookies = new HashMap<>();
    @Test
    public void useCookie(){
        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .cookieJar(new CookieJar() {
                    @Override
                    public void saveFromResponse(@NotNull HttpUrl httpUrl, @NotNull List list) {
                        //会把服务器返回的cookie封装成list集合,返回回来,可以用文件保存或者放在内存中
                        cookies.put(httpUrl.host(),list);
                    }
                    @NotNull
                    @Override
                    public List loadForRequest(@NotNull HttpUrl httpUrl) {
                        //请求网站的url
                      List cookies = UseCookie.this.cookies.get(httpUrl.host());
                      return cookies == null ? new ArrayList():cookies;
                    }
                })
                .build();
       //填入你自己的wanandroid账号和密码
        FormBody formBody = new FormBody.Builder().add("username", "xxx")
                .add("password", "xxxxxx").build();
        Request request = new Request.Builder().url("https://www.wanandroid.com/user/login")
                .post(formBody)
                .build();
        //准备好请求的Call对象
        Call call = okHttpClient.newCall(request);
        //进行同步请求
        try {
            Response response = call.execute();
            System.out.println(response.body().string());
        } catch (IOException e) {
            e.printStackTrace();
        }

        //请求收藏文章列表接口
        request = new Request.Builder().url("https://www.wanandroid.com/lg/collect/list/0/json")
                .build();
        //准备好请求的Call对象
        call = okHttpClient.newCall(request);
        //进行同步请求
        try {
            Response response = call.execute();
            System.out.println(response.body().string());
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

你可能感兴趣的:(Okhttp的基础使用)