Search code examples
androidrestkotlinpostretrofit

Getting isConnected failed: ECONNREFUSED (Connection refused) error for Kotlin Retrofit post request


I am running a Sample Spring Boot app on my local machine server (localhost) on port 8080. From client app, I was trying to make a post request through Kotlin Retrofit, in my Android Studio Emulator,

Kotlin Code

interface RestApi {

    @Headers("Content-Type: application/json")
    @POST("users")
    fun addUser(@Body userData: CTUserInfo): Call<ResponseBody>
}


object ServiceBuilder {
    private val client = OkHttpClient.Builder().build()

    private val retrofit = Retrofit.Builder()
        .baseUrl("http://localhost:8080/")
        .addConverterFactory(GsonConverterFactory.create())
        .client(client)
        .build()

    fun<T> buildService(service: Class<T>): T{
        return retrofit.create(service)
    }
}

class RestApiService {

    fun addUser(userData: CTUserInfo){

        val retrofit = ServiceBuilder.buildService(RestApi::class.java)

        retrofit.addUser(userData).enqueue(
            object : Callback<ResponseBody> {

                override fun onFailure(call: Call<ResponseBody>, t: Throwable) {
                    // failure
                    print("Failed") // getting t = below mentioned error
                }

                override fun onResponse( call: Call<ResponseBody>, response: Response<ResponseBody>) {

                    if (response.code() == 201) {
                        // user added
                        print("Success")
                    } else{
                        //user could not be added
                        print("Failed")
                    }
                }
            }
        )
    }
}

I am getting below error:

java.net.ConnectException: failed to connect to localhost/127.0.0.1 (port 8080) from /127.0.0.1 (port 57452) after 10000ms: isConnected failed: ECONNREFUSED (Connection refused)

However, when I am trying to post from Postman it succeeds on http://localhost:8080/users.

How to resolve it?

Update

My Android manifest files looks like,

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

    <application
            android:name=".BaseApplication"
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:usesCleartextTraffic="true"
            android:theme="@style/AppTheme">
            ...

Solution

  • Finally I resolved the issue by adding actual machine IP found by running below commands in bash

    1. Mac - ifconfig
    2. Windows - ipconfig /all

    Example,

    private val retrofit = Retrofit.Builder()
        .baseUrl("http://192.168.64.1:8080/")
        .addConverterFactory(GsonConverterFactory.create())
        .client(client)
        .build()