Android OkHttp的基本使用

对于Android Studio的用户,可以在gradle上添加:    com.squareup.okhttp3:okhttp:3.2.0'

一、Http Get

对了网络加载库,那么最常见的肯定就是http get请求了,比如获取一个网页的内容。

//创建okHttpClient对象
        OkHttpClient client = new OkHttpClient();

        //创建一个Request
        Request request = new Request.Builder().url("http://www.yzg020.com/zhengmian/app/user/updateUser.api").build();
        //创建一个call
        Call call = client.newCall(request);
        //把call加入调度
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                String str = response.body().string();//获取到的数据内容
            }
        });

以上就是发送一个get请求的步骤,首先构造一个Request对象,参数最起码有个url,当然你可以通过Request.Builder设置更多的参数比如:headermethod等。

然后通过request的对象去构造得到一个Call对象,类似于将你的请求封装成了任务,既然是任务,就会有execute()和cancel()等方法。

最后,我们希望以异步的方式去执行请求,所以我们调用的是call.enqueue,将call加入调度队列,然后等待任务执行完成,我们在Callback中即可得到结果。
 

注意: 1、onResponse(Call call, Response response)方法返回的不是UI现在,不能直接更新UI,需要用Handler。

2、response.body().toString();//获取到的数据字符串

response.body().byteStream(); //可以用于下载

response.body().bytes(); //二进制字节数组

 

二、Http Post 携带参数

post携带参数,也仅仅是Request的构造的不同。

注意:OkHttp3异步POST请求和OkHttp2.x有一些差别就是没有FormEncodingBuilder这个类,替代它的是功能更加强大的FormBody:

//创建okHttpClient对象
        OkHttpClient client = new OkHttpClient();
      //  FormEncodingBuilder builder = new FormEncodingBuilder();
        RequestBody body = new FormBody.Builder()
                .add("name", "xiaoming").build();
        Request request = new Request.Builder()
                .url("http://www.yzg020.com/zhengmian/app/user/updateUser.api").post(body).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 str = response.body().string();

            }
        });

三、异步上传文件

首先定义上传文件类型:

public static final MediaType mediaType = MediaType.parse("text/x-markdown; charset=utf-8");

将sdcard根目录的test.txt文件上传到服务器上:

OkHttpClient client = new OkHttpClient();
        File file = new File("/sdcard/test.txt");
        Request request = new Request.Builder().url("http://www.yzg020.com/zhengmian/app/user/updateUser.api")
                .post(RequestBody.create(mediaType, file)).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 str = response.body().string();
            }
        });

四、异步下载文件:

 OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder().url("http://img2.imgtn.bdimg.com/it/u=2151106510,2213335010&fm=26&gp=0.jpg").build();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
            }
            @Override
            public void onResponse(Call call, Response response) throws IOException {
                InputStream inputStream = response.body().byteStream();
                FileOutputStream fileOutputStream = null;
                try {
                    fileOutputStream = new FileOutputStream(new File("/sdcard/te.jpg"));
                    byte[] buffer = new byte[2048];
                    int len = 0;
                    while ((len = inputStream.read(buffer)) != -1) {
                        fileOutputStream.write(buffer, 0, len);
                    }
                    fileOutputStream.flush();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });

五、异步上传Multipart文件

定义上传文件

public static final MediaType meType = MediaType.parse("image/png");
OkHttpClient client = new OkHttpClient();
        RequestBody requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM)
                .addFormDataPart("name", "xiaoming")
                .addFormDataPart("age", "18")
                .addFormDataPart("image", "te.jpg", RequestBody.create(meType,  new File("/sdcard/te.jpg")))
                .build();
        Request request = new Request.Builder()
                .header("xiaoming", "Client-ID " + "...")
                .url("http://www.yz.com/zhn/app/user/updateUser.api")
                .post(requestBody)
                .build();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
            }
            @Override
            public void onResponse(Call call, Response response) throws IOException {
            }
        });

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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、付费专栏及课程。

余额充值