okhttp:post请求实战详解(Android)

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时是密码错误。那么我们可以:

扫描二维码关注公众号,回复: 11328319 查看本文章
    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请求就完成了。

后记:

感谢王大佬,这一部分是他手把手教我的,非常感谢,当我拿到这部分时,感觉无从下手,还好遇见你,不然都不知道怎么交差。

昨夜西风凋碧树,独上高楼,望尽天涯路。欲寄彩笺兼尺素。山长水阔知何处?
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43912621/article/details/106454793