我正在尝试使用Retrofit在我的应用程序上实现用户注册,但是我一直收到此错误,不确定出什么问题了,java.lang.IllegalStateException:应该是BEGIN_OBJECT,但是是BEGIN_ARRAY
这是邮递员的回复
{
"isSuccessful": true,
"message": "successful",
"user": {
"name": "Jackline Jazz",
"email": "jackijazz@gmail.com",
"phone": "000000"
}
}
我有两个模型类,即User模型类
data class User(
val name: String,
val email:String,
val phone:String
)
还有登录响应类
data class LoginResponse(
val isSuccessful:Boolean,
val message: String,
val user: List<User>
)
我的改造对象
object RetrofitClient {
private const val BASE_URL = "http://10.0.2.2:7000/"
val instance: RetrofitApi by lazy {
val retrofit = Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build()
retrofit.create(RetrofitApi::class.java)
}
}
Retrofit API
@FormUrlEncoded
@POST("users/register")
fun userRegister(
@Field("name") name: String,
@Field("email") email: String,
@Field("password") password: String,
@Field("confirmPassword") confirmPassword: String
): Call<LoginResponse>
和我的注册课程
RetrofitClient.instance.userRegister(name, email, password, confirmPassword)
.enqueue(object : Callback<LoginResponse> {
override fun onFailure(call: Call<LoginResponse>, t: Throwable) {
Toast.makeText(applicationContext, t.message, Toast.LENGTH_LONG).show()`
}
override fun onResponse(call: Call<LoginResponse>, response: Response<LoginResponse>) {
if (response.body()?.isSuccessful!!){
val intent = Intent(applicationContext, MainActivity::class.java)
startActivity(intent)
}else{
Toast.makeText(applicationContext, response.body()?.message, Toast.LENGTH_LONG).show()
}
}
})
}
}
如果可能的话,有人可以帮助我实现Kotlin协程
答案 0 :(得分:3)
在your previous question中,您正在命中一个users/login
端点。您创建了一个LoginResponse
来模拟服务器响应。在那里,users/login
返回了一个List<User>
,因此必须这样设置LoginResponse
。
现在,您正在命中一个users/register
端点...但是您仍在尝试使用LoginResponse
。从JSON中可以看到,您正在从只有一个用户的服务器中获取不同的JSON 。结果,您需要一个不同的响应类(例如RegisterResponse
)来为这个新响应建模:
data class RegisterResponse(
val isSuccessful:Boolean,
val message: String,
val user: User
)
@FormUrlEncoded
@POST("users/register")
fun userRegister(
@Field("name") name: String,
@Field("email") email: String,
@Field("password") password: String,
@Field("confirmPassword") confirmPassword: String
): Call<RegisterResponse>
答案 1 :(得分:0)
BEGIN_ARRAY
表示返回了一些包含JSON数组([]
)的JSON,您的对象架构中将使用JSON对象({}
)。
有时,API根据所处理的客户端返回不同的响应,因此最好在代码中调试问题。一种方法是暂时使用Retrofit的标量转换器工厂。
添加此依赖项:
dependencies {
implementation 'com.squareup.retrofit2:converter-scalars:<your-retrofit-version>'
}
和此代码
val retrofit = new Retrofit.Builder()
.addConverterFactory(ScalarsConverterFactory.create())
...
并返回Callable<String>
而不是自定义类型,并记录服务器实际返回的内容。然后您可以据此采取行动。