Android:okhttp使用json傳參發送post請求,獲取返回json

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請求就完成了。

後記:

感謝王大佬,這一部分是他手把手教我的,非常感謝,當我拿到這部分時,感覺無從下手,還好遇見你,不然都不知道怎麼交差。

昨夜西風凋碧樹,獨上高樓,望盡天涯路。欲寄彩箋兼尺素。山長水闊知何處?
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章