Używam przykładowej aplikacji Spring Boot na moim lokalnym serwerze maszynowym (localhost) na porcie 8080. Z aplikacji klienckiej próbowałem wysłać żądanie wpisu przez Kotlin Retrofit, w moim emulatorze Android Studio,

Kod Kotlin

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

Otrzymuję poniższy błąd:

java.net.ConnectException: nie można połączyć się z localhost / 127.0.0.1 (port 8080) z /127.0.0.1 (port 57452) po 10000 ms: isConnected nie powiodło się: ECONNREFUSED (odmowa połączenia)

Jednak kiedy próbuję wysłać wiadomość od Postmana, kończy się ona pomyślnie http://localhost:8080/users.

Jak to rozwiązać?

Aktualizacja

Moje pliki manifestu Androida wyglądają następująco:

    <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">
            ...
0
Sazzad Hissain Khan 1 kwiecień 2020, 17:57

3 odpowiedzi

Najlepsza odpowiedź

W końcu rozwiązałem problem, dodając rzeczywistą maszynę IP znalezioną po uruchomieniu poniższych poleceń w bash

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

Przykład,

private val retrofit = Retrofit.Builder()
    .baseUrl("http://192.168.64.1:8080/")
    .addConverterFactory(GsonConverterFactory.create())
    .client(client)
    .build()
0
Sazzad Hissain Khan 2 kwiecień 2020, 20:03

Możesz spróbować dodać res / values / xml / network_security_config.xml

<?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">http://localhost:8080/</domain>
    </domain-config>
</network-security-config>

I odwołaj się do tego w manifeście wewnątrz aplikacji tagów

<application
...
    android:networkSecurityConfig="@xml/network_security_config"
...
</application>
0
Samuel Arenas 1 kwiecień 2020, 15:27

Czy dodałeś uprawnienia internetowe w swoim manifeście? i musisz dodać ruch w postaci czystego tekstu, jeśli testujesz na nowym urządzeniu, którego API to Pie. lubię to :

 <application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme"
    android:usesCleartextTraffic="true">
0
Hedi KARRAY 1 kwiecień 2020, 15:02