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

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center_horizontal"
        android:orientation="vertical"
        android:padding="32dp">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="注册" />

        <EditText
            android: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" />

        <EditText
            android: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" />

        <Button
            android: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";

    @Override
    protected 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() {
            @Override
            public void onFailure(Call call, IOException e) {
                runOnUiThread(() ->
                        Toast.makeText(MainActivity.this, "网络请求失败", Toast.LENGTH_SHORT).show()
                );
                Log.e("Register", "请求失败: " + e.getMessage());
            }

            @Override
            public 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=UTC


spring.datasource.username=root
#??mysql???????????
#?????????
spring.datasource.password=

# JPA ??
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

pom.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 {

    @Autowired
    private 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);
}
相关推荐
峥嵘life19 小时前
Android EDLA项目导入mainline包后蓝牙签名报错分析解决
android·gitee
熙客1 天前
Gitee:代码管理
gitee·devops·源代码管理
阿部多瑞 ABU5 天前
# AI高精度提示词生成项目——3D-VR 课件—— 最终仓库级 AI 提示词:生成《EduVR Studio》—— 专业级 3D-VR 课件创作平台
gitee·开源·github·aigc·ai编程·1024程序员节
胖咕噜的稞达鸭5 天前
封装map和set(红黑树作为底层结构如何实现map和set插入遍历)
c语言·数据结构·c++·算法·gitee·哈希算法
期待のcode6 天前
gitee与github远程仓库
gitee·github
summer夏1237 天前
gitee简易的命令入门教程
gitee
AlexMercer10129 天前
Ubuntu从零开始配置Git
c++·git·ubuntu·gitee
像风一样自由202010 天前
代码仓库码云(gitee)配置环境记录
gitee
sulikey10 天前
从零配置一个规范的 Python Git 仓库(适用于 Gitee / GitHub)
git·python·pycharm·gitee·github