Невозможно подключиться к локальному API на Android Studio - PullRequest
0 голосов
/ 11 октября 2019

Поэтому я разрабатываю приложение для Android, которое должно взаимодействовать с API, который я кодировал. Пока я просто запускаю API локально. Я уже протестировал все маршруты, и все они работают.

Теперь я хотел бы отправлять запросы к этому API в моем приложении Android. Для этого я использую класс RequestManager, который расширяет AsyncTask для управления каждым запросом (я могу показать вам код, если вы спросите). Я добавил <uses-permission android:name="android.permission.INTERNET" /> и <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> в манифест.

Когда я выполняю запрос через RequestManager, используя IP-адрес моего ПК, он на некоторое время приостанавливается, затем выдает SocketTimeoutException сследующая ошибка: failed to connect to /XX.XX.XX.XX (port XXXX) from /XX.XX.XX.XX (port XXXX). Обратите внимание, что выполнение одного и того же запроса от Postman работает без проблем.

Итак, я попробовал несколько вещей, таких как добавление файла network_security_config.xml, чтобы разрешить трафик с IP-адресом моего ПК, я деактивировал свой брандмауэр, я добавил несколькоправила входящего и исходящего трафика на моем брандмауэре для предоставления разрешений Android Studio, IP-адресу, используемому порту и т. д., но, похоже, ничего не решает проблему.

Кто-нибудь испытывал то же самое или кто-нибудь может мне помочь исправитьэто ? Мне действительно нужно, чтобы он работал ..

РЕДАКТИРОВАТЬ: Вот класс RequestManager:

class RequestManager extends AsyncTask<HashMap<String, Object>, Void, Response> {

    protected Response doInBackground(HashMap<String, Object>... parameterMaps) {
        Response response = null;
        HashMap<String, Object> params = parameterMaps[0];
        String method = (String) params.get("method");
        if ("GET".equals(method)) {
            response = doGet(params);
        } else if ("POST".equals(method)) {
            response = doPost(params);
        } else if ("UPDATE".equals(method)) {
            response = doUpdate(params);
        } else if ("DELETE".equals(method)) {
            response = doDelete(params);
        }
        return response;
    }

    private Response doGet(HashMap<String, Object> params) {
        Response response = null;
        try {
            OkHttpClient client = new OkHttpClient();

            Context context = (Context) params.get("context");
            String protocol = Config.getConfigValue(context, "protocol");
            String ipAddress = Config.getConfigValue(context, "ipAddress");
            String port = Config.getConfigValue(context, "port");
            String route = (String) params.get("route");
            String url = protocol + ipAddress + ":" + port + "/" + route;

            Request request = new Request.Builder()
                    .url(url)
                    .get()
                    .addHeader("Content-Type", "application/json")
                    .addHeader("Cache-Control", "no-cache")
                    .build();

            response = client.newCall(request).execute();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return response;
    }

    private Response doPost(HashMap<String, Object> params) {
        Response response = null;
        try {
            OkHttpClient client = new OkHttpClient();

            Context context = (Context) params.get("context");
            String protocol = Config.getConfigValue(context, "protocol");
            String ipAddress = Config.getConfigValue(context, "ipAddress");
            String port = Config.getConfigValue(context, "port");
            String route = (String) params.get("route");
            String url = protocol + ipAddress + ":" + port + "/" + route;

            MediaType mediaType = MediaType.parse("application/json");
            String bodyContent = params.get("body").toString();
            RequestBody body = RequestBody.create(mediaType, bodyContent);

            Request request = new Request.Builder()
                    .url(url)
                    .post(body)
                    .addHeader("Content-Type", "application/json")
                    .addHeader("Cache-Control", "no-cache")
                    .build();

            response = client.newCall(request).execute();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return response;
    }

    private Response doUpdate(HashMap<String, Object> params) {
        Response response = null;
        try {
            OkHttpClient client = new OkHttpClient();

            Context context = (Context) params.get("context");
            String protocol = Config.getConfigValue(context, "protocol");
            String ipAddress = Config.getConfigValue(context, "ipAddress");
            String port = Config.getConfigValue(context, "port");
            String route = (String) params.get("route");
            String url = protocol + ipAddress + ":" + port + "/" + route;

            MediaType mediaType = MediaType.parse("application/json");
            String bodyContent = params.get("body").toString();
            RequestBody body = RequestBody.create(mediaType, bodyContent);

            Request request = new Request.Builder()
                    .url(url)
                    .put(body)
                    .addHeader("Content-Type", "application/json")
                    .addHeader("Cache-Control", "no-cache")
                    .build();

            response = client.newCall(request).execute();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return response;
    }

    private Response doDelete(HashMap<String, Object> params) {
        Response response = null;
        try {
            OkHttpClient client = new OkHttpClient();

            Context context = (Context) params.get("context");
            String protocol = Config.getConfigValue(context, "protocol");
            String ipAddress = Config.getConfigValue(context, "ipAddress");
            String port = Config.getConfigValue(context, "port");
            String route = (String) params.get("route");
            String url = protocol + ipAddress + ":" + port + "/" + route;

            Request request = new Request.Builder()
                    .url(url)
                    .delete()
                    .addHeader("Content-Type", "application/json")
                    .addHeader("Cache-Control", "no-cache")
                    .build();

            response = client.newCall(request).execute();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return response;
    }

    protected void onPostExecute(Response response) {

    }
}

И вот как я это называю:

        HashMap<String, Object> params = new HashMap<>();
        JSONObject body = Utils.jsonify(content);
        params.put("body", body);
        params.put("route", Constants.User.BASE_USER);
        params.put("context", SignUp.this);
        params.put("method", "POST");

AsyncTask<HashMap<String, Object>, Void, Response> requestManager = new RequestManager().execute(params);

1 Ответ

1 голос
/ 11 октября 2019

используйте localtunnel , чтобы временно выставить локальный API. Это работает как шарм и очень прост в использовании. использовал его для нескольких проектов для проверки локального API.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...