作者:温德军46867 | 来源:互联网 | 2023-09-02 02:59
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添加点击事件
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() {@Overridepublic void onFailure(Call call, IOException e) {Toast.makeText(MainActivity.this,"失败",Toast.LENGTH_SHORT).show();}@Overridepublic 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() {@Overridepublic 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;@Overrideprotected 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);}@Overridepublic 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() {@Overridepublic void onFailure(Call call, IOException e) {Toast.makeText(MainActivity.this,"失败",Toast.LENGTH_SHORT).show();}@Overridepublic 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() {@Overridepublic 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() {@Overridepublic void onFailure(Call call, IOException e) {}@Overridepublic void onResponse(Call call, Response response) throws IOException {//返回的参数String str = response.body().string();runOnUiThread(new Runnable() {@Overridepublic 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方式传输的数据安全性较高,因为数据传输不是明显显示