400 ошибка http при отправке данных через обновление на сервер flask с помощью kotlin

#android #kotlin #flask #retrofit

Вопрос:

Я пытаюсь отправить долготу и широту с автоинкрементным идентификатором в свою базу данных, работающую на сервере Flask, через REST Api. Я протестировал его с Почтальоном, и он работал нормально. Вот пример запроса тела от почтальона.

 {

"longitude":1.877771999,
"latitude":2.01999
}
 

Кодовая часть колбы выглядит следующим образом:

 class LocationValues(Resource):
    parser = reqparse.RequestParser()
    parser.add_argument(
        'longitude',
        type=float,
        required=True,
        help="You must enter longitude"
    )

    parser.add_argument(
        'latitude',
        type=float,
        required=True,
        help="You must enter latitude"
    )

 def post(self):
        data = LocationValues.parser.parse_args()
        item = {'longitude': data['longitude'], 'latitude': data['latitude']}
        connection = sqlite3.connect('db.sqlite')
        cursor = connection.cursor()
        query = "INSERT INTO location VALUES(NULL ,?,?)"
        result=cursor.execute(query, (item['longitude'], item['latitude']))
        connection.commit()
        connection.close()
        if result:
            return {"message":"Posted with success"},201

        return {"message":"failure"},400
 

Я думаю, что ошибка в том, как я отправляю данные на сервер с помощью retrofit. Здесь, в своем классе активности, я создал свои собственные тестовые данные, которые безуспешно пытаюсь отправить.

 val repository = Repository()
val viewModelFactory = MainViewModelFactory(repository)
viewModel = ViewModelProvider(this,viewModelFactory).get(MainViewModel::class.java)
val buttonPost:Button = findViewById(R.id.button_post)
val myPostedData = Post2(Item2(5.2,9.99))
buttonPost.setOnClickListener {
            viewModel.pushPost(myPostedJSON)
            viewModel.myResponse.observe(this, Observer { response ->
                if (response.isSuccessful) {
                    Toast.makeText(this,"OK",Toast.LENGTH_SHORT).show()
                } else {

                    Toast.makeText(this,"Failed to send data",Toast.LENGTH_SHORT).show()
                }

            })

        }
 

Мой класс данных дооснащения

 data class Post2(
    val item: Item2
)

data class Item2(
    val longitude: Double,
    val latitude: Double
)
 

Хранилище

 class Repository {
   
    suspend fun pushPost(post:Post2):Response<Post2>{
        return RetrofitInstance.api.pushPost(post)
    }
}
 

Mainviewмодель

 class MainViewModel(private  val repository: Repository):ViewModel() {
    val myResponse: MutableLiveData<Response<Post>> = MutableLiveData()
    val myResponse2: MutableLiveData<Response<Post2>> = MutableLiveData()

    fun pushPost(post: Post2){
        viewModelScope.launch {
            val response : Response<Post2> = repository.pushPost(post)
            myResponse2.value = response
        }
    }
 
 interface SimpleApi {

    @POST("adamapi")
    suspend fun pushPost(
        @Body post: Post2
    ): Response<Post2>

}
 

Что я здесь делаю не так?
Скриншот от почтальона:
введите описание изображения здесь

Со стороны колбы в режиме отладки при попытке отправить его с моего телефона мы видим, что это не удается. введите описание изображения здесь

Ответ №1:

Вы передаете неправильные данные в теле API. Вы должны передать его в Item2 качестве тела в запросе API.

 interface SimpleApi {

    @POST("adamapi")
    suspend fun pushPost(
        @Body body: Item2
    ): Response<Any>

}
 

Для печати заголовка и тела в logcat. Проверьте эту статью. Это может помочь вам легко отладить запрос и ответ api.

Комментарии:

1. Это работает. Почему я не могу сдать свой Пост2? В нем есть объект Item2..

2. @yras8 Если вы передадите Post2, то он создаст неправильный уровень объекта JSON при анализе с помощью модификации. И ваш API неправильно извлекает данные из этого. Это создаст долготу, широту внутри объекта элемента.