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請求就完成了。
後記:
感謝王大佬,這一部分是他手把手教我的,非常感謝,當我拿到這部分時,感覺無從下手,還好遇見你,不然都不知道怎麼交差。
昨夜西風凋碧樹,獨上高樓,望盡天涯路。欲寄彩箋兼尺素。山長水闊知何處?