OkHttp是由鼎鼎大名的Square公司开发的。OkHttp不仅在接口封装上面做的简单易懂,就连在底层实现上也自成一派。
在使用OkHttp之前,我们需要在Android Studio上app/build.gradle文件中添加它的依赖
dependencies {
compile 'com.squareup.okhttp3:okhttp:3.4.1'
}
下面就来看看OkHttp的具体用法
GET请求(同步请求)
private void getDataWithOkHttp() {
//开启子线程发起网络请求
new Thread( new Runnable() {
@Override
public void run() {
try{
//创建OkHttpClient实例对象
OkHttpClient okhttpclient = new OkHttpClient();
//发起请求 url()方法设置目标的网络地址
Request request = new Request.Builder()
.url( "http://www.baidu.com" )
.build();
//调用OkHttpClient的newCall()方法来创建一个Call对象,并调用它的execute()方法来发送请求并获取服务器返回的数据
//其中Response对象就是服务器返回的数据
Response response = okhttpclient.newCall( request ).execute();
//通过下列数据得到返回的具体数据内容
String responseData = response.body().string();
//显示获取得到的数据
showResponse( responseData );
}catch (Exception e){
e.printStackTrace();
}
}
} ).start();//start()开启线程
}
Android是不允许在子线程中进行UI操作,我们需要通过runOnUiThread()方法将线程切换到主线程,然后更新UI元素
private void showResponse(final String response) {
runOnUiThread( new Runnable() {
@Override
public void run() {
//在这里进行UI操作,将结果显示到界面上
//result是一个TextView,代码中没有定义绑定控件,读者使用时,可自行定义
result.setText( response );
}
} );
}
GET请求(异步请求)
private void getDataWithOkHttp() {
//
OkHttpClient client = new OkHttpClient();
//请求体
Request request = new Request.Builder()
.url("http://www.baidu.com")
.build();
// enqueue()方法 ,发送请求并获取返回数据
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.d(“Test”,"获取数据失败了"+e.toString());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if(response.isSuccessful()){//回调的方法执行在子线程。
Log.d("Test","获取数据成功了");
Log.d("Test","response.code()=="+response.code());
Log.d("Test","response.body().string()=="+response.body().string());
//通过下列数据得到返回的具体数据内容
String responseData = response.body().string();
//显示获取得到的数据
showResponse( responseData );
}
}
});
}
最大的不同点就是异步请求不需要开启子线程,enqueue方法会自动将网络请求部分放入子线程中执行。
POST请求(同步请求)
public void sendRequestWithOkHttp( ){
//开启子线程发送请求
new Thread( new Runnable() {
@Override
public void run() {
try{
//创建OkHttpClient实例对象
OkHttpClient okHttpClient = new OkHttpClient();
//请求体
RequestBody requestBody = new FormBody.Builder()
.add("username", "admin")
.add("password", "123456")
.build();
//包装请求
Request request = new Request.Builder()
.url( "http://www.baidu.com")
.post(requestBody)
.build();
//execute()方法,发送请求并获取返回数据
Response response = okHttpClient.newCall( request ).execute();
String responseData = response.body().string();
//显示返回数据
showResponse( responseData );
}catch (Exception e){
Log.i("Test","error" );
e.printStackTrace();
}
}
} ).start();
}
POST请求(异步请求)
//url是访问的服务器网址,userJsonStr是包装好的Json串
public void postData(String url, String userJsonStr){
//异步请求
//执行post操作
//创建OkHttpClient的对象
OkHttpClient client = new OkHttpClient();
//请求体
RequestBody requestBody = new FormBody.Builder()
.add( "reqJson",userGsonStr )
.build();
//包装请求
Request request = new Request.Builder()
.url( url )
.post( requestBody )
.build();
//发送请求并获取返回数据
client.newCall( request ).enqueue( new Callback() {//enqueue方法是异步请求
@Override
public void onFailure(Call call, IOException e) {
//这里是子线程
Log.d(TAG,"获取数据失败了"+e.toString());
runOnUiThread( new Runnable() {
@Override
public void run() {
Toast.makeText( MainActivity.this, "数据出错", Toast.LENGTH_SHORT ).show();
}
} );
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if(response.isSuccessful()){//回调的方法执行在子线程。
Log.d(TAG,"获取数据成功了");
Log.d("Test","response.code()=="+response.code());
final String str = response.body().string();
Log.d(TAG,"response.body().string()=="+str);
//切换线程
runOnUiThread(new Runnable() {
@Override
public void run() {
result.setText( str );
Toast.makeText( MainActivity.this,str,Toast.LENGTH_SHORT ).show();
}
});
}
}
} );
}