okhttp的两种请求

@[toc] OKHTTP的一些用法

OKHTTP的get请求

OkHttp是Square出的Http通讯库,支持HTTP和HTTP/2,用于Android应用和Java应用。
OkHttp是非常优秀的Http通讯库,将Http连接中各种繁杂的问题,对并发的支持,对常见异常的处理等封装在底层,提供简单易用的API供应用中调用。与之相比,HttpUrlConnection的使用过于复杂,Appache的HttpClient在Android平台上的运行又有各种问题,在Android 6.0之后,已经将HttpClient库从SDK中删除,全面转向使用OkHttp。
总而言之,OKHTTP就是一个用于网络操作的框架,用来简化我们的操作的时间和复杂度。

目前有很多知名的Android三方框架都使用OkHttp作为网络连接的默认基栈,例如Volley,Glide,Retrofit等,从中也能看出学习OkHttp的必要性。

请求json字符串

OKHTTP的重点就在于4个单词 : client ,request,call ,Response
client就是利用OkHttp来创建一个客户端,而后发送请求,即是request.
然后就是与服务端进行一个链接,就是一个打电话的呼叫过程,最后就是
服务端对客户端的请求返回响应。

 //client
        OkHttpClient client = new OkHttpClient.Builder()
                .connectTimeout(3, TimeUnit.SECONDS)
                .readTimeout(3, TimeUnit.SECONDS)
                .build();

        //request
        Request request = new Request.Builder().url(path).get().build();

        //call
        Call call = client.newCall(request);

        //response
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Toast.makeText(MainActivity.this, "失败" + e.getMessage(), Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onResponse(Call call, final Response response) throws IOException {
                ResponseBody body = response.body();
                final String string = body.string();
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(MainActivity.this, "" + string, Toast.LENGTH_SHORT).show();
                    }
                });
            }
        });

post 请求json字符串

 //client
        OkHttpClient client = new OkHttpClient.Builder()
                .readTimeout(3, TimeUnit.SECONDS)
                .connectTimeout(3, TimeUnit.SECONDS)
                .build();

        //request

        FormBody formBody = new FormBody.Builder()
                .add("page", "1")
                .build();

        Request request = new Request.Builder()
                .url(post_path)
                .post(formBody)
                .build();

        //call
        Call call = client.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, final IOException e) {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(MainActivity.this, "" + e.getMessage(), Toast.LENGTH_SHORT).show();
                    }
                });
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                final String string = response.body().string();
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(MainActivity.this, "" + string, Toast.LENGTH_SHORT).show();
                    }
                });
            }
        });

OKHTTP 下载


//client
        OkHttpClient client = new OkHttpClient.Builder()
                .connectTimeout(3, TimeUnit.SECONDS)
                .readTimeout(3, TimeUnit.SECONDS)
                .build();

        //request
        final Request request = new Request.Builder()
                .url(load_path)
                .get()
                .build();

        //call

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, final IOException e) {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(MainActivity.this, "" + e.getMessage(), Toast.LENGTH_SHORT).show();
                    }
                });
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
//                        File file = new File(mp4_path);
                int count = 0;

                File directory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES);
                String state = Environment.getExternalStorageState();
                File file1 = Environment.getExternalStorageDirectory();
                if (state.equals(Environment.MEDIA_MOUNTED)) {
                    FileOutputStream fos = new FileOutputStream(new File(directory, "houzi.mp4"));
                    long l = response.body().contentLength();
                    InputStream is = response.body().byteStream();
                    int len;
                    byte[] bytes = new byte[1024];
                    while ((len = is.read(bytes)) != -1) {
                        fos.write(bytes, 0, len);
                        count += len;
                        fos.flush();
                        int progress = (int) ((count * 100) / l);
                        Message obtain = Message.obtain();
                        obtain.what = 120;
                        obtain.obj = progress;
                        handler.sendMessage(obtain);
                    }
                    fos.close();
                    is.close();
                }
            }
        });

上传

在上传的过程中,最重要的就是在请求的请求体,应为上传的时候需要携带数据,而数据就是储存在请求体中。
而这就需要在请求时进行一些区别于正常的的操作 了。

//client
        OkHttpClient client = new OkHttpClient.Builder()
                .readTimeout(20, TimeUnit.SECONDS)
                .connectTimeout(20, TimeUnit.SECONDS)
                .build();
        //request

        RequestBody requestBody = RequestBody.create(MediaType.parse("media/mp4"), new File(upload_path));

        MultipartBody multipartBody = new MultipartBody.Builder()
                .setType(MultipartBody.FORM)
                .addFormDataPart("file", "monkey.mp4", requestBody)
                .build();

//主要是在这里的post()中需要天记上数据,在这里需要加入一个body对象,就是MultipartBody 对象
而在MultipartBod 中又要添加一个RequestBody对象。


        Request request = new Request.Builder()
                .url(upload_path_mp4)
                .post(multipartBody)
                .build();

        //call 和 response
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, final IOException e) {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(MainActivity.this, "上传失败" + e.getMessage(), Toast.LENGTH_SHORT).show();
                    }
                });
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(MainActivity.this, "上传成功", Toast.LENGTH_SHORT).show();
                    }
                });
            }
        });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值