OkHttp是Square出的Http通讯库,支持HTTP和HTTP/2,用于Android应用和Java应用。
OkHttp是非常优秀的Http通讯库,将Http连接中各种繁杂的问题,对并发的支持,对常见异常的处理等封装在底层,提供简单易用的API供应用中调用。
1、导入okhttp3
在Gradle中进行如下配置以便在Android Studio中使用:
compile'com.squareup.okhttp3:okhttp:3.4.1'
核心类
我们在使用Okhttp进行开发的时候,主要牵扯到以下几个核心类:OkHttpClient、Request、Call 和 Response。
OkHttpClient
OkHttpClient表示了HTTP请求的客户端类,在绝大多数的App中,我们只应该执行一次new OkHttpClient(),将其作为全局的实例进行保存,从而在App的各处都只使用这一个实例对象,这样所有的HTTP请求都可以共用Response缓存、共用线程池以及共用连接池。
默认情况下,直接执行OkHttpClient client = new OkHttpClient()就可以实例化一个OkHttpClient对象。
可以配置OkHttpClient的一些参数,比如超时时间、缓存目录、代理、Authenticator等,那么就需要用到内部类OkHttpClient.Builder,设置如下所示:
OkHttpClient client = new OkHttpClient.Builder().
readTimeout(30, TimeUnit.SECONDS).
cache(cache). proxy(proxy).
authenticator(authenticator).
build();
OkHttpClient本身不能设置参数,需要借助于其内部类Builder设置参数,参数设置完成后,调用Builder的build方法得到一个配置好参数的OkHttpClient对象。这些配置的参数会对该OkHttpClient对象所生成的所有HTTP请求都有影响。
get请求方法
public void GoGet(View view) throws IOException {
tv_text.setText("");
//1.拿到OkHttpClient对象
//2.构造Request
Request.Builder builder=new Request.Builder();
final Request request=builder.get().url(mBaseUrl+"hello?name=123213&password=1234324").build();
executeRequset(request);//调用执行
Toast.makeText(this,"get请求",Toast.LENGTH_SHORT).show();
}
post请求方法
public void GoPost(View view) throws IOException {
tv_text.setText("");
//1.拿到OkHttpClient对象
FormBody.Builder requestBodyBuilder=new FormBody.Builder();
//2.构造Request
//2.1构造器requestBody
RequestBody requestBody=requestBodyBuilder.add("name","123423").add("password","1234123").build();
Request.Builder builder=new Request.Builder();
Request request=builder.get().url(mBaseUrl+"hello?").post(requestBody).build();
executeRequset(request);//调用执行
Toast.makeText(this,"post请求",Toast.LENGTH_SHORT).show();
}
post提交String方法
public void GoPostString(View view) throws IOException {
//通过RequestBody设置文件类型、文件
RequestBody requestBody=RequestBody.create(MediaType.parse("text/plain;chaset=utf-8"),"{name:1234,password:aaa}");
Request.Builder builder=new Request.Builder();
Request request=builder.get().url(mBaseUrl+"PostString").post(requestBody).build();
executeRequset(request);//调用执行
Toast.makeText(this,"post提交String到服务器",Toast.LENGTH_SHORT).show();
}
通用执行方法
//通用执行方法
private void executeRequset(final Request request) throws IOException {
//3.将request封装为Call
Call call=okHttpClient.newCall(request);
//4.执行Call
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
//这个属于子线程,更新UI就要通过runOnUiThread方法
runOnUiThread(new Runnable() {
@Override
public void run() {
tv_text.setText("连接失败");
}
});
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//使用byte数组获得服务器返回的字符串
final byte[] res=response.body().bytes();
//这个属于子线程,更新UI就要通过runOnUiThread方法
runOnUiThread(new Runnable() {
//服务器返回数据进行转换GBK编码
String resutf8=new String(res,"utf-8");
@Override
public void run() {
tv_text.setText(resutf8);
}
});
}
});
}