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);
}
相关推荐
QN1幻化引擎3 天前
SFA 信号场注意力:用8KB参数换248x KV Cache压缩,边缘设备也能跑长序列
人工智能·算法·gitee·gitlab
J14818529146 天前
md文件图片在其他地方不能预览
gitee
Mark White8 天前
使用 Codex 自动完成 Gitee 仓库全托管
gitee
hkj88089 天前
vscode提交gitee远程仓库出现Permission denied (publickey)解决方法
ide·vscode·gitee
雪的季节10 天前
ffmpeg源码国内gitee下载
ffmpeg·gitee
御坂嘀喵12 天前
Speed Tools:一套低侵入的 Android 插件化 + 动态换肤 + 字体切换框架
android·gitee
风信子IT人18 天前
【5天实战】从零构建AI-Native组织:飞书+Bot+Gitee全链路自动化实战指南—Day 5:完整场景实操验证
gitee·自动化·飞书·ai-native·bot开发
zakariyaa3318 天前
Android 绘制调度机制
android·gitee
m0_526119401 个月前
ssh key生成,gitee配置ssh
运维·gitee·ssh
我最爱吃鱼香茄子1 个月前
【保姆级】Git配置用户名和邮箱(全局/局部)解决提交记录不识别、贡献图不亮问题
git·gitee·github·小白教程·git配置·程序员开发工具