OKHttp是一个处理网络请求的框架,其优势有,支持http2,对一台机器的全部请求共享同一个socket。json
内置链接池,支持链接复用,减小延迟。经过缓存避免重复的请求,请求失败时自动重试主机的其余ip,自动重定向。 缓存
compile 'com.squareup.okhttp3:okhttp:3.8.1'
OkHttpClient okHttpClient; Request request; okHttpClient = new OkHttpClient(); request = new Request.Builder() .url("http://www.baidu.com")//请求接口,若是须要传参拼接到接口后面,如www.baidu.com?name=zhangsan&sex=18 .build(); final Call call = okHttpClient.newCall(request); new Thread(new Runnable() { @Override public void run() { try { Response response = call.execute();//获得Response 对象 if(response.isSuccessful()){//判断是否响应 Log.d("response ","响应码"+response.code());//返回http协议的响应码 Log.d("response ","返回内容"+response.body().string()); } } catch (IOException e) { e.printStackTrace(); } } });
OkHttpClient okHttpClient; Request request; okHttpClient = new OkHttpClient(); request = new Request.Builder() .url("http://www.baidu.com")//请求接口。若是须要传参拼接到接口后面,如www.baidu.com?name=zhangsan&sex=18 .build(); final Call call = okHttpClient.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { if(response.isSuccessful()){//判断是否响应 Log.d("response ","响应码"+response.code());//返回http协议的响应码 Log.d("response ","返回内容"+response.body().string()); } } });
FormBody body = new FormBody.Builder() //建立信息主体 .add("name", name) .add("sex", department) .add("possword", post) .add("data", formatter.format(getData())) .build();
//传递Json对象 MediaType JSON = MediaType.parse("application/json; charset=utf-8");//指定数据类型为json对象, String jsonStr = "{\"username\":\"lisi\",\"nickname\":\"李四\"}";//json数据. RequestBody body = RequestBody.create(JSON, josnStr); //传递File对象 MediaType fileType = MediaType.parse("File/*");//指定数据类型为file对象, File file = new File(path);//file对象 RequestBody body = RequestBody.create(fileType , file );
MultipartBody multipartBody =new MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart("groupId",""+Id)//添加键值对参数 .addFormDataPart("file",file.getName(),RequestBody.create(MediaType.parse("file/*"), file))//添加文件 .build();
//FormBody传递数据,Post同步请求 OkHttpClient okHttpClient; okHttpClient = new OkHttpClient(); FormBody body = new FormBody.Builder() //建立信息主体 .add("name", name) .add("sex", department) .add("possword", post) .add("data", formatter.format(getData())) .build(); Request requset = new Request.Builder() .url("url") .post(body) .build(); final Call call = okHttpClient.newCall(requset); new Thread(new Runnable() { @Override public void run() { try { Response response = call3.execute();//获得Response 对象 if(response.isSuccessful()){//判断是否响应 Log.d("response ","响应码"+response.code());//返回http协议的响应码 Log.d("response ","返回内容"+response.body().string()); } } catch (IOException e) { e.printStackTrace(); } } }); //RequestBody()传递数据,Post异步请求 OkHttpClient okHttpClient; okHttpClient = new OkHttpClient(); MediaType JSON = MediaType.parse("application/json; charset=utf-8");//数据类型为json格式, String jsonStr = "{\"username\":\"lisi\",\"nickname\":\"李四\"}";//json数据. RequestBody body = RequestBody.create(JSON, jsonStr); Request request = new Request.Builder() .url("http://www.baidu.com") .post(body) .build(); final Call call = okHttpClient.newCall(requset); call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { if(response.isSuccessful()){//判断是否响应 Log.d("response ","响应码"+response.code());//返回http协议的响应码 Log.d("response ","返回内容"+response.body().string()); } } });
经过上述代码,Get或Post请求须要实例化OkHttpClient对象,用Request建立请求和Response发送请求,以及Call调度器接收返回内容。网络
Call对象有两种模式,call.excute()同步模式,call.enqueue()异步模式。app
同步是在主线程操做,因此须要开启子线程操做。异步是CallBack回调回来的Response,是在子线程操做,可是回调的onFailure()和onResponse()依然在子线程中。框架
respinse.body() 也是在子线程,须要接收到内容,才能调用主线程操做。异步
注意response.body()只能调用一次,由于是输出流的读操做,而读写操做只接收一次,第二次会返回null。socket
OkHttpClient okHttpClient = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS)//设置超时时间 .readTimeout(10, TimeUnit.SECONDS)//设置读取超时时间 .writeTimeout(10, TimeUnit.SECONDS);//设置写入超时时间