获取isConnected失败:Kotlin改装后请求的ECONNREFUSED(连接被拒绝)错误



我正在8080端口的本地机器服务器(localhost(上运行一个Sample Spring Boot应用程序。在客户端应用程序中,我试图通过Kotlin Reform在我的Android Studio模拟器、中发出帖子请求

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

我得到以下错误:

java.net.ConnectException:10000ms后无法从127.0.0.1(端口57452(连接到localhost/120.0.1(港口8080(:isConnected失败:ECONNREFUSED(拒绝连接(

但是,当我尝试从Postman发布时,它在http://localhost:8080/users上成功了。

如何解决

更新

我的Android清单文件看起来像,

<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">
...

最后,我添加了通过在bash 中运行以下命令找到的实际机器IP,从而解决了这个问题

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

示例,

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

您是否在清单中添加了互联网权限?如果你在API为Pie的新设备上测试,你必须添加clear teext travic。像这样:

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

您可以尝试在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>

并在标签应用内的清单上引用

<application
...
android:networkSecurityConfig="@xml/network_security_config"
...
</application>

如果本地后端设置来自Window的子系统,则必须使用操作系统的ip,而不是来自终端的ifconfig命令的localhost。使用为开发目的指定的IP地址。

最新更新