对成功方法改造空值响应
我正在按照YouTube中的这个教程进行Retrofit,用于在发布请求中发送对象,但在模拟器上遇到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(); } }); }
}
非NPEcertificate:
UserClient:
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;
我曾尝试过:
- 我已经尝试使用我的terminal上的'ipconfig'更改我的机器的本地IP地址的BASE_URL 。 =' http://192.168.XX:3000 / api / users / '
- 在UserClient中使用Headers和FormURLEncoded = @Headers(“Content-Type:application / json”)| @FormUrlEncoded。
- 使用邮递员检查成功发生的答复。
- 检查Robomongo进行validation/
邮差:
获取请求
发布请求
Robomongo
BaseURL应该是:baseUrl baseUrl("http://10.0.2.2:3000/")
因为你的UserClient
接口有path:
@POST("api/users") Call<User> createAccount(@Body User user);
UPDATE
您的主题字段应该是String
不是String[]
改变这个:
private String [] topics;
对此:
private String topics;
也许你正在做一个不好的要求?
尝试在onResponse()中添加一个空的检查,并像这个response.errorBody.string()一样访问原始响应。