Почему мой метод StringRequest всегда работает в методе onErrorResponse?

Я пытаюсь выполнить запрос POST от Android, чтобы вставить некоторую информацию в мой phpmyadmin.

Что я использую

  • Slim, чтобы выполнить соединение и запрос с базой данных, хранящейся в phpmyadmin.
  • XAMPP для имитации локального сервера.
  • Volley для использования запросов от Android.

Функция Slim post не дает мне никаких проблем, потому что, если я использую ее в режиме POST в приложении Postman, данные вставляются правильно в базу данных.

URL может принимать два параметра, разделенных косой чертой /. Вот один пример:

http://localhost:8000/insert/Peter/25

в который я вставляю нового пользователя с именем Peter и 25 лет в базу данных.

Проблемы возникают, когда я пытаюсь вызывать один и тот же URL с Android с помощью Volley, потому что он всегда идет к методу onErrorResponse.

Это код, который я должен использовать для запроса от Android:

RequestQueue queue = Volley.newRequestQueue(getContext());

String url = "http://localhost:8000/insert/" + name + "/" + age;
StringRequest postRequest = new StringRequest(Request.Method.POST, url,
     new Response.Listener<String>()
     {
         @Override
         public void onResponse(String response) {
            Log.d("Response", "works well");
         }
     },
     new Response.ErrorListener()
     {
         @Override
         public void onErrorResponse(VolleyError error) {
            Log.d("Response", "" + error.getMessage());
         }
     }
);

queue.add(postRequest);

Но он всегда идет к методу onErrorResponse.

Что я проверил

  • То, что компьютер, на котором работает XAMPP, находится в том же WIFI, что и смартфон.
  • Это изменение локального хоста для IP-адреса моего компьютера также не изменяет результат.

UPDATE:

Я заметил, что я использовал IP-адаптер Ethernet вместо WIFI на URL-адресе.

Теперь я могу видеть на веб-странице браузера смартфона XAMPP по умолчанию, если я установил http://192.168.x.x (IP моего WIFI) на url, но у меня все еще есть проблема, о которой я упоминал выше, потому что, если я устанавливаю http://192.168.x.x:8000/insert/Peter/25, url не распознается с помощью смартфона.

Я думаю, что проблема может быть связана с тем, что я использую встроенный сервер PHP в качестве Slim documentation. Я использую следующую команду:

php -S localhost:8000

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

Что мне не хватает?

Спасибо заранее!

Ответ 1

Наконец, я замечаю, в чем была моя проблема. Я собираюсь поделиться теми моментами, в которых я боролся.

  • Прежде всего, мне не нужно было использовать встроенный PHP-сервер, потому что это было необязательно.

  • Во-вторых, и самое главное, я также должен был использовать имя файла, в котором хранятся функции Slim (пользовательские функции, которые я создал) на URL.

  • В-третьих, мне пришлось использовать IP-адрес компьютера, на котором был запущен XAMPP, чтобы мобильный телефон мог получить к нему доступ вместо localhost (который ссылался на localhost мобильного телефона, чтобы он никогда не работают).

  • В-четвертых, оба устройства (мобильный телефон и компьютер) были подключены к той же сети WIFI, поэтому, когда вы запускаете свой XAMPP на своем компьютере, мобильный телефон может получить к нему доступ.

Итак, окончательный url, который я должен был использовать, был:

http://192.168.x.x/application/index.php/insert/Peter/25

где вам нужно заменить 192.168.x.x IP-сетью WIFI вашего компьютера и application на имя папки, в которой вы используете Slim.

Ответ 2

Вы также можете сделать это

StringRequest postRequest = new StringRequest(Request.Method.POST, url,
     new Response.Listener<String>()
     {
         @Override
         public void onResponse(String response) {
            Log.d("Response", "works well");
         }
     },
     new Response.ErrorListener()
     {
         @Override
         public void onErrorResponse(VolleyError error) {
            Log.d("Response", "" + error.getMessage());
         }
     }

@Override
        public String getBodyContentType() {
            return "application/x-www-form-urlencoded; charset=UTF-8";
        }

@Override
    protected Map<String, String> getParams() 
    {  
            Map<String, String>  params = new HashMap<String, String>();  
            params.put("name", "Atif");  
            params.put("age", "27");
            return params;  
    }

);

Ответ 3

Вы привязываете внутренний веб-сервер PHP к localhost т.е. 127.0.0.1. Доступ к нему с любого внешнего устройства невозможен. Чтобы связать веб-сервер PHP с внешним IP-адресом 192.168.x.x, запустите его с помощью.

$ php -S 192.168.x.x:8000

Обязательно замените часть .x.x на фактические номера вашего IP-адреса. Вы также должны убедиться, что ваше Android-устройство подключено к той же сети 192.168.x.

После этого ваше устройство Android должно сделать запрос 192.168.x.x:8000. Теперь он пытается подключиться к localhost т.е. сам.

Если вы не используете веб-сервер PHP в своем Android-устройстве, 8000 подключение к localhost:8000 не будет работать.

Ответ 4

Вместо того, чтобы передавать имя и возраст URL-адресу, передайте их так (для этого сделайте достаточные изменения в своем веб-сервисе)

    @Override
    protected Map<String, String> getParams() 
    {  
            Map<String, String>  params = new HashMap<String, String>();  
            params.put("name", "Atif");  
            params.put("age", "27");

            return params;  
    }

См. подробный пример здесь

Ответ 5

localhost может использоваться для той же системы, из которой запускается xampp. Если вы хотите подключить его через какое-то другое устройство, например, телефон Android, вам нужно поместить общедоступный IP-адрес, перейдите в командную строку и введите

ipconfig

Проверьте IPv4-адрес для общедоступного IP-адреса.