获取 isConnected 失败:Kotlin Retrofit post 请求的 ECONNREFUSED(连接被拒绝)错误
Getting isConnected failed: ECONNREFUSED (Connection refused) error for Kotlin Retrofit post request
我是 运行 示例 Spring 在端口 8080 上的本地计算机服务器 (localhost) 上启动应用程序。我试图通过客户端应用程序发出 post 请求Kotlin Retrofit,在我的 Android Studio Emulator,
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: 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)
但是,当我尝试从 Postman post 时,它在 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">
...
您是否在清单中添加了 internet 权限?
如果您在 API 为 Pie 的新设备上进行测试,则必须添加清晰的文本流量。像这样:
<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>
最后,我通过在 bash
中的命令下方添加由 运行 找到的实际机器 IP
解决了这个问题
- Mac -
ifconfig
- Windows -
ipconfig /all
示例,
private val retrofit = Retrofit.Builder()
.baseUrl("http://192.168.64.1:8080/")
.addConverterFactory(GsonConverterFactory.create())
.client(client)
.build()
如果您的本地后端设置来自 Window 的子系统,您必须使用 OS' ip 而不是 localhost
,方法是从终端使用 ifconfig
命令.使用为您的开发目的指定的 IP 地址。
我是 运行 示例 Spring 在端口 8080 上的本地计算机服务器 (localhost) 上启动应用程序。我试图通过客户端应用程序发出 post 请求Kotlin Retrofit,在我的 Android Studio Emulator,
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: 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)
但是,当我尝试从 Postman post 时,它在 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">
...
您是否在清单中添加了 internet 权限? 如果您在 API 为 Pie 的新设备上进行测试,则必须添加清晰的文本流量。像这样:
<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>
最后,我通过在 bash
中的命令下方添加由 运行 找到的实际机器IP
解决了这个问题
- Mac -
ifconfig
- Windows -
ipconfig /all
示例,
private val retrofit = Retrofit.Builder()
.baseUrl("http://192.168.64.1:8080/")
.addConverterFactory(GsonConverterFactory.create())
.client(client)
.build()
如果您的本地后端设置来自 Window 的子系统,您必须使用 OS' ip 而不是 localhost
,方法是从终端使用 ifconfig
命令.使用为您的开发目的指定的 IP 地址。