1.OkHttp的初步了解:
什么是okhttp,okhttp是一个处理网络请求的开源项目,是由Square公司贡献的,是一个轻量级的框架。使用okhttp有什么优势呢?
1.允许连接到同一个主机地址的所有请求,提高请求效率
2.共享Socket,减少请求延迟
3.缓存响应数据来减少重复的网络请求
4.减少对数据流量的消耗
5.自动处理GZip压缩
okhttp的功能:
1.最普通的get,post请求
2.文件的上传下载
3.加载图片
4.支持请求回调,直接返回对象,对象集合
5.支持session的支持
2.okhttp的初步使用:
1.创建OkHttpClient对象,并设置连接超时时间
OkHttpClient mokHttpClient = new OkHttpClient();
2.通过build来创建一个Request请求,没有设置get,直接设置一个url地址,默认是get方式请求
Request request = new Request.Builder().url("http://xxx.xxx.xxx.com").build();
3.创建一个call对象,参数是request请求对象,发送请求
Call call = mOkHttpClient.newCall(request);
//请求加入调度
call.enqueue(new Callback()
{
//请求失败执行的方法
public void onFailure(Request request,IOException e){}
//请求成功的执行方法,response是从服务器得到的参数,request.body()可以得到任意类型,字符串,字节
public void onResponse(final Response response) throws IOException{
//获取服务器的字符串
}
});
总结就是首先构造一个Request对象,参数必须有url参数,通过Request对象去构造一个Cal对象,类型将请求封装成任务,既然是任务,就有execute()和cancel()方法
最后,以异步的方式执行请求(网络请求一般都是异步),所以调用的是call.enqueue,将call加入调度队列,然后等待任务执行完成,在Callback中得到结果。post方式与get请求格式基本一致,就是request的构造不同。
3.简单例子
1.首先添加依赖,在build.gradle添加依赖:
compile 'com.squareup.okhttp3:okhttp:3.2.0'
compile 'com.squareup.okio:okio:1.7.0'
为什么要依赖okio呢,因为okhttp内部依赖okio
2.创建布局文件:
布局文件很简单,就是一个textView,然后给textView添加点击事件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.nova.okhttpdemo.MainActivity">
<TextView
android:id="@+id/text_get"
android:layout_width="200dp"
android:layout_height="40dp"
android:text="请求网络"
android:layout_centerInParent="true"
android:background="@drawable/bg_text"
android:gravity="center"
android:textColor="@color/white"/>
</RelativeLayout>
3.编写java代码
private void getHttp(){
//创建OkHttpClient对象
mOkHttpClient = new OkHttpClient();
//通过build创建一个rqquest请求
Request.Builder requestBuilder = new Request.Builder().url("http://www.baidu.com");
//可以省略 默认是GET请求
requestBuilder.method("GET",null);
Request request = requestBuilder.build();
Call mCall = mOkHttpClient.newCall(request);
//异步请求
mCall.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Toast.makeText(MainActivity.this,"失败",Toast.LENGTH_SHORT).show();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.d("TestService","MianActivity 线程是:" +Thread.currentThread().getId());
if(null != response.cacheResponse()){
//如果有缓存
String str = response.cacheResponse().toString();
}else{
//从服务器拿到参数
response.body().string();
}
//切回到主线程
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this,"成功",Toast.LENGTH_SHORT).show();
}
});
}
});
}
上面用了异步的请求方式,更新UI要切回到主线程。验证是否开了另一个线程结果如下:
完整的代码:
public class MainActivity extends Activity implements View.OnClickListener {
private TextView text_get;
private OkHttpClient mOkHttpClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text_get = (TextView)findViewById(R.id.text_get);
Log.d("TestService","MianActivity 线程是:" +Thread.currentThread().getId());
text_get.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.text_get:
// Toast.makeText(MainActivity.this,"失败",Toast.LENGTH_SHORT).show();
getHttp();
break;
}
}
private void getHttp(){
//创建OkHttpClient对象
mOkHttpClient = new OkHttpClient();
//通过build创建一个rqquest请求
Request.Builder requestBuilder = new Request.Builder().url("http://www.baidu.com");
//可以省略 默认是GET请求
requestBuilder.method("GET",null);
Request request = requestBuilder.build();
Call mCall = mOkHttpClient.newCall(request);
//异步请求
mCall.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Toast.makeText(MainActivity.this,"失败",Toast.LENGTH_SHORT).show();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.d("TestService","MianActivity 线程是:" +Thread.currentThread().getId());
if(null != response.cacheResponse()){
//如果有缓存
String str = response.cacheResponse().toString();
}else{
//从服务器拿到参数
response.body().string();
}
//切回到主线程
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this,"成功",Toast.LENGTH_SHORT).show();
}
});
}
});
}
}
另外简单的post请求如下:
//post请求
private void post(){
mOkHttpClient = new OkHttpClient();
RequestBody formBody = new FormBody.Builder()
.add("user","guian")
.build();
Request request = new Request.Builder()
.url("http://api.michun.com/usr/personal/list.action")
.post(formBody)
.build();
Call call = mOkHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//返回的参数
String str = response.body().string();
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplication(),"请求成功",Toast.LENGTH_SHORT).show();
}
});
}
});
}
get方式一般是从服务器获得参数,post一般是将数据提交给服务器。
GET方式:
1.GET方式是以实体的方式得到由请求URL所指定资源的信息,GET得到的信息是资源。
2.请求的数据会加在URL之后,以?分隔URL和传输数据,多个参数用&连接。URL编码格式采用的是ASCII编码,而不是Unicode,即所有的非ASCII字符都要编码之后再传输。
3.因为URL的长度限制,GET方式传输的数据大小有限制,传送的数据量不超过2KB
4.GET方式传输的参数安全性低,因为传输的数据会显示在请求URL中。
POST方式:
1.用来向目的服务器发出请求,要求它接收被附在请求后的实体,并把它当做请求队列中请求URL所指定资源的附加新子项。
2.POST方式传送的数据量较大,一般默认是没有限制。
3.POST方式将表单内各个字段和内容放置在HTNL HEADER中一起传送到Action属性所指定的URL地址,用户是看不到这个过程的。
4.POST方式传输的数据安全性较高,因为数据传输不是明显显示