1704B第23天http协议介绍+文件的上传和下载

本文详细介绍了OkHttp库在Android中的应用,包括GET和POST请求的实现,文件的下载与上传,以及如何进行封装,旨在帮助开发者掌握OkHttp的使用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. okhttp协议介绍

okhttp是一个第三方类库,用于android中请求网络。
这是一个开源项目,是安卓端最火热的轻量级框架,由移动支付Square公司贡献(该公司还贡献了Picasso和LeakCanary) 。用于替代HttpUrlConnection和Apache HttpClient(android API23 里已移除HttpClient)。

二.okhttp完成get请求

//网络请求json串
    public void getjson(){
        //TODO 1:client
        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        builder.callTimeout(5, TimeUnit.SECONDS);//连接超时
        builder.readTimeout(5,TimeUnit.SECONDS);//读取超时
        OkHttpClient client = builder.build();
        //TODO 2:request对象
        Request.Builder builder1 = new Request.Builder();
        builder1.url("http://www.qubaobei.com/ios/cf/dish_list.php?stage_id=1&limit=20&");//设置网址
        builder1.get();//设置请求方法
        FormBody.Builder builder2 = new FormBody.Builder();
        builder2.add("page","1");
        builder1.post(builder2.build());

        Request request = builder1.build();
        //TODO 3:发起连接call
        Call call = client.newCall(request);
        //TODO 4:通过call得到response
        call.enqueue(new Callback() {
            //请求失败
            @Override
            public void onFailure(Call call, IOException e) {
            }
            //请求成功
            @Override
            public void onResponse(Call call, Response response) throws IOException {
                //获得响应体:json串
                ResponseBody body = response.body();
                //通过body直接转成字符串
                String json = body.string();
               // Toast.makeText(MainActivity.this, ""+json, Toast.LENGTH_SHORT).show();
                Message obtain = Message.obtain();
                obtain.what=GET_JSON_OK;
                obtain.obj=json;
                handler.sendMessage(obtain);

            }
        });
    }

三.okhttp完成post请求

//post请求完成注册
    private void zhuce() {
        OkHttpClient client = new OkHttpClient.Builder()
                .callTimeout(5, TimeUnit.SECONDS)
                .readTimeout(5, TimeUnit.SECONDS)
                .build();
        //请求体:phone=13594347817&passwd=123654
        FormBody formBody = new FormBody.Builder()
                .add("phone", "13594343356")
                .add("passwd", "123654")
                .build();
        final Request request = new Request.Builder()
                .url("https://www.apiopen.top/createUser?key=00d91e8e0cca2b76f515926a36db68f5&")
                .post(formBody)//post提交必须要设置请求体
                .build();
        Call call = client.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                String string = response.body().string();
                Message obtain = Message.obtain();
                obtain.what=GET_JSON_OK;
                obtain.obj=string;
                handler.sendMessage(obtain);
            }
        });
    }

四.okhttp完成下载文件

 //下载文件到SD卡中
    private void sd() {
        //TODO 1:client
        OkHttpClient client = new OkHttpClient.Builder()
                .readTimeout(5, TimeUnit.SECONDS)
                .callTimeout(5, TimeUnit.SECONDS)
                .build();
        //TODO 2:request
        Request request = new Request.Builder()
                .get()
                .url("http://169.254.113.244/hfs/a.jpg")
                .build();
        //TODO 3:call
        Call call = client.newCall(request);
        //TODO 4:response
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {//失败

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {//成功
                ResponseBody body = response.body();
                long l = body.contentLength();//获得总大小
                InputStream inputStream = body.byteStream();//响应体-->输入流
              	//边读边写
              	//。。。。。
            }
        });
    }

五.okhttp完成上传文件

  private void upload() throws IOException {
        OkHttpClient client = new OkHttpClient.Builder()
                .callTimeout(5, TimeUnit.SECONDS)
                .readTimeout(5, TimeUnit.SECONDS)
                .build();
        //上传文件的请求体
        MultipartBody requestBody = new MultipartBody.Builder()
                .setType(MultipartBody.FORM)
                .addFormDataPart("file", "aaaa.mp3",//aaaa.mp3 服务器端的名字
                        RequestBody.create(MediaType.parse("media/mp3"), new File("/sdcard/来自天堂的魔鬼.mp3")))
                .build();
        final Request request = new Request.Builder()
                .url("http://172.21.79.88/hfs")
                .post(requestBody)//post提交必须要设置请求体
                .build();
        Call call = client.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
            }
            @Override
            public void onResponse(Call call, Response response) throws IOException {
                
            }
        });
    }

六.okhttp封装


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值