okHttp发起网络请求

第一步,肯定是添加依赖了,这个有在线的和无线的两种,具体我就不多说了,有需求的可以看一篇讲解添加依赖的文章
Okhttp的请求方式有8种,这里我只介绍了常用的get和post的方式.
首先是步骤:
1. 获取okHttpClient实例
2. 构建Request(Request是OkHttp中访问的请求, Builder是辅助类,可选:是否传参)
3. 获取网络请求(Call)
4. 执行网络请求(同步excute or 异步enqueue)
5. 获取Response(Response即OkHttp中的响应)

一是OkHttp发起get请求:
同步方式:因为同步的get请求不会开启线程,而网络请求这种耗时的操作一般都会放在子线程中去,所以我们要把代码运行在子线程中

public void getSync() {
    new Thread(){
        @Override
        public void run() {
            // 1. 获取okHttpClient实例
            mOkHttpClient = new OkHttpClient();
            // 2. 构建Request
            mGetRequest = new Request.Builder().url(Constants.GET_URL).build();
            // 3. 获取网络请求Call对象
            Call call = mOkHttpClient.newCall(mGetRequest);
            try {
                // 4. 执行网络请求(同步方式),获取Response
                Response response = call.execute();
                // 5.处理响应的结果
                if (response.isSuccessful()) {
                    String reponseStr = response.body().string();
                    Log.e(TAG, "同步GET请求成功 ===========" + reponseStr);
                } else {
                    Log.e(TAG, "同步GET请求失败 ===========, code = " + response.code());
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }.start();
}

异步方式:
如果是异步的话,就会方便的多,因为异步方式去执行GET的请求,OkHttp本身会开启一个子线程去执行网络的操作,因此就不需要我们再去开启线程啦,我是更喜欢这种方式去请求网络

public void getAsyc() {
    // 1. 获取okHttpClient实例
    mOkHttpClient = new OkHttpClient();
    // 2. 构建Request
    mGetRequest = new Request.Builder().url(Constants.GET_URL).build();
    // 3. 获取网络请求Call对象
    Call call = mOkHttpClient.newCall(mGetRequest);
    // 4. 执行网络请求(异步方式)
   call.enqueue(new Callback() {
       @Override
       public void onFailure(Request request, IOException e) {
           Log.e(TAG, "异步GET请求失败 ===========, code = " + e.getMessage());
       }

       @Override
       public void onResponse(Response response) throws IOException {
           // 5.处理响应的结果
           if (response.isSuccessful()) {
               String reponseStr = response.body().string();
               Log.e(TAG, "异步GET请求成功 ===========" + reponseStr);
           } else {
               Log.e(TAG, "异步GET请求失败 ===========, code = " + response.code());
           }
       }
   });
}

二是Okhttp发起post请求
(Post请求与Get请求的区别:是否在构建Request的时候传递了参数,post会产地参数,而get不会. )
同步post请求(注意要开子线程)采用直接传递数据的方式请求服务器,一定注意,post的同步也是要开子线程的,这点要和get 的区分开,不要记混淆了

public void postSync() {
    new Thread(){
        @Override
        public void run() {
            // 要传递给服务器的数据
            String content = "{'msg':'Hello, OkHttp'}";

            // 2. 构建要传输给服务器的参数
            RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), content);
            // 3. 构建Request
            Request request = new Request.Builder().url(Constants.POST_URL_JSON).post(body).build();
            // 4. 获取Call对象
            Call call = mOkHttpClient.newCall(request);
            try {
                // 5. 同步post请求服务器
                Response response = call.execute();
                // 6. 处理响应的结果
                if (response.isSuccessful()) {
                    String reponseStr = response.body().string();
                    Log.e(TAG, "同步Post请求成功 ===========" + reponseStr);
                } else {
                    Log.e(TAG, "同步Post请求失败 ===========, code = " + response.code());
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }.start();
}

异步Post请求
我用的是最常用的上传key – value形式的数据的方式来演示异步post请求:

public void postAsyc() {
    // 2. 构建要传输给服务器的参数
    RequestBody body = new FormEncodingBuilder()
            .add("platform", "android")
            .add("version", "23")
            .add("SDK", "24")
            .build();
    // 3. 构建Request
    Request request = new Request.Builder().url(Constants.POST_URL_PARAMS).post(body).build();
    // 4. 获取Call对象
    Call call = mOkHttpClient.newCall(request);
    // 5. 同步post请求服务器
    call.enqueue(new Callback() {
        @Override
        public void onFailure(Request request, IOException e) {
            Log.e(TAG, "异步Post请求失败 =========== " + e.getMessage());
        }

        @Override
        public void onResponse(Response response) throws IOException {
            // 6. 处理响应的结果
            if (response.isSuccessful()) {
                String reponseStr = response.body().string();
                Log.e(TAG, "异步Post请求成功 ===========" + reponseStr);
            } else {
                Log.e(TAG, "异步Post请求失败 ===========, code = " + response.code());
            }
        }
    });
}

好了,Okhttp发起网络请求基本就是这样,因为是手打,可能会出现一些错别字或者不太正确的地方,欢迎来告诉我,有更好的发起网络请求的方法,也欢迎来告诉我~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值