Метод onFailure Retrofit вызывается даже после правильного ответа - PullRequest
0 голосов
/ 28 августа 2018

Ниже приведены параметры моего запроса в PostMan

{"assign_id":"1","type":2,"attendance_list":[{"stud_id":"1703","attendanceID":"1","stud_attendance":"4"},{"stud_id":"1704","attendanceID":"2","stud_attendance":"1"},{"stud_id":"1705","attendanceID":"3","stud_attendance":"1"},{"stud_id":"1706","attendanceID":"4","stud_attendance":"1"},{"stud_id":"1707","attendanceID":"5","stud_attendance":"1"},{"stud_id":"1727","attendanceID":"25","stud_attendance":"1"}]}

Ниже приводится ответ

{"status":1,"msg":"Success"}

Теперь в моем приложении для Android я использую Retrofit с Gson. Но, проходя через Gson, я столкнулся с некоторой проблемой, поэтому отправляю параметры запроса в виде jsonObject и jsonArrays.

Ниже приведен мой код при нажатии кнопки для отправки запроса на сервер

val jObjRequest = JsonObject()

                jObjRequest.addProperty("assign_id",ClassModelInstance.getInstance().classInfo.assignId)
                jObjRequest.addProperty("type","2")
                val attendanceArray = JsonArray()
                for(i in 0 until ClassModelInstance.getInstance().studentInfos.size){
                    val jsonObject = JsonObject()
                    jsonObject.addProperty("stud_id",ClassModelInstance.getInstance().studentInfos[i].studId)
                    jsonObject.addProperty("attendanceID",1)
                    jsonObject.addProperty("stud_attendance",ClassModelInstance.getInstance().studentInfos[i].studAttendance)
                    attendanceArray.add(jsonObject)
                }

                jObjRequest.addProperty("attendance_list",attendanceArray.toString())
                Log.i("PritishAttendanceApi2", jObjRequest.toString())

                val submitAttendanceInterface = ApiClient.client.create(SubmitAttendanceInterface::class.java)

                submitAttendanceInterface.takeAttendance(jObjRequest)
                                .enqueue(object : Callback<SubmitAttendanceResponse> {
                    override fun onFailure(call: Call<SubmitAttendanceResponse>, t: Throwable) {
                        activity?.let { it1 -> ToastMaker.make(it1,getString(R.string.something_went_wrong),Toast.LENGTH_LONG) }
                        Log.i("Pritish",t.message+"\t"+t.localizedMessage+"\t"+t.printStackTrace()+"\t"+t.cause+"\n"+call.request())
                        alertDialog.dismiss()
                    }

                    override fun onResponse(call: Call<SubmitAttendanceResponse>, response: Response<SubmitAttendanceResponse>) {
                        if(response.body()?.status.toString().equals("1",true)){
                            activity?.let { it1 -> ToastMaker.make(it1,response.body()?.msg.toString(),Toast.LENGTH_LONG) }
                            goToPreviousFragment()
                        } else {
                            activity?.let { it1 -> ToastMaker.make(it1,response.body()?.msg.toString(),Toast.LENGTH_LONG) }
                        }

                        alertDialog.dismiss()
                    }

                })

Это интерфейс и класс ответа

interface SubmitAttendanceInterface {

    @Headers("Content-Type: application/json")
    @POST("timetable/takeAttendance")
    fun takeAttendance(@Body body: JsonObject): Call<SubmitAttendanceResponse>

}

data class SubmitAttendanceResponse(
        @SerializedName("status")
        @Expose
        var status: Int? = null,
        @SerializedName("msg")
        @Expose
        var msg: String? = null

)

Когда я регистрируюсь, используя HttpInterceptor, я получаю com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 2 column 1 path

Я искал переполнение стека для вышеуказанной ошибки, но ответы не соответствовали моему требованию

Ошибка JSON "java.lang.IllegalStateException: ожидаемый BEGIN_OBJECT, но в строке 1 путь 1 столбца 1 $"

"Ожидается BEGIN_OBJECT, но в строке 1 столбца 1 указано STRING"

Я отредактировал URL в журналах, так как не хочу раскрывать URL.

1 Ответ

0 голосов
/ 28 августа 2018

согласно вашему журналу и образцу данных вы должны опубликовать данные "Participance_list" в виде массива json, состоящего из строки

попытка jObjRequest.add("attendance_list",attendanceArray) поставленный jObjRequest.addProperty("attendance_list",attendanceArray.toString())

...