美文网首页Android开发Android开发经验谈Android技术知识
毕设之 本地服务器搭建和前后台打通(二)

毕设之 本地服务器搭建和前后台打通(二)

作者: Jiwenjie | 来源:发表于2018-12-14 11:12 被阅读5次

    https://www.jianshu.com/p/5d1fe5b24993 这篇文章已经介绍了后台的搭建,那么接下来就是请求的获取了

    首先新建一个 Android 项目,这个就不用过多介绍了,相信接触过的都有了解,这里不是重点。

    网络请求是用 RxJava + Retrofit 实现。使用的是 夜神 模拟器

    • 首先添加依赖
    final String support_design_version = "27.1.1"
    final String ktx_version = "0.3"
    final String constraint_version = "1.1.3"
    final String circle_image_version = "2.2.0"
    final String glide_version = "4.7.1"
    final String rx_android_version = "2.0.2"
    final String rx_java_version = "2.1.1"
    final String retrofit_version = "2.3.0"
    final String logging_version = "3.9.0"
    final String leak_canary_version = "1.6.1"
    final String paging_version = "1.0.1"
    final String lifecycle_version = "1.1.1"
    
    api "com.android.support:appcompat-v7:$support_design_version"
        api "com.android.support:appcompat-v7:$support_design_version"
        api "com.android.support:support-v4:$support_design_version"
        api "com.android.support:design:$support_design_version"
        api "com.android.support:cardview-v7:$support_design_version"
        api "com.android.support:recyclerview-v7:$support_design_version"
        api "com.android.support:gridlayout-v7:$support_design_version"
        api "com.android.support.constraint:constraint-layout:$constraint_version"
        api "de.hdodenhof:circleimageview:$circle_image_version"
    
        api "android.arch.paging:runtime:$paging_version"
        api "android.arch.lifecycle:extensions:$lifecycle_version"
    
        api "androidx.core:core-ktx:$ktx_version"
        api "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    
        api "com.github.bumptech.glide:glide:$glide_version"
        annotationProcessor "com.github.bumptech.glide:compiler:$glide_version"
    
        api "io.reactivex.rxjava2:rxandroid:$rx_android_version"
        api "io.reactivex.rxjava2:rxjava:$rx_java_version"
        api "com.squareup.retrofit2:retrofit:$retrofit_version"
        api "com.squareup.retrofit2:converter-gson:$retrofit_version"
        api "com.squareup.retrofit2:adapter-rxjava2:$retrofit_version"
        api "com.squareup.retrofit2:converter-scalars:$retrofit_version"
        api "com.squareup.okhttp3:logging-interceptor:$logging_version"
    
        debugApi "com.squareup.leakcanary:leakcanary-android:$leak_canary_version"
        releaseApi "com.squareup.leakcanary:leakcanary-android-no-op:$leak_canary_version"
    
    • 定义接口
      注意哦,这里不是单纯的 Retrofit,还是结合 RxJava 的,所以返回值定义的不是 Call
    package com.kuky.base.kotlin.demo.test.api;
    
    import com.kuky.base.kotlin.demo.test.bean.UserInfo;
    import io.reactivex.Observable;
    import retrofit2.http.POST;
    import retrofit2.http.Query;
    
    /**
     * author:Jiwenjie
     * email:278630464@qq.com
     * time:2018/12/13
     * desc:
     * version:1.0
     */
    public interface ApiService {
        @POST("user/login")
        Observable<UserInfo> getLoginUser(@Query("username") String username, @Query("password") String password);
    }
    
    
    • UserInfo 实体类
      这里定义实体类的时候需要注意,和后台定义的实体类会略有区别,后台的实体类就和数据库的保持一致就行,但是在这里需要加上返回值的状态。因为我们使用 Gson 来自动解析数据,如果不是对应完整的话会解析失败
    package com.kuky.base.kotlin.demo.test.bean;
    
    import java.io.Serializable;
    import java.util.List;
    
    /**
     * author:Jiwenjie
     * email:278630464@qq.com
     * time:2018/12/14
     * desc:
     * version:1.0
     */
    public class UserInfo implements Serializable {
    
        /**
         * {
         * "code":200,
         * "message":"succeed",
         * "user":{
         * "id":2,
         * "username":"admin",
         * "phone":"13965972584",
         * "isAdmin":0}
         * }
         **/
        private Integer code;
        private String message;
        private User user;
    
        public Integer getCode() {
            return code;
        }
    
        public void setCode(Integer code) {
            this.code = code;
        }
    
        public String getMessage() {
            return message;
        }
    
        public void setMessage(String message) {
            this.message = message;
        }
    
        public User getUser() {
            return user;
        }
    
        public void setUser(User user) {
            this.user = user;
        }
    
        public class User implements Serializable {
    
            private Integer id;
            private String username;
            private String phone;
            private int isAdmin;
            private String avatar;
            private String password;
            private List<UserFile> files;
    
            public class UserFile implements Serializable {
    
                private int id;
                private String fileName;
                private String filePath;
    
                @Override
                public String toString() {
                    return "UserFile{" +
                            "id=" + id +
                            ", fileName='" + fileName + '\'' +
                            ", filePath='" + filePath + '\'' +
                            '}';
                }
    
                public int getId() {
                    return id;
                }
    
                public void setId(int id) {
                    this.id = id;
                }
    
                public String getFileName() {
                    return fileName;
                }
    
                public void setFileName(String fileName) {
                    this.fileName = fileName;
                }
    
                public String getFilePath() {
                    return filePath;
                }
    
                public void setFilePath(String filePath) {
                    this.filePath = filePath;
                }
    
            }
    
    
            @Override
            public String toString() {
                return "User {" +
                        "id=" + id +
                        ", username='" + username + '\'' +
                        ", phone='" + phone + '\'' +
                        ", isAdmin=" + isAdmin +
                        ", avatar='" + avatar + '\'' +
                        ", password='" + password + '\'' +
                        '}';
            }
    
            public Integer getId() {
                return id;
            }
    
            public void setId(Integer id) {
                this.id = id;
            }
    
            public String getUsername() {
                return username;
            }
    
            public void setUsername(String username) {
                this.username = username;
            }
    
            public String getPhone() {
                return phone;
            }
    
            public void setPhone(String phone) {
                this.phone = phone;
            }
    
            public String getAvatar() {
                return avatar;
            }
    
            public void setAvatar(String avatar) {
                this.avatar = avatar;
            }
    
            public int getIsAdmin() {
                return isAdmin;
            }
    
            public void setIsAdmin(int isAdmin) {
                this.isAdmin = isAdmin;
            }
    
            public String getPassword() {
                return password;
            }
    
            public void setPassword(String password) {
                this.password = password;
            }
    
            public List<UserFile> getFiles() {
                return files;
            }
    
            public void setFiles(List<UserFile> files) {
                this.files = files;
            }
        }
    }
    
    
    • Constant 文件,里面的 url 的地址
    public class Constans {
        public static String BASE_URL = "http://172.16.134.10:8080/";
    }
    
    

    因为我们需要连接本机,所以需要加上 IP 地址,对应这个查询直接 ipconfig 就行

    • Activity 文件
    package com.kuky.base.kotlin.demo.test;
    
    import android.annotation.SuppressLint;
    import android.app.ProgressDialog;
    import android.os.Bundle;
    import android.support.annotation.Nullable;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.widget.Button;
    import android.widget.Toast;
    import com.kuky.base.android.kotlin.RetrofitManager;
    import com.kuky.base.kotlin.demo.R;
    import com.kuky.base.kotlin.demo.test.api.ApiService;
    import com.kuky.base.kotlin.demo.test.bean.UserInfo;
    import io.reactivex.android.schedulers.AndroidSchedulers;
    import io.reactivex.functions.Consumer;
    import io.reactivex.schedulers.Schedulers;
    import okhttp3.*;
    
    /**
     * author:Jiwenjie
     * email:278630464@qq.com
     * time:2018/12/13
     * desc:测试连接后台部分,查看是否能成功
     * version:1.0
     */
    @SuppressWarnings("ALL")
    public class TestConnectActivity extends AppCompatActivity {
    
        private ProgressDialog progressDialog;
        private Button btn;
    
        /** {"code":200,"message":"succeed","user":{"id":2,"username":"admin","phone":"13965972584","isAdmin":0}} **/
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_test);
            progressDialog = new ProgressDialog(getApplicationContext());
            btn = findViewById(R.id.btn_test);
            btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    conn();
                }
            });
        }
    
        /**
         * 连接方法
         */
        @SuppressLint("CheckResult")
        private void conn() {
            if (progressDialog == null) {
                progressDialog = new ProgressDialog(this);
                progressDialog.show();
            }
    
            RequestBody body = new FormBody.Builder()   //提交表单数据
                    .add("username", "admin")
                    .add("password", "123456")
                    .build();
    
            /**
             * RxJava + Retrofit
             */
            RetrofitManager.INSTANCE.setBaseUrl(Constans.BASE_URL);
            RetrofitManager.INSTANCE.getMRetrofit().create(ApiService.class)
                    .getLoginUser("admin", "123456")
                    .subscribeOn(Schedulers.io())
                    .unsubscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Consumer<UserInfo>() {
                        @Override
                        public void accept(UserInfo userInfo) throws Exception {
                            Toast.makeText(getApplicationContext(), userInfo.getUser().getUsername(), Toast.LENGTH_LONG).show();
                            btn.setText(userInfo.getUser().getUsername() + "登陆成功");
                        }
                    }, new Consumer<Throwable>() {
                        @Override
                        public void accept(Throwable throwable) throws Exception {
                            Toast.makeText(getApplicationContext(), "失败错误", Toast.LENGTH_LONG).show();
                        }
                    });
    
        }
    
    }
    
    

    布局文件就不贴了,只有一个 Button。
    之后点击运行

    xs17.png

    这是刚运行的界面


    xs18.png

    这是点击运行后的界面。

    接下来我们来看下后台的请求显示


    xs19.png

    讷,从这可以看出前后台彻底打通了。接下来我们就可以搞事情了。
    我会在毕设完成前不定期的更新文章总结,希望大家多多指教。代码都会接下来上传到 github 上。目前已经传了后台的代码

    https://github.com/jiwenjie/Graduation_BackStage

    前台部分在我规划好正式开始后也会放出。

    相关文章

      网友评论

        本文标题:毕设之 本地服务器搭建和前后台打通(二)

        本文链接:https://www.haomeiwen.com/subject/fovwhqtx.html