初學(xué)Android之網(wǎng)絡(luò)封裝實(shí)例
前言:
模擬用戶登錄,從安卓發(fā)送請(qǐng)求到服務(wù)端校驗(yàn),再?gòu)姆?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 自定義View實(shí)現(xiàn)芝麻分曲線圖效果
這篇文章主要介紹了Android 自定義View實(shí)現(xiàn)芝麻分曲線圖效果的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下2016-11-11Android實(shí)現(xiàn)滑動(dòng)到頂部懸停的效果
這篇文章給大家介紹一種不常見的實(shí)現(xiàn)Android滑動(dòng)到頂部懸停效果的方式,對(duì)大家開發(fā)Android具有一定的參考借鑒價(jià)值,有需要的朋友們可以來一起看看。2016-09-09利用Jetpack Compose繪制可愛的天氣動(dòng)畫
Jetpack Compose是用于構(gòu)建原生Android UI的現(xiàn)代工具包。Jetpack Compose使用更少的代碼,強(qiáng)大的工具和直觀的Kotlin API,簡(jiǎn)化并加速了Android上的UI開發(fā)。本文將利用Jetpack Compose繪制可愛的天氣動(dòng)畫,感興趣的可以了解一下2022-01-01android實(shí)現(xiàn)節(jié)點(diǎn)進(jìn)度條效果
這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)節(jié)點(diǎn)進(jìn)度條效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05