OkHttp3基本使用

导入
compile 'com.squareup.okhttp3:okhttp:3.2.0'
compile 'com.squareup.okio:okio:1.7.0'
Get请求
        String url =  "https://www.baidu.com";
        Request request = new Request.Builder()
                .url(url)
                .build();
        Call call = mOkHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.d(TAG, "failure: ");
                e.printStackTrace();
            }

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

可以通过header、method设置更多的参数

Request request = new Request.Builder()
                .url(url)
                .header("key","value")
                .header("key","value")
                .build();

可以通过调用execute()执行同步方法,当然你必须得通过cancel()方法取消。
OkHttp支持大文件下载,如果希望获得返回的二进制字节数组,则调用response.body().bytes();
如果你想拿到返回的inputStream,则调response.body().byteStream()

   final File file = new File(Environment.getExternalStorageDirectory().toString() + "/default.png");
        String url = "http://35.185.149.228/static/user/images/default.jpg";;
        Request request = new Request.Builder()
                .url(url)
                .build();
        Call call = mOkHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                byte[] buf = new byte[2048];
                int len = 0;
                FileOutputStream os = null;
                InputStream inputStream = null;

                try {
                    inputStream = response.body().byteStream();
                    os = new FileOutputStream(file);
                    while ((len = inputStream.read(buf)) != -1) {
                        os.write(buf, 0, len);
                    }
                    os.flush();
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    if (os != null)
                        os.close();
                    if (inputStream != null)
                        inputStream.close();
                }
            }
        });
Post请求

post请求创建request和get是一样的,只是post请求需要提交一个表单,就是RequestBody。
1.普通表单application/x-www-form-urlencoded

String url = "https://www.baidu.com";
        FormBody body = new FormBody.Builder()
                .add("login_username", "jikexueyuanjgc")
                .add("login_password", "123456")
                .build();
        Request request = new Request.Builder()
                .url(url)
                .post(body)
                .build();

2.multipart/form-data 上传文件

File file = new File(Environment.getExternalStorageDirectory() + "/ic_launcher.png");

//不带参数的RequestBody
//RequestBody body = RequestBody.create(MediaType.parse("image/png"),file);

//带参数的RequestBody
MultipartBody.Builder builder = new MultipartBody.Builder();
        builder.addFormDataPart("filename", "testpng");
        builder.addFormDataPart("file", file.getName(), RequestBody.create(MediaType.parse("image/png"), file));

        RequestBody body = builder.build();

3.application/json 数据是个json

RequestBody body = RequestBody.create(MediaType.parse("aaplication/json;charset=utf-8"), "这是你的json串");
自动管理Cookie

通过设置header,上传Cookie

Request request = new Request.Builder()
    .url(url)
    .header("Cookie", "xxx")
    .build();

通过onRespone获取Cookie

 @Override
            public void onResponse(Call call, Response response) throws IOException 
            {
                setCookieList = response.headers("Set-Cookie");
                Log.i(TAG, "repose result:  " + response.body().string());
            }

但是okhttp可以不用我们管理Cookie,自动携带,保存和更新Cookie。
方法是在创建OkHttpClient设置管理Cookie的CookieJar

private final HashMap<String, List<Cookie>> cookieStore = new HashMap<>();
OkHttpClient okHttpClient = new OkHttpClient.Builder()
    .cookieJar(new CookieJar() {
        @Override
        public void saveFromResponse(HttpUrl httpUrl, List<Cookie> list) {
            cookieStore.put(httpUrl.host(), list);
        }

        @Override
        public List<Cookie> loadForRequest(HttpUrl httpUrl) {
            List<Cookie> cookies = cookieStore.get(httpUrl.host());
            return cookies != null ? cookies : new ArrayList<Cookie>();
        }
    })
    .build();
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,188评论 19 139
  • 6.1 公钥密钥加密原理 6.1.1 基础知识 密钥:一般就是一个字符串或数字,在加密或者解密时传递给加密/解密算...
    AndroidMaster阅读 9,467评论 1 8
  • I.简介 HTTP是现代应用常用的一种交换数据和媒体的网络方式,高效地使用HTTP能让资源加载更快,节省带宽。Ok...
    Jdqm阅读 591,826评论 28 314
  • 参考Android网络请求心路历程Android Http接地气网络请求(HttpURLConnection) 一...
    合肥黑阅读 21,619评论 7 63
  • 记得大学校招面试时候 , 被问到网络框架 . 当时就弱鸡的说 , 只会基础的 , 还没开始玩框架 - - 那今天来...
    MinuitZ阅读 4,075评论 0 0

友情链接更多精彩内容