OkHttp3.0入门教程

以前对于写博客来说总觉得很麻烦 ,不过随着不断地开发工作发现写博客不仅仅可以记录自己的一些学习的知识还可以巩固自己学习的知识,对技术的理解程度也会更深,虽然开始的时间有点晚 不过坚持下去就是好的。今天主要记录一下OkHttp3.0的入门教程

一,开发环境

在android studio中导入添加

compile 'com.squareup.okhttp3:okhttp:3.4.1'
compile 'com.squareup.okio:okio:1.11.0'

官方资料:
OkHttp官网地址:http://square.github.io/okhttp
OkHttp GitHub地址:https://github.com/square/okhttp

二,OkHttp3.0的使用

1.同步get请求

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

        Request request = new Request.Builder()
                           .url("请求的url")
                           .get()//发起get请求
                           .build();//Request.Builder()中还可以添加header,tag等方法

        Response reponse = okHttpClient.newCall(request).execute(); //execute代表同步请求

        String message = reponse.body().string();//获取到请求的数据

2.异步get请求

OkHttpClient okHttpClient=new OkHttpClient();
Request request = new Request.Builder()
                            .url("请求的url")
                            .get() 
                            .build();
        okHttpClient.newCall(request).enqueue(new Callback() {//enqueue代表异步
            @Override
            public void onFailure(Call call, IOException e) {
                Log.e("okhttp", "asynGet--onFailure---" + e.toString());
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                Log.e("okhttp", "asynGet-----获取字符串" + response.body().string());
                Log.e("okhttp", "asynGet-----获取inputstream" +  response.body().byteStream());
            }
        });

3.同步post请求

OkHttpClient okHttpClient=new OkHttpClient();
FormBody formBody = new FormBody.Builder()
                        .add("key", "value")//请求参数
                        .build();
        Request request = new Request.Builder()
                        .url(urls)
                        .post(formBody)
                        .header("headKey", "headValue")//存值于header中
                        .build();
        Response reponse = okHttpClient.newCall(request).execute();
        String message = reponse.body().string();
        Log.e("okhttp", "syncPost-----" + message);

4.异步post请求

FormBody formBody = new FormBody.Builder()
                                .add("key", "value")
                                .build();
        final Request req = new Request.Builder()
                                       .url(urls)
                                       .post(formBody)
                                       .header("key", "value")
                                       .tag("zjy")//请求标记可用于取消网络请求操作
                                       .build();
        Call call = okHttpClient.newCall(req);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                Log.e("okhttp", "asynPost-----" + response.body().string());
            }
取消网络请求以上边异步post请求为例
 if ("zjy".equals(call.request().tag())) {
            call.cancel();//取消请求
        }

在使用OKhttp请求时,onReponse回调中 不在主线程所以需要自己通过handler或者其他的方式进行对ui界面的更新
5.异步post上传文件(以文件为请求体参数上传)

OkHttpClient okHttpClient=new OkHttpClient();
MediaType MEDIA_TYPE_MARKDOWN = MediaType.parse("text/x-markdown; charset=utf-8");
File file=new File("file_path");
Request request=new Request.Builder()
                    .url("url")
                    .post(RequestBody.create(MEDIA_TYPE_MARKDOWN,file))
                    .build();
okHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {

            }
        });

6.post表单上传文件

OkHttpClient okHttpClient=new OkHttpClient();
List<File> list = new ArrayList<>();//多个文件集合
MultipartBody.Builder builder = new MultipartBody.Builder();
builder.setType(MultipartBody.FORM);//设置为表单类型
             builder.addFormDataPart("param", "value");  //添加表单键值
for (File file : list) { //添加多个文件
    RequestBody fileBody = RequestBody.create(MediaType.parse("application/octet-stream"), file);  
    builder.addFormDataPart("files", file.getName(), fileBody);
}
    Request request = new Request.Builder()
                .url("请求的url")
                .post(builder.build())
                .build();
        okHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
            }
        });

7.全局设置超时时间

 okHttpClient.newBuilder()
            .connectTimeout(10, TimeUnit.MINUTES)  
            .readTimeout(10, TimeUnit.SECONDS).build();
            .writeTimeout(10, TimeUnit.SECONDS)
            .Builder()    

9.在测试环境下允许所有未信任的证书访问

开发中经常用到Https请求 但是在测试环境中一般都是用假证书 只有正式环境中会用到可信任的证书,所以如何在测试环境下 通过所有未认证证书从而不妨碍测试环境下测试呢

OkHttpClient.Builder builder = new OkHttpClient.Builder();

        builder.sslSocketFactory(createSSLSocketFactory());
        builder.hostnameVerifier(new HostnameVerifier() {
            @Override
            public boolean verify(String s, SSLSession sslSession) {
                return true;
            }
        });
        okHttpClient = builder.build();


 private static SSLSocketFactory createSSLSocketFactory() {
        SSLSocketFactory ssfFactory = null;
        try {
            SSLContext sc = SSLContext.getInstance("TLS");
            sc.init(null, new TrustManager[]{new TrustAllCerts()}, new SecureRandom());

            ssfFactory = sc.getSocketFactory();
        } catch (Exception e) {
        }

        return ssfFactory;
    }

http请求头大全http://tools.jb51.net/table/http_header

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值