初學(xué)Android之網(wǎng)絡(luò)封裝實(shí)例
前言:
模擬用戶登錄,從安卓發(fā)送請(qǐng)求到服務(wù)端校驗(yàn),再從服務(wù)端返回給安卓校驗(yàn)結(jié)果
1.在AndroidManifest.xml文件中添加網(wǎng)絡(luò)權(quán)限
<uses-permission android:name="android.permission.INTERNET"/>
?所放位置如圖所示:

?2.添加依賴,在app模塊下的build.gradle中添加okhttp和json的依賴
implementation group: 'com.squareup.okhttp3', name: 'okhttp', version: '4.9.0' implementation 'com.alibaba:fastjson:1.2.10'
?添加位置如圖所示,添加之后點(diǎn)擊
進(jìn)行編譯引入。

?3.封裝一個(gè)實(shí)體類,用于接收請(qǐng)求后的響應(yīng)信息。(響應(yīng),包括響應(yīng)碼code和響應(yīng)體body)
public class ResponseBody {
private String code;//響應(yīng)碼
private Object result;//響應(yīng)體
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public Object getResult() {
return result;
}
public void setResult(Object result) {
this.result = result;
}
}
4.封裝一個(gè)實(shí)體類(User)
public class User {
private int id;
private String username;
private String password;
private String phone;
private String name;
private String sex;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
?5.定義OkHttp工具,包括get,post兩種請(qǐng)求方式
import androidx.annotation.NonNull;
import com.alibaba.fastjson.JSONObject;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import okhttp3.Cookie;
import okhttp3.CookieJar;
import okhttp3.FormBody;
import okhttp3.HttpUrl;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class OkHttpUtils {
private static final String BASE_URL = "http://192.168.10.104:8080/"; //地址
private static OkHttpClient client = new OkHttpClient();
private static ResponseBody responseBody;
/**
因?yàn)镺kHttp自帶cookie效果,在構(gòu)造方法中進(jìn)行初始化,使其生效
*/
public OkHttpUtils(){
final Map<String, List<Cookie>> cookieStore=new HashMap<>();
client=new OkHttpClient.Builder().cookieJar(new CookieJar() {
@Override
public void saveFromResponse(@NonNull HttpUrl httpUrl, @NonNull List<Cookie> list) {
cookieStore.put(httpUrl.host(),list);
}
@NonNull
@Override
public List<Cookie> loadForRequest(@NonNull HttpUrl httpUrl) {
List<Cookie> cookies=cookieStore.get(httpUrl.host());
return cookies==null?new ArrayList<>():cookies;
}
}).build();
}
/**
* get請(qǐng)求,這里沒加線程控制,如果有需要可以加一下
*/
public static ResponseBody get(String url) {
Request request = new Request.Builder().url(getAbsoluteUrl(url)).build();
Response response = null;
try {
response = client.newCall(request).execute();
responseBody= dealResponse(response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
return responseBody;
}
/**
* post請(qǐng)求,參數(shù)是通過map鍵值對(duì)形式傳遞過來的
*/
public static ResponseBody post(String url, Map<String,Object> value) {
FormBody formBody=dealFormBody(value);
Request request = new Request.Builder().url(getAbsoluteUrl(url)).post(formBody).build();
Response response;
try {
response = client.newCall(request).execute();
responseBody= dealResponse(response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
return responseBody;
}
/**
將請(qǐng)求返回結(jié)果封裝到ResponseBody
*/
public static ResponseBody dealResponse(String result){
ResponseBody responseBody=new ResponseBody();
JSONObject json = JSONObject.parseObject(result);
responseBody.setCode(json.get("code")+"");
responseBody.setResult(json.get("data"));
return responseBody;
}
/*
處理請(qǐng)求參數(shù)
*/
public static FormBody dealFormBody(Map<String, Object> maps){
FormBody.Builder builder = new FormBody.Builder();
Set<String> keySet=maps.keySet();
for(Iterator<String> iterator = keySet.iterator(); iterator.hasNext();)
{
String key=iterator.next();
builder.add(key, maps.get(key)+"");
}
return builder.build();
}
/*
將url拼接起來,封裝成完整url
*/
private static String getAbsoluteUrl(String relativeUrl) {
return BASE_URL + relativeUrl;
}
}
6.定義好之后,測(cè)試訪問
我在MainActivity中添加按鈕進(jìn)行的測(cè)試,具體界面就不一一介紹了,測(cè)試代碼如下:
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import java.util.HashMap;
import java.util.Map;
import okhttp3.OkHttpClient;
public class MainActivity extends AppCompatActivity {
private OkHttpClient okHttpClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button login= findViewById(R.id.login);
//為界面上的按鈕設(shè)置監(jiān)聽事件,點(diǎn)擊就會(huì)調(diào)用下面的test方法
login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
test();
}
});
}
/*
*/
public void test(){
new Thread(()-> {
String url="user/info/getUser";
Map<String,Object> maps=new HashMap<>();
//將請(qǐng)求參數(shù)添加到map中
maps.put("username","zhangsan");
maps.put("password","123456");
ResponseBody result=OkHttpUtils.post(url,maps);//傳url參數(shù)和map
System.out.println(result.getCode());
User user= dealJsonToObject(result);
System.out.println(result.getResult());
System.out.println(user.getPhone());
}).start();
}
//處理json到實(shí)體類
public User dealJsonToObject(ResponseBody result){
JSONArray arr= (JSONArray) JSONArray.parse(result.getResult().toString());
JSONObject jsonObject = arr.getJSONObject(0);
User user = JSON.toJavaObject(jsonObject,User.class);
return user;
}
}
7.服務(wù)器是由java編寫

一個(gè)簡(jiǎn)易的網(wǎng)絡(luò)請(qǐng)求封裝,日后有更好的還會(huì)繼續(xù)優(yōu)化,希望可以幫助到你
到此這篇關(guān)于初學(xué)Android之網(wǎng)絡(luò)封裝實(shí)例的文章就介紹到這了,更多相關(guān)Android網(wǎng)絡(luò)封裝內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android實(shí)現(xiàn)自定義華麗的水波紋效果
關(guān)于Android的水波紋效果小編之前給大家也分享幾篇類似的,有興趣可通過下面的相關(guān)文章進(jìn)行查看,今天給大家再分享一個(gè)華麗的水波紋效果,這個(gè)效果很不錯(cuò),感興趣的可以參考借鑒。2016-08-08
以一個(gè)著色游戲展開講解Android中區(qū)域圖像填色的方法
這篇文章主要介紹了Android中實(shí)現(xiàn)區(qū)域圖像顏色填充的方法,文中以一個(gè)著色游戲?yàn)槔v解了邊界的填充等各種填色操作,需要的朋友可以參考下2016-02-02
談?wù)凙ndroid Fragments 詳細(xì)使用
本篇文章主要介紹了Android Fragments 詳細(xì)使用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-12-12
Android實(shí)現(xiàn)WebView刪除緩存的方法
這篇文章主要介紹了Android實(shí)現(xiàn)WebView刪除緩存的方法,實(shí)例分析了Android針對(duì)WebView操作緩存的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07
Android實(shí)現(xiàn)界面左右滑動(dòng)切換功能
相信大家一定都使用過手機(jī)QQ和微信之類的軟件,當(dāng)我們使用時(shí)不難發(fā)現(xiàn)其界面的切換不僅可以通過點(diǎn)擊頁標(biāo)簽來實(shí)現(xiàn),還可以通過左右滑動(dòng)來實(shí)現(xiàn)的,下面小編給大家介紹下如何實(shí)現(xiàn)這個(gè)功能2016-12-12
Android開發(fā)實(shí)現(xiàn)實(shí)時(shí)檢測(cè)藍(lán)牙連接狀態(tài)的方法【附源碼下載】
這篇文章主要介紹了Android開發(fā)實(shí)現(xiàn)實(shí)時(shí)檢測(cè)藍(lán)牙連接狀態(tài)的方法,涉及Android針對(duì)藍(lán)牙連接狀態(tài)的監(jiān)測(cè)操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-11-11
android studio的Handler簡(jiǎn)單實(shí)例代碼
今天通過實(shí)例代碼給大家介紹android studio的Handler簡(jiǎn)單用法,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-10-10
詳解Android Handler機(jī)制和Looper Handler Message關(guān)系
Handler是Android線程之間的消息機(jī)制,主要的作用是將一個(gè)任務(wù)切換到指定的線程中去執(zhí)行,準(zhǔn)確的說是切換到構(gòu)成Handler的looper所在的線程中去出處理。本文將詳細(xì)介紹Android Handler機(jī)制和Looper Handler Message關(guān)系。2021-06-06
kotlin 定義接口并實(shí)現(xiàn)回調(diào)的例子
這篇文章主要介紹了kotlin 定義接口并實(shí)現(xiàn)回調(diào)的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-03-03
Android Studio導(dǎo)入Project與Module的方法及實(shí)例
這篇文章主要介紹了Android Studio導(dǎo)入Project與Module的方法及實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-04-04

