#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 неправильно извлекает данные из этого. Это создаст долготу, широту внутри объекта элемента.