简体   繁体   中英

Cannot make Post request in Retrofit Android (Kotlin)

I've been developing an Android Q&A app using Jetpack Compose. I've been trying to make Post requests in Retrofit but the data I send isn't on my API website. I've succeeded in making Get requests though. I've read many documents but I cannot find out what is wrong with this code.
This is data class.

data class UsersEntity(
    val id: Int? = null,
    val name: String? = null,
    val uid: String? = null
)

This is Service interface.

interface UserService {
    @POST("createusers")
    fun createUsers(@Body usersinfo: UsersEntity): Call<Unit>
}

When I click a button, I'd like to send data to the server. I get the log "Hi, good job" but I cannot see the data on my API.

Button(
                onClick = {
                    val moshi = Moshi.Builder()
                        .add(KotlinJsonAdapterFactory())
                        .build()

                    val retrofit = Retrofit.Builder()
                        .baseUrl("https://api.*****.com/")
                        .addConverterFactory(MoshiConverterFactory.create(moshi))
                        .build()

                    val service: UserService = retrofit.create(UserService::class.java)

                    val usersInfo = UsersEntity(
                        3, "Alex", "164E92FC-D37A")

                    service.createUsers(usersInfo).enqueue(object: Callback<Unit> {
                        override fun onResponse(call: Call<Unit>, response: Response<Unit>) {
                            Log.d("Hi", "good job")
                        }

                        override fun onFailure(call: Call<Unit>, t: Throwable) {
                            Log.d("Hi", "error")
                        }
                    })
                }

I changed the code like this.

Button(
                onClick = {
                    val moshi = Moshi.Builder()
                        .add(KotlinJsonAdapterFactory())
                        .build()

                    val retrofit = Retrofit.Builder()
                        .baseUrl("https://api.*****.com/")
                        .addConverterFactory(MoshiConverterFactory.create(moshi))
                        .build()

                    thread {
                        try {
                            val service: UserService = retrofit.create(UserService::class.java)

                            val usersInfo = UsersEntity(
                                3, "Alex", "164E92FC-D37A")

                            service.createUsers(usersInfo).enqueue(object: Callback<ResponseBody> {
                                override fun onResponse(call: Call<ResponseBody>, response: Response<ResponseBody>) {
                                    Log.d("Response", "${response.body()}")
                                }

                                override fun onFailure(call: Call<ResponseBody>, t: Throwable) {
                                    Log.d("Hi", "error")
                                }
                            })
                        } catch (e: Exception) {
                    Log.d("response", "debug $e")
                        }
                    }
               },

Could someone help me? Thank you.

I think your baseurl shouldn't end with a slash. Try this.

.baseUrl("https://api.*****.com")

And for your interface (also the Call<ResponseBody> ):

interface UserService {
    @POST("/createusers/")
    fun createUsers(@Body usersinfo: UsersEntity): Call<ResponseBody>
}

Got some issues with this in the past so this might help. If not it atleasts cleans the code a bit:p

Also you can use ProxyMan to intercept your request and read what your application is actually sending to the server, might be a issue to find there!

Proxyman.io

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM