Android—OkHttp

emm这篇文章很久就开始写了,每次写到一半都忘记保存哭死,现在重新开始写吧。


OkHttp简介

OkHttp是一个优秀的网络请求框架,它使用建造者模式来对网络进行请求。

OkHttp使用

1.添加OkHttp依赖:

 2.构造OkHttpClient对象

 

3.构造Request对象

Request对象包括:

 - URL
 - method
 - headers
 - body

4.将Request封装成call

5.同步请求||异步请求

同步请求会一直等待网络响应,是阻塞式的;异步请求会接着往下执行,网络响应之后会调用回调方法。其中onResponse()方法中的response对象封装着返回的网络响应。

Response对象中包含:

 - code
 - headers
 - body

同步调用:

    Response response=call.execute();

异步调用:

需要注意的是,主线程一般用于更新UI操作,所以同步调用会阻塞主线程,一般不适用

异步调用的回调函数是在子线程,我们不能在子线程更新UI,需要借助于runOnUiThread()方法或者Handler来处理。

因为下面的例子没有更新UI操作,所以没有用Handler。


 

异步Get请求:


 

异步post请求:

这和异步Get请求相似,只是多了用FormBody来封装请求的参数。并传递给Request。这里的post参数是通过构造一个FormBody通过键值对的方式添加进去的。


 

 

异步post请求提交字符串:

有时候我们常常会遇到要传入一个字符串的需求,比如客户端给服务器发送一个json字符串,那这种时候就需要用到另一种方式来构造一个RequestBody如下所示:

RequestBody requestBody = RequestBody.create(MediaType.parse("text/plain;charset=utf-8"), "{username:admin;password:admin}");

 

 异步post请求上传文件:

private void put() {
        String filepath="";
        if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
            filepath=Environment.getExternalStorageDirectory().getAbsolutePath();
        }else{
            return;
        }

        String data="xqyhahaha";
        File file=new File(filepath,"wangshu.txt");
        try {


            FileWriter fileWriter=new FileWriter(file.getName(),true);
            fileWriter.write(data);
            fileWriter.flush();
            fileWriter.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        Request request=new Request.Builder()
                .url("https://api.github.com/markdown/raw")
                .post(RequestBody.create(MEDIA_TYPE_MARKDOWN,file))
                .build();
        mOkHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

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

    }

我在这里遇到一个问题,就是wangshu.txt这个文件里面的内容总是写不进去。


 

异步Post请求提交表单:

File file = new File(Environment.getExternalStorageDirectory(), "1.png");
if (!file.exists()){
    Toast.makeText(this, "文件不存在", Toast.LENGTH_SHORT).show();
    return;
}
RequestBody muiltipartBody = new MultipartBody.Builder()
        //一定要设置这句
        .setType(MultipartBody.FORM)
        .addFormDataPart("username", "admin")//
        .addFormDataPart("password", "admin")//
        .addFormDataPart("myfile", "1.png", RequestBody.create(MediaType.parse("application/octet-stream"), file))
        .build();

 

(1)如果提交的是表单,一定要设置setType(MultipartBody.FORM)这一句

(2)提交的文件addFormDataPart()的第一个参数,就上面代码中的myfile就是类似于键值对的键,是供服务端使用的,就类似于网页表单里面的name属性,例如下面:

<input type="file" name="myfile">
复制代码

(3)提交的文件addFormDataPart()的第二个参数文件的本地的名字,第三个参数是RequestBody,里面包含了我们要上传的文件的路径以及MidiaType

(4)记得在AndroidManifest.xml文件中添加存储卡读写权限


异步post下载文件:

  private void dowanload()
    {
        OkHttpClient client=new OkHttpClient();
        final Request request=new Request.Builder()
                .get()
                .url("https://www.baidu.com/img/bd_logo1.png")
                .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 {

                InputStream is=response.body().byteStream();
//                int len=0;
//                File file=new File(Environment.getExternalStorageState(),"n.png");
//                FileOutputStream fos=new FileOutputStream(file);
//                byte[] buf=new byte[128];
//
//                while((len=is.read(buf))!=-1)
//                {
//                    fos.write(buf,0,len);
//                }
//
//                fos.flush();
//                fos.close();
//                is.close();

                final Bitmap bitmap= BitmapFactory.decodeStream(is);
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        imageView.setImageBitmap(bitmap);
                    }
                });

                is.close();

            }
        });

    }

 

参考资料:https://juejin.im/post/5a31db566fb9a045257820b2#heading-1

《Android进阶之光》

OkHttp是一个开源的轻量级框架,由Square公司贡献,用于在Android端进行网络请求。它提供了几乎和java.net.HttpURLConnection一样的API,因此使用OkHttp无需重写您程序中的网络代码。OkHttp可以替代HttpUrlConnection和Apache HttpClient,特别是在Android API23之后,HttpClient已经被移除。\[1\]\[2\] OkHttp是一个相对成熟的解决方案,在Android API19 4.4的源码中可以看到HttpURLConnection已经被替换成了OkHttp。此外,OkHttp还支持HTTP/2协议,允许连接到同一个主机地址的所有请求共享Socket,从而提高请求效率。\[3\] #### 引用[.reference_title] - *1* [AndroidOkHttp的理解和使用](https://blog.csdn.net/JMW1407/article/details/117898465)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Android之网络请求2————OkHttp的基本使用](https://blog.csdn.net/weixin_50961942/article/details/127738248)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Android OkHttp](https://blog.csdn.net/weixin_44826221/article/details/109801566)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值