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);
}