初学Android之网络封装实例

前言:

模拟用户登录,从安卓发送请求到服务端校验,再从服务端返回给安卓校验结果

1.在AndroidManifest.xml文件中添加网络权限

<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'

 添加位置如图所示,添加之后点击进行编译引入。

 3.封装一个实体类,用于接收请求后的响应信息。(响应,包括响应码code和响应体body)

public class ResponseBody {
    private String code;//响应码
    private Object result;//响应体
    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.封装一个实体类(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两种请求方式

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;
/**
因为OkHttp自带cookie效果,在构造方法中进行初始化,使其生效
*/
    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请求,这里没加线程控制,如果有需要可以加一下
     */
    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请求,参数是通过map键值对形式传递过来的
     */
    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;
    }
/**
将请求返回结果封装到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;
    }
/*
处理请求参数
*/
    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.定义好之后,测试访问

我在MainActivity中添加按钮进行的测试,具体界面就不一一介绍了,测试代码如下:


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);
//为界面上的按钮设置监听事件,点击就会调用下面的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<>();
//将请求参数添加到map中
            maps.put("username","zhangsan");
            maps.put("password","123456");
            ResponseBody result=OkHttpUtils.post(url,maps);//传url参数和map
            System.out.println(result.getCode());
            User user= dealJsonToObject(result);
            System.out.println(result.getResult());
            System.out.println(user.getPhone());
        }).start();
    }
   //处理json到实体类
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.服务器是由java编写

一个简易的网络请求封装,日后有更好的还会继续优化,希望可以帮助到你

到此这篇关于初学Android之网络封装实例的文章就介绍到这了,更多相关Android网络封装内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android 中Volley二次封装并实现网络请求缓存

    Android 中Volley二次封装并实现网络请求缓存 Android目前很多同学使用Volley请求网络数据,但是Volley没有对请求过得数据进行缓存,因此需要我们自己手动缓存. 一下就是我的一种思路,仅供参考 具体使用方法为: HashMap<String,String> params = new HashMap<>(); params.put("id", "1"); params.put("user", &quo

  • Android Xutils3网络请求的封装详解及实例代码

     Xutils3网络请求的封装详解 封装了一个Xutil3的网络请求工具类,分享给大家,本人水平有限,不足之处欢迎指出. 使用前先配置xutils3: 1.gradle中添加 compile 'org.xutils:xutils:3.3.40' 2.自定义Application /** * Created by Joe on 2016/9/25. */ public class MyApp extends Application { @Override public void onCreate(

  • Android基于OkHttpUtils网络请求的二次封装

    OkHttpUtils网络请求为什么进行二次封装? 1.减少代码量 2.后期换网络处理框架方便 二次封装的实现原理 1.将网络请求提取在一个方法中 2.对里面的可变参数,可以通过参数传递过去,也可以提供一个set方法传递过去 3.对于请求失败和成功,我们可以使用接口回调,让调用该方法的对象处理 封装后的网络处理类的功能 1.网络请求 2.xml数据转换成javaBean 每一个处理网络请求的ListView都要处理的3数据方法 1.初始化数据 2.下拉刷新数据 3.上拉加载数据 封装前的代码 /

  • Android中网络框架简单封装的实例方法

    Android中网络框架的简单封装 前言 Android作为一款主要应用在移动终端的操作系统,访问网络是必不可少的功能.访问网络,最基本的接口有:HttpUrlConnection,HttpClient,而在后续的发展中,出现了Volley,OkHttp,Retrofit等网络封装库.由于各种原因,在实际的项目开发中,我们可能会需要在项目的版本迭代中,切换网络框架.如果对于网络框架没有好的封装,那么当需要切换网络框架时,可能就会有大量的迁移工作要做. 封装网络框架 在架构设计中,面向接口和抽象,

  • 初学Android之网络封装实例

    前言: 模拟用户登录,从安卓发送请求到服务端校验,再从服务端返回给安卓校验结果 1.在AndroidManifest.xml文件中添加网络权限 <uses-permission android:name="android.permission.INTERNET"/>  所放位置如图所示:  2.添加依赖,在app模块下的build.gradle中添加okhttp和json的依赖 implementation group: 'com.squareup.okhttp3', na

  • Android 判断网络状态实例详解

    Android 判断网络状态实例详解 实例代码 package com.example.android; import java.io.IOException; import java.net.HttpURLConnection; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.net.URL; import java.util.

  • Android Toast提示封装实例代码

    Android Toast提示封装 Android中经常用到Toast提示,项目中很多Toast提示,写很长的一行,简单的封装一下,将Toast方法提出来,很方便使用: 实例代码: /** * 提示字符串 * short Toast * @param context * @param text * by Hankkin at:2015-10-07 21:14:43 */ public static void showToast(Context context, String text) { To

  • android Retrofit2网络请求封装介绍

    目录 1. Retrofit使用 2. Retrofit封装 3. RetrofitUtil使用 最后 1. Retrofit使用 Retrofit是一个现在网络请求框架,先来说一下怎么使用 网络权限(添加到AndroidManifest.xml) <uses-permission android:name="android.permission.INTERNET" /> gradle依赖(添加到build.gradle) implementation("com.

  • 微信小程序之网络请求简单封装实例详解

    微信小程序之网络请求简单封装实例详解 在微信小程序中实现网络请求相对于Android来说感觉简单很多,我们只需要使用其提供的API就可以解决网络请求问题. 普通HTTPS请求(wx.request) 上传文件(wx.uploadFile) 下载文件(wx.downloadFile) WebSocket通信(wx.connectSocket) 为了数据安全,微信小程序网络请求只支持https,当然各个参数的含义就不在细说,不熟悉的话可以:可以去阅读官方文档的网络请求api,当我们使用request

  • 关于ajax网络请求的封装实例

    实例代码: // 封装的ajax网络请求函数 // obj 是一个对象 function AJAX(obj){ //跨域请求 if (obj.dataType == "jsonp") { //在这里 callback 必须是全局变量 保证函数消失的时候 这个变量不可以被销毁 //处理一下函数名(防止多个网络请求 函数名字相同 出现紊乱的情况) var hehe = "callBack" + "_" + new Date().getTime() +

  • 微信小程序封装http访问网络库实例代码

    微信小程序封装http访问网络库实例代码 之前都是使用LeanCloud为存储,现在用传统API调用时做如下封装 文档出处:https://mp.weixin.qq.com/debug/wxadoc/dev/api/network-request.html 代码如下: var HOST = 'http://localhost/lendoo/public/index.php/'; // 网站请求接口,统一为post function post(req) { //发起网络请求 wx.request(

  • Android 动态注册监听网络变化实例详解

    Android 动态注册监听网络变化实例详解 新建一个BroadcastTest项目,然后修改MainActivity中的代码,如下: public class MainActivity extends AppCompatActivity { private IntentFilter intentFilter; private NetworkChangeReceiver networkChangeReceiver; @Override protected void onCreate(Bundle

  • Android从网络中获得一张图片并显示在屏幕上的实例详解

    Android从网络中获得一张图片并显示在屏幕上的实例详解 看下实现效果图: 1:androidmanifest.xml的内容 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="cn.capinftotech.image" an

  • 详解微信小程序网络请求接口封装实例

    网络请求封装实例 实现定制要求和方便调用,对微信小程序的网络请求接口进行了封装 封装位置:app.js,方便全局调用 实现方法调用,只用关注接口url和入参 默认和自定义的请求成功.失败和完成的回调处理 可设置请求失败自动重新请求的次数 可以防止重复提交 每个请求设定requestCode 代码 直接将这个方法放在了app.js中 /** * 接口公共访问方法 * @param {Object} urlPath 访问路径 * @param {Object} params 访问参数(json格式)

随机推荐