原文:https://blog.csdn.net/MaybeForever/article/details/87868593
OkHttp的Github地址:https://github.com/square/okhttp
在Android Studio中使用不需要下载jar包,直接添加依赖即可:
compile 'com.squareup.okhttp3:okhttp:3.13.1'
添加上述依赖会自动下载两个库,一个是OkHttp库,一个是Okio库,后者是前者的通讯基础。
添加权限:<uses-permission android:name="android.permission.INTERNET"/>
同步请求:执行请求的操作时阻塞式,直到HTTP响应返回。
(OKHttp的execute方法是同步方法)
异步请求:类似于非阻塞式请求,它的执行结果一般都是通过接口回调的方式告知调用者。
(OkHttp的enqueue方法是异步方法)
常用的方法主要有两个:GET和POST。GET表示希望从服务器那里获取数据,而POST则表示希望提交数据给服务器。
一、同步请求-GET
// 创建一个OkHttpClient的实例
OKHttpClient client = new OKHttpClient();
//想要发起一条HTTP请求,就需要创建一个Request对象,可以在最终的build()之前连缀很多其他方法来丰富这个Request对象
Request request = new Request.Builder()
.url("http://www.baidu.com")
.build();
//调用OkHttpClient的newCall()方法来创建一个Call对象,并调用它的execute()方法来发送请求并获取服务器返回的数据
//response对象就是服务器返回的数据
Response response = client,newCall(request).execute();
//得到返回的具体内容
String responseData = response.body().string();
二、异步请求-GET
OKHttpClient ckient = new OKHttpClient();
Request request = new Reqyest.Builder()
.url("http://www.baidu.com")
.build();
Response response = client.newCall(request);
response.enqueue(new Callback(){
@Override
public void onFailure(Call call, IOException e){
}
@Override
public void onResponse(Call call, Response response) throws IOException{
String responseData = response.body().string();
Log.d(TAG, str);
}
});
三、同步请求-POST
//创建一个OKHttpClient实例
OKHttpClient client = new OKHttpClient();
//如果要发起Post请求,则需要先构建一个RequestBody对象存放待提交的参数
RequestBody requestBody = new FromBody.Builder()
.add("username", "admin")
.add("password", "123456")
.build();
//然后在Request.Builder中调用一下post()方法,并将RequestBody对象传入
Request request = new Request.Builder()
.url("http://www.baidu.com")
.post(requestBody)
.build();
//调用execute()方法来发送请求并获取服务器返回的数据
Response response = client.newCall(request).execute();
//得到返回的具体内容
String responseData = response.body().string();
四、异步请求-POST
OKHttpClient client = new OKHttpClient();
RequestBody requestBody = new FromBody.Builder()
.add("username", "admin")
.add("password", "123456")
.build();
Request request = new Request.Builder()
.url("http://www.baidu.com")
.post(requestBody)
.build();
Response response = client.newCall(request);
response.enqueue(new Callback(){
@Override
public void onFailure(Call call, IOException e){
}
@Override
public void onResponse(Call call, Response response) throws IOException{
String responseData = response.body().string();
Log.d(TAG, str);
}
});
注意:
在以上四段代码中,response.body().string()只能被调用一次,调用一次之后就会被释放,再次调用会爆:java.lang.IllegalStateException:closed
原因:调用一次之后它的内存就释放了
解决方法:可以把它赋值给一个String变量,然后多次使用!!
五、OkHttp的请求流程图