为啥从模拟器的android应用程序调用REST API端点时连接失败
Posted
技术标签:
【中文标题】为啥从模拟器的android应用程序调用REST API端点时连接失败【英文标题】:Why Connection is Failing when call REST API end point from android app from emulator为什么从模拟器的android应用程序调用REST API端点时连接失败 【发布时间】:2020-08-23 03:58:37 【问题描述】:我正在关注 this 从 andrioa 应用程序调用 post 函数的教程。服务器是在烧瓶上创建的。不知道错误来了。
我已尝试 http//127.0.0.1:5000 在模拟器上运行应用程序,并尝试 http//[My IP Address]:5000 在我的设备上运行 android 应用程序。但是每次连接失败。
我调试我的项目 OnFailure() 回调被调用
任何建议都会有所帮助!!
我的 Android MainActivity.java
package com.asad.testrest;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import java.io.IOException;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
public class MainActivity extends AppCompatActivity
Button mButton;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButton = findViewById(R.id.mButton);
mButton.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
EditText ipv4AddressView = findViewById(R.id.IPAddress);
String ipv4Address = ipv4AddressView.getText().toString();
EditText portNumberView = findViewById(R.id.portNumber);
String portNumber = portNumberView.getText().toString();
String postUrl= "http://"+ipv4Address+":"+portNumber+"/";
String postBodyText="Hello";
MediaType mediaType = MediaType.parse("text/plain; charset=utf-8");
RequestBody postBody = RequestBody.create(mediaType, postBodyText);
postRequest(postUrl, postBody);
);
void postRequest(String postUrl, RequestBody postBody)
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(postUrl)
.post(postBody)
.build();
client.newCall(request).enqueue(new Callback()
@Override
public void onFailure(Call call, IOException e)
// Cancel the post on failure.
call.cancel();
// In order to access the TextView inside the UI thread, the code is executed inside runOnUiThread()
runOnUiThread(new Runnable()
@Override
public void run()
TextView responseText = findViewById(R.id.responseText);
responseText.setText("Failed to Connect to Server");
);
@Override
public void onResponse(Call call, final Response response) throws IOException
// In order to access the TextView inside the UI thread, the code is executed inside runOnUiThread()
runOnUiThread(new Runnable()
@Override
public void run()
TextView responseText = findViewById(R.id.responseText);
try
responseText.setText(response.body().string());
catch (IOException e)
e.printStackTrace();
);
);
我的 Python 文件是
import flask
app = flask.Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def handle_request():
return "Flask Server & Android are Working Successfully"
app.run(port=5000, debug=True)
【问题讨论】:
【参考方案1】:哪台机器正在运行烧瓶代码? 您需要对其进行设置,以便模拟器可以访问网络以及服务器计算机。
模拟器应该能够看到服务器主机的 IP 并连接到它。根据您的网络和烧瓶实际运行的位置,您可能需要转发端口或允许通过主机防火墙进行连接。
你读到教程中的这一段了吗?
要确定当前的 IPv4 地址,请发出 ipconfig 命令(从 Windows),如下所示。 IPv4 地址是 192.168.16.110。确保 Android 手机和开发 PC 都连接到同一个网络非常重要,因为我们使用的是本地 IPv4 地址。如果它们连接到不同的网络,则实验将失败。
尝试从模拟器 ping 您的服务器。如果您没有收到响应,则说明您的连接配置不正确。
【讨论】:
【参考方案2】:我终于解决了我的问题。但是使用的是ngrok的技术服务。我建议每个遇到类似问题的人都必须尝试 ngrok
至少观看一个视频并从其文档中查阅它非常容易!!!!相信我.....
【讨论】:
以上是关于为啥从模拟器的android应用程序调用REST API端点时连接失败的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的 Windows CE 设备无法成功调用服务器的 REST 方法?