android studio 和 spring boot 基于 Okhttp 的前后端连接实现
问题背景
作者最近在写安卓大作业,需要实现android studio
和后端连接,尝试了一下django
的后端,一直连不上,等之后作者探索出来再来写一篇博客,后来换成spring boot
的后端,资料确实是更多,在连接过程也遇到了一些小问题,查阅了些资料得到解决,于是做个记录,方便遇到相同问题的读者能够顺利解决。
前后端连接实例
这里直接列举一个简单的前后端连接实例,方便大家学习参考
实例概述
本次实例使用android studio
完成app的前端,使用spring boot
完成app的后端,前端当中写一个按钮,点击后把”hello”传递给后端,后端接收到”hello”后把”hi”传递回前端,并显示在按钮上,其中使用OkHttp
的前后端通信方式。
实例的实现流程
1、环境配置
- 前端作者是用
android studio
来制作的,所以直接上官网下载就行; - 后端
spring boot
是基于intellj idea
的,可以上官网下载intellj idea
- 语言这里使用的是
java8
2、spring boot后端项目创建
需要注意,intellj idea
专业版和社区版在这里应该是会有所不同,作者使用的是专业版(学生认证的,可能需要几天)
intellj idea
左上角点击文件->新建->项目
,左侧选择Spring Initializr
,自己设定项目名称
、选择项目位置
,创建git仓库
按需点击,语言
这里选择java
(Kotlin和Groovy作者都不认识hhh),类型
(包管理)选择Maven
,组名、工件、软件包
名称会按照项目名称自动修改,JDK
和java语言
的版本需要适配,作者这里选的是jdk1.8和java8如果选错了可以创建后在文件->项目结构
当中修改,打包
这里选择jar
(如果有部署到专门的应用服务器的需求,可以选择WAR,这个后期也是可以修改的,这里不赘述)。完成后点击下一步
。
上面的spring boot
选择2版本里面不带SNAPSHOT的最新版,作者这里是2.7.10。随后在依赖项当中搜索Spring Web
或者点击Web展开即可看见Sping Web
,点击勾选。点击右下角创建
即可。
3、spring boot后端项目编写
这里使用spring boot
的好处就是啥都不需要额外配置,直接实现功能代码就完事。
1 | //在 项目根目录下 src->main->java->com.example.xx 右键 新建-> java类,命名为MessageController,代码如下 |
4、spring boot后端项目运行
打开后端项目根目录下src/main/java/com.example.xx
,在这里,有一个土著java文件,其名称和项目名称有关系,我这里是backendapplication
,打开后点击工具栏的运行
符号就是一个三角形。
5、android studio前端项目创建
打开android studio
后,new project
,选择一个empty activity
,自己设定项目名称
、选择项目位置
,语言为java
,minimum SDK
选择默认是Android 7.0
,点击finish即可创建项目
6、android studio前端代码编写
这里主要涉及okhttp的引入,前后端环境的相关配置,okhttp的调用,目标url设置等关键问题
1 | // 首先在app项目下的build.gradle引入okhttp依赖 |
1 | <!-- 其次是在AndroidManifest.xml当中实现前后端环境相关的配置 --> |
1 | <!-- 这里是实现app/src/main/res/layout/activity_main.xml当中的按钮 --> |
1 | // 这里是在app/src/main/java/com.example.xx/MainActivity实现okhttp的调用以及目标url设置 |
7、android studio前端项目运行
在android studio右上角选择虚拟设备(如果没有可以直接创建,读者可以自行搜索,这里不再赘述),设备的选择并不重要,有就行,随后点击运行
的三角形符号
8、实例效果描述
运行出来之后会有一个send的按钮,点击之后会给后端传一个hello,后端如果识别到hello会给前端传hi,然后会把hi显示在按钮上,按钮上的文字从send变为hi
相关问题与解决
- intellj idea新建spring boot项目后编译报错,报错信息如下:
1
2报错1:无法访问org.springframework.boot.springapplication错误的类文件:/c:/users/lxt13/.m2/repository/org/springframework/boot/spring-boot/3.0.5/spring-boot-3.0.5.jar!/org/springframework/boot/springapplication.class 类文件具有错误的版本 61.0, 应为 52.0 请删除该文件或确保该文件位于正确的类路径子目录中。
报错2:java: 警告: 源发行版 17 需要目标发行版 17- 原因解释:这是因为使用了2023年的最新版的spring boot3不兼容的java版本造成,spring boot3全面支持java17,版本小于17的java不能够支持其运行
- 解决方式: 在前面的
实例的实现流程
的2、spring boot后端项目创建
当中提到,选用spring boot2的最新版即可解决。或者读者考虑配置java17的相关环境,从而体验比较新的spring boot3
- android studio对于拒绝连接http这种不安全协议,报错信息为
java.net.UnknownServiceException: CLEARTEXT communication not supported
- 原因解释: android studio当中的一个默认设置的,在android 7.0以后,为了手机操作系统的安全,android studio默认拒绝使用http这种通过明文传输的不安全协议
- 解决方式: 在前面的
实例的实现流程
的6、android studio前端代码编写
当中提到,在AndroidManifest.xml
当中,给application
的属性增加一条android:usesCleartextTraffic="true"
即可
- android studio缺少internet权限,报错信息为
java.net.SocketException: socket failed: EPERM (Operation not permitted)
- 原因解释: 使用okhttp实现前后端连接需要赋予android studio网络权限
- 解决方式: 在前面的
实例的实现流程
的6、android studio前端代码编写
当中提到,在AndroidManifest.xml
当中,在manifest
标签下,与application
同级位置添加上<uses-permission android:name="android.permission.INTERNET" />
即可
- android studio中baseurl的选择:
- 需要注意,这里的android studio的程序是在andorid虚拟设备上运行,与spring boot并不在同一个设备上,这里的url不能使用
127.0.0.1
或者localhost
,这里的url设置是比较有讲究的,在Android模拟器上运行应用,需要使用特殊的IP地址 10.0.2.2,因为模拟器使用了虚拟网络,这个特殊IP地址会将请求转发到宿主机(运行模拟器的电脑)。当然这里的url可以设置为电脑当前的ip地址,不过存在一个小缺陷就是别人打开这个项目时候,如果ip发生了变化,那么就无法运行。如果是在实际的手机上测试这个应用,需要这里的url需要设置为spring boot所在设备的ip
- 需要注意,这里的android studio的程序是在andorid虚拟设备上运行,与spring boot并不在同一个设备上,这里的url不能使用