Почему происходит сбой подключения при вызове конечной точки REST API из приложения android из эмулятора - PullRequest
0 голосов
/ 07 мая 2020

Я следую этому руководству по вызову функции post из приложения andrioa. Сервер создан на flask. Не знаю, происходит ошибка.

Я пробовал http // 127.0.0.1: 5000 для запуска приложения на эмуляторе и пробовал http // [My IP Address]: 5000 для запуска android app на моем устройстве. Но каждый раз при сбое подключения.

Я отлаживаю свой проект, вызывается обратный вызов OnFailure ()

Любое предложение будет полезным !!

My 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)

Ответы [ 2 ]

0 голосов
/ 09 мая 2020

Наконец-то я решил свою проблему. Но с помощью технологического сервиса ngrok. Я предлагаю всем, кто сталкивается с подобной проблемой, попробовать ngrok

По крайней мере, посмотреть одно видео и проконсультироваться с его документацией, это очень просто !!!! поверь мне .....

0 голосов
/ 07 мая 2020

На каком компьютере запущен код flask? Вам необходимо настроить его так, чтобы эмулятор мог получить доступ к сети, а также к серверу.

Эмулятор должен иметь возможность видеть IP-адрес хоста сервера и подключаться к нему. В зависимости от вашей сети и того, где на самом деле работает flask, вам может потребоваться перенаправить порты или разрешить соединение через брандмауэр хоста.

Вы дошли до этого абзаца в руководстве?

Чтобы определить текущий IPv4-адрес, введите команду ipconfig (из Windows), как показано ниже. Адрес IPv4 - 192.168.16.110. Очень важно убедиться, что и телефон Android, и разработка P C подключены к одной и той же сети, потому что мы используем локальные адреса IPv4. Если они подключены к разным сетям, эксперимент не удастся.

Попробуйте проверить связь с вашим сервером из эмулятора. Если вы не получаете ответа, ваше соединение настроено неправильно.

...