You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android扫码App数据无法上传至MongoDB Atlas问题排查

问题解决步骤

你的Android端调用后端API失败主要有几个核心问题,以下是针对性的修复方案:

1. 修正BaseUrl的localhost问题

Android模拟器里的localhost指向模拟器自身,无法访问你电脑上运行的后端服务。需要替换成:

  • 针对Android模拟器:使用http://10.0.2.2:3000(这是模拟器映射到主机localhost的特殊IP)
  • 针对真机测试:使用你电脑的局域网IP(比如http://192.168.1.100:3000,可通过ipconfig/ifconfig查看)

2. 统一请求与后端的接收格式

你的后端通过req.body接收JSON格式数据,但Android端用了@FormUrlEncoded发送表单数据,格式不匹配,二选一修改即可:

方案A:修改后端支持表单数据(无需大改Android代码)

在你的Node.js后端代码中添加urlencoded中间件,让它能解析表单数据:

// 在app.post路由之前添加
app.use(express.urlencoded({ extended: true }));

然后简化Android的addStuff方法,直接传递原始字符串:

public void addStuff(String data){
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("http://10.0.2.2:3000")
            .addConverterFactory(ScalarsConverterFactory.create())
            .build();
    API api = retrofit.create(API.class);
    // 直接传入data字符串,无需包装成JSON
    Call<Void> call = api.sendData(data);
    call.enqueue(new Callback<Void>() {
        @Override
        public void onResponse(@NonNull Call<Void> call, @NonNull Response<Void> response) {
            if (response.isSuccessful()) {
                Toast.makeText(getApplicationContext(), "数据已成功存入数据库", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(getApplicationContext(), "数据库写入失败:" + response.message(), Toast.LENGTH_SHORT).show();
            }
        }
        @Override
        public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
            // 打印具体错误信息,方便调试
            t.printStackTrace();
            Toast.makeText(getApplicationContext(), "请求失败:" + t.getMessage(), Toast.LENGTH_LONG).show();
        }
    });
}

方案B:Android发送JSON格式请求(更匹配后端当前逻辑)

修改Retrofit接口,用@Body传递JSON对象:

public interface API {
    @POST("/items")
    @Headers("Content-Type: application/json")
    Call<Void> sendData(@Body JSONObject data);
}

然后修改addStuff方法,使用Gson转换器处理JSON(需先添加依赖):

public void addStuff(String data){
    JSONObject jsonObject = new JSONObject();
    try {
        jsonObject.put("data", data);
    } catch (JSONException e) {
        e.printStackTrace();
    }

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("http://10.0.2.2:3000")
            .addConverterFactory(GsonConverterFactory.create())
            .build();
    API api = retrofit.create(API.class);
    Call<Void> call = api.sendData(jsonObject);
    call.enqueue(new Callback<Void>() {
        @Override
        public void onResponse(@NonNull Call<Void> call, @NonNull Response<Void> response) {
            if (response.isSuccessful()) {
                Toast.makeText(getApplicationContext(), "数据已成功存入数据库", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(getApplicationContext(), "数据库写入失败:" + response.message(), Toast.LENGTH_SHORT).show();
            }
        }
        @Override
        public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
            t.printStackTrace();
            Toast.makeText(getApplicationContext(), "请求失败:" + t.getMessage(), Toast.LENGTH_LONG).show();
        }
    });
}

同时在app模块的build.gradle中添加Gson转换器依赖:

implementation 'com.squareup.retrofit2:converter-gson:2.9.0'

3. 确认网络权限

确保AndroidManifest.xml中已添加网络权限:

<uses-permission android:name="android.permission.INTERNET" />

调试建议

在onFailure回调中打印Throwable的详细信息(t.printStackTrace()),能快速定位具体错误类型,比如连接超时、格式不匹配等。

内容的提问来源于stack exchange,提问作者Harambe Lives

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 13:05:17