【问题标题】:Retrofit Null Response onSuccess Method改造空响应 onSuccess 方法
【发布时间】:2025-12-14 16:45:02
【问题描述】:

我在 YouTube 中关注此 tutorial 进行改造,以在发布请求中发送对象,但在模拟器上遇到错误,响应为空 onResponse 方法。

问题:

主要活动:

public class MainActivity extends AppCompatActivity {


private EditText mName, mEmail, mAge, mTopics;
private Button mButton;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mName = findViewById(R.id.editText);
    mEmail = findViewById(R.id.editText2);
    mAge = findViewById(R.id.editText3);
    mTopics = findViewById(R.id.editText4);
    mButton = findViewById(R.id.button);

    mButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            User user = new User(
                    mName.getText().toString(),
                    mEmail.getText().toString(),
                    Integer.parseInt(mAge.getText().toString()),
                    mTopics.getText().toString().split(",")
            );

            //Added proof its not a NPE!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
            Log.d("Main", mName.getText().toString() +
                            mName.getText().toString()+ Integer.parseInt(mAge.getText().toString()) +
                            Integer.parseInt(mAge.getText().toString()) +mTopics.getText().toString().split(","));

            sendNetworkRequest(user);
        }
    });

}

private void sendNetworkRequest(User user) {
    Retrofit.Builder builder = new Retrofit.Builder()
            .baseUrl("http://10.0.2.2:3000/api/users/")
            .addConverterFactory(GsonConverterFactory.create());

    Retrofit retrofit = builder.build();
    UserClient client = retrofit.create(UserClient.class);
    Call<User> call = client.createAccount(user);
    call.enqueue(new Callback<User>() {
        @Override
        public void onResponse(Call<User> call, Response<User> response) {
            Toast.makeText(MainActivity.this, "Success UserID = "+ response.body(), Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onFailure(Call<User> call, Throwable t) {
            Toast.makeText(MainActivity.this, "Failure", Toast.LENGTH_SHORT).show();
        }
    });

}

}

非 NPE 证明:

用户客户端:

public interface UserClient {

    @POST("api/users")
    Call<User> createAccount(@Body User user);
}

用户:

public class User {

private Integer id;
private int age;
private String name, email;
private String [] topics;

public Integer getId() {
    return id;
}

public User(String name, String email, int age,  String[] topics) {
    this.age = age;
    this.name = name;
    this.email = email;
    this.topics = topics;
}

Node.JS

App.js

const express = require('express');
const bodyParser = require('body-parser');
const routes = require('./routes/api');
const mongoose = require('mongoose');

const app = express();

mongoose.connect('mongodb://localhost/user1',  { useMongoClient: true });
mongoose.Promise = global.Promise;


app.use(bodyParser.json());
app.use('/api', routes);

app.listen(process.env.port || 3000, function(){
    console.log('Using PORT 3000');
});

Api.js:

const express = require('express');
const router = express.Router();
const User = require('../models/user');

router.get('/users', function(req, res, next){
    res.send({type: "GET"});
});

router.post('/users', function(req, res, err){
    User.create(req.body).then(function(user){
        res.send(user);
    });
});

module.exports = router;

User.js

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const UserSchema = new Schema({
    name: {
        type: String
    },
    email: {
        type: String
    },
    age: {
        type: Number
    },
    topics: {
        type: String
    }
});

const User = mongoose.model('user', UserSchema);

module.exports = User;

我尝试过的:

  • 我尝试在我的终端上使用“ipconfig”更改我的机器的本地 IP 地址 BASE_URL。 = 'http://192.168.X.X:3000/api/users/'
  • UserClient 中使用 Headers 和 FormURLEncoded = @Headers("Content-Type: application/json") | @FormUrlEncoded。
  • 使用邮递员检查响应,成功发生。
  • 已检查 Robomongo 以进行验证/

邮递员:

获取请求

发布请求

Robomongo

【问题讨论】:

    标签: javascript java android node.js retrofit2


    【解决方案1】:

    BaseURL 应该是:baseUrl("http://10.0.2.2:3000/"),因为您的UserClient 接口具有路径:

    @POST("api/users")
    Call<User> createAccount(@Body User user);
    

    更新

    您的主题字段应为String 而不是String[]

    改变这个:

    private String [] topics;
    

    到这里:

    private String topics;
    

    【讨论】:

    • 有了这个改变,它触发了 onFailure toast,不确定是否按预期工作
    • 把logcat放在你的问题上
    • 没有错误,它执行了这个=@Override public void onFailure(Call&lt;User&gt; call, Throwable t) { Toast.makeText(MainActivity.this, "Failure", Toast.LENGTH_SHORT).show(); }
    【解决方案2】:

    也许您的请求不正确?

    尝试在 onResponse() 中添加对 null 的检查并像这样访问原始响应 response.errorBody.string()

    【讨论】:

    • 添加了if (response.body() == null){ Log.e("Error",response.code()+""); Log.e("Erro2", response.errorBody().toString()); return; }并获得了E/Error: 404 E/Erro2: okhttp3.ResponseBody$1@35d2a64c