Okhttp 无法连接到本地主机端点抛出连接失败:ECONNREFUSED(连接被拒绝)
Okhttp Unable to connect to a localhost endpoint throws Connected failed: ECONNREFUSED (Connection refused)
我正在尝试使用 okhttp 和 flask 将我的本地后端和前端连接在一起,但是我得到 java.net.ConnectException:10000 毫秒后无法连接到 /127.0.0.1(端口 5000):isConnected 失败: ECONNREFUSED(连接被拒绝)异常
现在 API 确实可以正常工作,因为我可以在它 returns 值的邮递员中找到它,这里是代码
from flask import request, Flask
import getMovie
import getUser
api = Flask(__name__)
#Movie Endpoints
@api.route('/Movies/GetMovieById', methods=['GET'])
def get_movie_by_id():
id = str(request.args['id'])
return getMovie.getById(id)
@api.route('/Movies/All', methods=['GET'])
def get_all_movies():
return getMovie.getAll()
#User Endpoints
@api.route('/Users/All', methods=['GET'])
def get_all_users():
return getUser.getAll()
@api.route('/Users/GetUserById', methods=['GET'])
def get_user_by_id():
id = str(request.args['id'])
return getUser.getById(id)
if __name__ == '__main__':
api.run()
然后这是 android 应用的主要活动
package com.example.moviebuffs
import android.content.Intent
import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
import com.example.moviebuffs.ui.main.*
import kotlinx.android.synthetic.main.main_activity.*
import okhttp3.*
import java.io.IOException
class MainActivity : AppCompatActivity() {
private lateinit var movieListAdapter: MovieListAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.main_activity)
movieListAdapter= MovieListAdapter(mutableListOf())
rvFilmList.adapter = movieListAdapter
rvFilmList.layoutManager = LinearLayoutManager(this)
var testMovie = Movie(1,"Jurassic Park","Action | Dinosaurs")
for (i in 1..100) {
movieListAdapter.addMovie(testMovie)
}
fetchTest()
}
fun fetchTest() {
print("Trying to connect....")
val url: HttpUrl = HttpUrl.Builder()
.scheme("http")
.host("127.0.0.1")
.port(5000)
.addPathSegment("Movies")
.addPathSegment("All")
.build()
val request = Request.Builder().url(url).build()
val client = OkHttpClient()
client.newCall(request).enqueue(object: Callback {
override fun onResponse(call: Call, response: Response) {
val body = response?.body?.string()
print(body)
}
override fun onFailure(call: Call, e: IOException) {
val x = 0
}
})
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
// Inflate the menu; this adds items to the action bar if it is present.
menuInflater.inflate(R.menu.main_menu, menu)
return true
}
fun toGenreActivity(item: MenuItem?): Boolean {
val intent = Intent(this, GenreActivity::class.java)
startActivity(intent)
return true
}
fun toUserActivity(item: MenuItem?): Boolean {
val intent = Intent(this, UserActivity::class.java)
startActivity(intent)
return true
}
fun toMovieActivity(v: View?) {
val intent = Intent(this, MovieActivity::class.java)
startActivity(intent)
}
}
这是清单文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.moviebuffs">
<uses-permission android:name="android.permission.INTERNET"/>
<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">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".ui.main.GenreActivity">
</activity>
<activity android:name=".ui.main.MovieActivity">
</activity>
<activity android:name=".ui.main.UserActivity">
</activity>
</application>
</manifest>
有什么想法吗?
Localhost环回地址127.0.0.1指的是设备本身。您的 Android 模拟器上没有服务器 运行。
改为使用 10.0.2.2 连接到 运行 模拟器所在的主机。
更多信息:https://developer.android.com/studio/run/emulator-networking
我正在尝试使用 okhttp 和 flask 将我的本地后端和前端连接在一起,但是我得到 java.net.ConnectException:10000 毫秒后无法连接到 /127.0.0.1(端口 5000):isConnected 失败: ECONNREFUSED(连接被拒绝)异常
现在 API 确实可以正常工作,因为我可以在它 returns 值的邮递员中找到它,这里是代码
from flask import request, Flask
import getMovie
import getUser
api = Flask(__name__)
#Movie Endpoints
@api.route('/Movies/GetMovieById', methods=['GET'])
def get_movie_by_id():
id = str(request.args['id'])
return getMovie.getById(id)
@api.route('/Movies/All', methods=['GET'])
def get_all_movies():
return getMovie.getAll()
#User Endpoints
@api.route('/Users/All', methods=['GET'])
def get_all_users():
return getUser.getAll()
@api.route('/Users/GetUserById', methods=['GET'])
def get_user_by_id():
id = str(request.args['id'])
return getUser.getById(id)
if __name__ == '__main__':
api.run()
然后这是 android 应用的主要活动
package com.example.moviebuffs
import android.content.Intent
import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
import com.example.moviebuffs.ui.main.*
import kotlinx.android.synthetic.main.main_activity.*
import okhttp3.*
import java.io.IOException
class MainActivity : AppCompatActivity() {
private lateinit var movieListAdapter: MovieListAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.main_activity)
movieListAdapter= MovieListAdapter(mutableListOf())
rvFilmList.adapter = movieListAdapter
rvFilmList.layoutManager = LinearLayoutManager(this)
var testMovie = Movie(1,"Jurassic Park","Action | Dinosaurs")
for (i in 1..100) {
movieListAdapter.addMovie(testMovie)
}
fetchTest()
}
fun fetchTest() {
print("Trying to connect....")
val url: HttpUrl = HttpUrl.Builder()
.scheme("http")
.host("127.0.0.1")
.port(5000)
.addPathSegment("Movies")
.addPathSegment("All")
.build()
val request = Request.Builder().url(url).build()
val client = OkHttpClient()
client.newCall(request).enqueue(object: Callback {
override fun onResponse(call: Call, response: Response) {
val body = response?.body?.string()
print(body)
}
override fun onFailure(call: Call, e: IOException) {
val x = 0
}
})
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
// Inflate the menu; this adds items to the action bar if it is present.
menuInflater.inflate(R.menu.main_menu, menu)
return true
}
fun toGenreActivity(item: MenuItem?): Boolean {
val intent = Intent(this, GenreActivity::class.java)
startActivity(intent)
return true
}
fun toUserActivity(item: MenuItem?): Boolean {
val intent = Intent(this, UserActivity::class.java)
startActivity(intent)
return true
}
fun toMovieActivity(v: View?) {
val intent = Intent(this, MovieActivity::class.java)
startActivity(intent)
}
}
这是清单文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.moviebuffs">
<uses-permission android:name="android.permission.INTERNET"/>
<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">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".ui.main.GenreActivity">
</activity>
<activity android:name=".ui.main.MovieActivity">
</activity>
<activity android:name=".ui.main.UserActivity">
</activity>
</application>
</manifest>
有什么想法吗?
Localhost环回地址127.0.0.1指的是设备本身。您的 Android 模拟器上没有服务器 运行。
改为使用 10.0.2.2 连接到 运行 模拟器所在的主机。
更多信息:https://developer.android.com/studio/run/emulator-networking