首页 > 解决方案 > 预期 begin_array 但在第 1 行第 1 列是字符串?

问题描述

我正在构建一个简单的应用程序,我们可以在其中通过 api 注册,注册效果很好,我看到当我在邮递员上发出 get 请求时创建了新用户。但是当我按下注册按钮时出现此错误消息:“预期为 begin_array 但在第 1 行第 1 列是字符串”

这是我的接口 api、retrofitClient 和 SignUpActivity 逻辑的代码:

接口接口:

接口 API {

 @FormUrlEncoded
    @POST("user")
    fun createUser(
            @Field("login") name: String,
            @Field("mail") email: String,
            @Field("password") password: String,
    ):Call<DefaultResponses>

    @FormUrlEncoded
    @POST("user/login")
    fun loginUser(
            @Field("mail") email: String,
            @Field("password") password: String,
    ):Call<DefaultResponses>

}

请注意,我尝试在 @FormUrlEncoded 之前添加 @Headers("Content-Type: application/json") 但它没有改变任何东西

改造客户端代码:

object retrofitClient {


    private const val BASE__URL = "http://172.20.176.1:8080/"
    private val okHttpClient = OkHttpClient.Builder()
        .addInterceptor{chain ->
            val original = chain.request()
            val requestBuilder = original.newBuilder()
                .method(original.method(), original.body())

            val request = requestBuilder.build()
            chain.proceed(request)
        }.build()
    val instance: api by lazy{

        val gson = GsonBuilder().setLenient().create()
        val retrofit = Retrofit.Builder()
            .baseUrl(BASE__URL)
            .addConverterFactory(GsonConverterFactory.create(gson))
            .client(okHttpClient)
            .build()

        retrofit.create(api::class.java)
    }
}

注册活动逻辑:

class secondActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_second)

        val SignUpButton = findViewById(R.id.enregistrer) as Button
        val nameId = findViewById<TextView>(R.id.name)
        val emailId = findViewById<TextView>(R.id.email)
        val passwordId = findViewById<TextView>(R.id.password)


        SignUpButton.setOnClickListener {

            val name = nameId.text.toString().trim()
            val email = emailId.text.toString().trim()
            val password = passwordId.text.toString().trim()

            if(name.isEmpty()){
                nameId.error = "Name required"
                nameId.requestFocus()
                return@setOnClickListener
            }

            if(email.isEmpty()){
                emailId.error = "Email required"
                emailId.requestFocus()
                return@setOnClickListener
            }

            if(password.isEmpty()){
                passwordId.error = "Password required"
                passwordId.requestFocus()
                return@setOnClickListener
            }
            retrofitClient.instance.createUser(name , email , password)
                    .enqueue(object: Callback<DefaultResponses>{
                        override fun onResponse(call: Call<DefaultResponses>, response: Response<DefaultResponses>) {
                            Toast.makeText(applicationContext, response.body()?.message, Toast.LENGTH_LONG).show()
                        }

                        override fun onFailure(call: Call<DefaultResponses>, t: Throwable) {
                            Toast.makeText(applicationContext, t.message, Toast.LENGTH_LONG).show()
                        }

                    })

        }



    }
}

您知道如何避免出现的消息吗?

请记住,我的用户创建正在运行,我在 api 中检索我的数据!

标签: javajsonapikotlinretrofit

解决方案


推荐阅读