使用 kotlin 通过改造向 Flask 服务器发送数据时出现 400 http 错误

400 http error while sending data via retrofit to flask server with kotlin

我正在尝试通过 REST Api 将带有自动递增 ID 的经度和纬度发送到我的 Flask 服务器的数据库 运行。我用 Postman 测试过,效果很好。这是来自邮递员的示例请求正文。

{

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

Flask代码部分如下:

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

我认为错误在于我使用改装将数据发送到服务器的方式。在我的 activity class 中,我创建了自己的测试数据并尝试发送,但没有成功。

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()
                }

            })

        }

我的改造数据class

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)
    }
}

MainViewModel

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>

}

我在这里做错了什么? 来自 Postman 的截图:

在尝试使用我的 phone 发送它时,在调试模式下从 Flask 端,我们看到它失败了。

您在 API 的正文中传递了错误的数据。您应该在 API 请求中将 Item2 作为正文传递。

interface SimpleApi {

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

}

在 logcat 中打印页眉和正文。查看 this 篇文章。这可以帮助您轻松调试 api 请求和响应。