Android和springboot的后端json数据库mysql传送
Android软件配制:
写一个 Android 注册界面 + 调用后端接口 的完整示例。
我们假设后端是你上面写的 Spring Boot 注册接口:
POST http://10.0.2.2:8080/api/register
一定要在编辑器的Androidstudio使用ip为10.0.2.2这个ip等同于调用电脑主机的本地接口,如果用localhost就是调用模拟器的本地接口,不是电脑的本地接口。
✅ 一、效果说明
界面:
用户名输入框
密码输入框
注册按钮
点击注册后,会将用户名和密码传到后端接口,显示返回结果。
✅ 二、布局文件 activity_main.xml
放在路径:res/layout/activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#F8F9FA"android:fillViewport="true"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center_horizontal"android:orientation="vertical"android:padding="32dp"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="注册" /><EditTextandroid:id="@+id/editUsername"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@android:drawable/editbox_background"android:hint="请输入用户名"android:inputType="textPersonName"android:padding="12dp" /><EditTextandroid:id="@+id/editPassword"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="16dp"android:background="@android:drawable/editbox_background"android:hint="请输入密码"android:inputType="textPassword"android:padding="12dp" /><Buttonandroid:id="@+id/btnRegister"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="24dp"android:background="@drawable/ic_launcher_background"android:text="注册"android:textColor="@android:color/white"android:textStyle="bold" /></LinearLayout>
</ScrollView>
✅ 三、Java 代码 MainActivity.java
放在 app/java/com/example/yourapp/
package com.example.demo1;import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;import androidx.appcompat.app.AppCompatActivity;import org.json.JSONObject;import java.io.IOException;import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;public class MainActivity extends AppCompatActivity {private EditText editUsername, editPassword;private Button btnRegister;// Spring Boot 后端地址private static final String REGISTER_URL = "http://10.0.2.2:8080/api/register";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);editUsername = findViewById(R.id.editUsername);editPassword = findViewById(R.id.editPassword);btnRegister = findViewById(R.id.btnRegister);btnRegister.setOnClickListener(v -> {String username = editUsername.getText().toString().trim();String password = editPassword.getText().toString().trim();if (username.isEmpty() || password.isEmpty()) {Toast.makeText(this, "请输入用户名和密码", Toast.LENGTH_SHORT).show();} else {registerUser(username, password);}});}private void registerUser(String username, String password) {OkHttpClient client = new OkHttpClient();JSONObject json = new JSONObject();try {json.put("username", username);json.put("password", password);} catch (Exception e) {e.printStackTrace();}RequestBody body = RequestBody.create(json.toString(),MediaType.parse("application/json; charset=utf-8"));Request request = new Request.Builder().url(REGISTER_URL).post(body).build();client.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {runOnUiThread(() ->Toast.makeText(MainActivity.this, "网络请求失败", Toast.LENGTH_SHORT).show());Log.e("Register", "请求失败: " + e.getMessage());}@Overridepublic void onResponse(Call call, Response response) throws IOException {String res = response.body().string();Log.d("Register", "响应: " + res);runOnUiThread(() -> {try {JSONObject obj = new JSONObject(res);Log.d("obj:", String.valueOf(obj));int code = obj.optInt("code", -1);String msg = obj.optString("message", "未知错误");Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();if (code == 200) {// 注册成功跳转到登录页startActivity(new Intent(MainActivity.this, LoginActivity.class));}} catch (Exception e) {e.printStackTrace();Toast.makeText(MainActivity.this, "解析返回数据失败", Toast.LENGTH_SHORT).show();}});}});}
}
注意:
E:\Androidstudioproject\demo1\app\src\main\AndroidManifest.xml
里面添加
android:networkSecurityConfig="@xml/network_security_config"
<uses-permission android:name="android.permission.INTERNET" />

E:\Androidstudioproject\demo1\app\src\main\res\xml里新建
network_security_config.xml
<?xml version="1.0" encoding="utf-8"?>
<network-security-config><!-- 允许访问本地开发服务器 --><domain-config cleartextTrafficPermitted="true"><domain includeSubdomains="true">10.0.2.2</domain></domain-config>
</network-security-config>
这个允许http明文。
✅ 四、Gradle 依赖
在 app/build.gradle 中添加 OkHttp 依赖:
dependencies {implementation 'com.squareup.okhttp3:okhttp:4.12.0'
}
✅ 五、后端接口配合
后端 Spring Boot 接口(前面写的):
POST http://localhost:8080/api/register
在 Android 模拟器中访问本机用:
http://10.0.2.2:8080/api/register
如果你用真机测试,请把服务器改成局域网 IP,比如:
http://192.168.1.100:8080/api/register
✅ 六、运行结果
🔹 输入用户名 + 密码 → 点击“注册”
🔹 Android 调用后端接口
🔹 后端返回 { "code":200, "message":"注册成功" }
🔹 App 弹出 Toast 提示 “注册成功”
springboot作后端,配置:
application.properties:
spring.application.name=demo
server.port=8080
spring.datasource.url=jdbc:mysql://localhost:3306/admins?useSSL=false&serverTimezone=UTCspring.datasource.username=root
#??mysql???????????
#?????????
spring.datasource.password=# JPA ??
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=truepom.xml
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><scope>provided</scope></dependency><dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><scope>runtime</scope></dependency><!-- MySQL JDBC 驱动 --><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><version>8.3.0</version> <!-- 或最新稳定版 --></dependency></dependencies>
package com.example.demo.register;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.HashMap;
import java.util.Map;@RestController
@RequestMapping("/api")
public class RegisterController {@Autowiredprivate UserRepository userRepository;@PostMapping("/register")public Map<String, Object> register(@RequestBody User user) {Map<String, Object> response = new HashMap<>();// 检查用户名是否已存在if (userRepository.existsByUsername(user.getUsername())) {response.put("code", 400);response.put("message", "用户名已存在");return response;}// 保存到数据库userRepository.save(user);response.put("code", 200);response.put("message", "注册成功");return response;}
}
package com.example.demo.register;import jakarta.persistence.*;@Entity
@Table(name="test_user")
public class User {private String username;private String password;@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id; // 自动生成主键public User() {}public User(String username, String password) {this.username = username;this.password = password;}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 void setId(Long id) {this.id = id;}public Long getId() {return id;}
}
package com.example.demo.register;import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;@Repository
public interface UserRepository extends JpaRepository<User, Long> {boolean existsByUsername(String username);
}
