为什么我的 StringRequest 总是在 onErrorResponse 方法上运行?

Why my StringRequest is going always at onErrorResponse method?

我正在尝试执行来自 Android 的 POST 请求,以便在我的 phpmyadmin 中插入一些信息。

我在用什么

Slim post 函数不会给我带来任何问题,因为如果我在 Postman 应用程序上以 POST 模式使用它,数据就会正确地插入到数据库中。

url可以接受两个用斜杠分隔的参数/。举个例子:

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

我在数据库中插入了一个名为 Peter、年龄为 25 岁的新用户。

当我尝试使用 Volley 从 Android 调用相同的 url 时出现问题,因为它总是转到 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 方法。

我检查了什么

更新:

我注意到我在 url 上使用以太网适配器的 IP 而不是 WIFI。

如果我在 url 上设置 http://192.168.x.x(我的 WIFI 的 IP),现在我可以在智能手机浏览器 XAMPP 上看到默认网页,但我仍然遇到上面提到的问题因为如果我设置 http://192.168.x.x:8000/insert/Peter/25 智能手机无法识别 url。

我认为问题可能是因为我按照 Slim documentation 的建议使用了内置的 PHP 服务器。我使用以下命令:

php -S localhost:8000

所以我认为问题可能会在这里产生,但我不确定如何解决。

我错过了什么?

提前致谢!

与其将姓名和年龄传递给 url,不如像这样传递它们(为此对您的 Web 服务进行足够的更改)

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

            return params;  
    }

查看详细示例here

你也可以这样做

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;  
    }

);

您正在将内部 PHP 网络服务器绑定到 localhost 即。 127.0.0.1。无法从任何外部设备访问它。要将 PHP 网络服务器绑定到 192.168.x.x 的外部 IP 地址,请使用

启动它
$ php -S 192.168.x.x:8000

请务必将 .x.x 部分替换为您的 IP 地址的实际数字。您还必须确保您的 Android 设备连接到同一 192.168.x 网络。

完成后,您的 Android 设备应向 192.168.x.x:8000 发出请求。现在它正在尝试连接到 localhost 即。本身。

除非您是 运行,否则您 Android 设备端口 8000 中连接到 localhost:8000 的 PHP 网络服务器将无法工作。

终于我注意到了我的问题所在。我将分享我努力解决的问题。

  • 首先,我不需要使用内置的PHP服务器,因为它不是必需的。

  • 其次,也是最重要的一点,我还必须在 url 上使用存储 Slim 函数(我创建的自定义函数)的文件的名称.

  • 第三,我必须使用 XAMPP 是 运行ning 的计算机的 IP,以便手机 phone 可以访问它而不是localhost(指的是手机 phone 的 localhost,所以它永远不会工作)。

  • 第四,两个设备(手机phone和电脑)都连接到同一个WIFI网络,所以当你运行你的电脑XAMPP手机 phone 可以访问它。

所以我必须使用的最终 url 是:

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

您必须将 192.168.x.x 替换为计算机 WIFI 网络的 IP,将 application 替换为您正在使用的文件夹的名称 Slim

localhost 可用于启动 xampp 的同一系统。 如果您想通过 android phone 等其他设备连接它,您需要输入 Public IP 地址,转到命令提示符并键入

ipconfig

检查 public IP 的 IPv4 地址。