okhttp:
一个处理网络请求的开源项目,是安卓端最火热的轻量级框架。
优势:
1.允许连接到同一个主机地址的所有请求,提高请求效率;
2.共享Socket,减少对服务器的请求次数;
3.通过连接池,减少了请求延迟;
4.缓存响应数据来减少重复的网络请求;
5.减少了对数据流量的消耗;
6.自动处理GZip压缩。
功能:
1.get,post请求;
2.文件的上传下载;
3.加载图片(内部会图片大小自动压缩) ;
4.支持请求回调,直接返回对象、对象集合;
5.支持session的保持。
以上是百度百科的,就是这样的简练,本文通过一个实例来进行讲解okhttp的post请求。
开始:
我们用的很多软件都有登录和注册,就拿登录来做文章。假设我们登录时需要传递邮箱和密码的json数据到后台,
后台对这个账号进行判断然后同样返回json数据,
{
"error_code":0,
"result":{
"user_email":"[email protected]",
"user_name":"XXX",
"user_img":1,
"user_gps":"0.0",
"user_tname":"XXX",
"user_rad":XX,
"user_pwd":""
}
}
我们解析这个json数据得到的error_code判断登录成功还是密码错误,得到的result即为用户信息。
第一步:构建类;
1.构建login类用来传参:
class login {
public String user_email;
public String user_pwd;
public login(String user_email,String user_pwd) {
this.user_email = user_email;
this.user_pwd = user_pwd;
}
}
2.构建Resupdata用来解析收到的json数据:
public class Resupdate {
public int err_code;
public Result result;
public int getError_code() {
return err_code;
}
public class Result{
public String user_email;
public String user_name;
public String user_img;
public String user_gps;
public String user_tname;
public String user_rad;
public String user_pwd;
public String getUser_email() {
return user_email;
}
public String getUser_name() {
return user_name;
}
public String getUser_rad() {
return user_rad;
}
public String getUser_tname(){
return user_tname;
}
public String getUser_gps(){
return user_gps;
}
public String getUser_pwd() {
return user_pwd;
}
}
}
注意,参数名要与后台一致。
第二步:请求开始;
public static Handler mHander;
public static void get_login(final Handler hander,String email,String pwd) {
OkHttpClient okHttpClient = new OkHttpClient();
login login1 = new login(email, pwd);
String json = new Gson().toJson(login1);//将login1类构建为json格式
RequestBody requestBody = FormBody.create(MediaType.parse("application/json; charset=utf-8"), json);
final Request request = new Request.Builder()
.url(URL_3)//请求的url
.post(requestBody)
.build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
//失败
@Override
public void onFailure(Call call, IOException e) {
System.out.println("失败" + e.toString());
}
//成功
@Override
public void onResponse(Call call, Response response) throws IOException {
System.out.println("url连接信息" + response.code());
System.out.println(response.toString());
if (response.code() == 200) {
String s2 = response.body().string();
System.out.println("接收json数据" + s2);
Resupdate resPingLun = new Gson().fromJson(s2, Resupdate.class);//解析收到的json数据为Resupdate类
if (resPingLun.getError_code() == 0) {
Message m = new Message();
m.what = 3;
m.obj = 1;
hander.sendMessage(m);
} else {
Message m = new Message();
m.what = 3;
m.obj = 0;
hander.sendMessage(m);
}
}
}
});
}
预览如下:
就请求成功了。
最后,hander。
开始,我们传递的参数有三个,还有一个hander没用到,别急,请求的最后这里:
if (resPingLun.getError_code() == 0) {
Message m = new Message();
m.what = 3;
m.obj = 1;
hander.sendMessage(m);
} else {
Message m = new Message();
m.what = 3;
m.obj = 0;
hander.sendMessage(m);
}
我们知道,当err_code为0时登录成功,为1时是密码错误。那么我们可以:
Handler hander = new Handler(){
@Override
public void handleMessage(@NonNull Message msg) {
switch (msg.what){
case 3:
int t1 = (int) msg.obj;
if(t1==1 ){
Toast.makeText(LoginActivity.this,"正在登陆",Toast.LENGTH_SHORT).show();
Intent intent=new Intent(LoginActivity.this, MainHomeActivity.class);
startActivity(intent);
finish();
}else {
Toast.makeText(LoginActivity.this,"密码错误",Toast.LENGTH_SHORT).show();
}
break;
}
}
};
没错,就是通过msg.what和msg.obj的值进行下一步操作,一一对应起来。至此,okhttp的post请求就完成了。
后记:
感谢王大佬,这一部分是他手把手教我的,非常感谢,当我拿到这部分时,感觉无从下手,还好遇见你,不然都不知道怎么交差。
昨夜西风凋碧树,独上高楼,望尽天涯路。欲寄彩笺兼尺素。山长水阔知何处?