为啥从模拟器的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 方法?

为啥离子中的WP rest API在模拟器中不起作用

如何从服务器端模拟复杂的 REST 调用?

如何从 android 客户端调用 REST WCF 服务

Node.js Lambda 函数从 REST 调用将“响应无效”返回给 Alexa 服务模拟器

从 Android 调用使​​用 Spring Security 保护的 REST Web 服务