排球POST字符串请求意外错误500

时间:2019-09-03 10:19:54

标签: php android android-studio kotlin android-volley

我在我的项目中使用Volley库,并得到Unexpected response code 500作为响应。

我已经彻底搜索了stackoverflow,但仍然找不到有效的解决方案。

以下是我提出GET字符串请求的代码

        val API = "http://squadtechsolution.com/android/v1/allcompany.php"
        val requestQueue = Volley.newRequestQueue(mActivity)
        val stringRequest = StringRequest(
            Request.Method.GET,
            API,
            Response.Listener { response ->
                Log.i("dxdiag", response)
                mView.onFetchHttpDataResult(true)
                Toast.makeText(context, response, Toast.LENGTH_LONG).show()
            },
            Response.ErrorListener { error ->
                Toast.makeText(context, error.toString(), Toast.LENGTH_LONG).show()
                Log.i("dxdiag", error.printStackTrace().toString())
                mView.onFetchHttpDataResult(false)
            })
        requestQueue.add(stringRequest)

以下是堆栈跟踪

2019-09-03 17:15:53.237 3308-3892/com.squadtechs.markhor.foodapp 
E/Volley: [194] BasicNetwork.performRequest: Unexpected response code 
500 for 
http://squadtechsolution.com/android/v1/allcompany.php
2019-09-03 17:15:53.243 3308-3351/com.squadtechs.markhor.foodapp 
D/EGL_emulation: eglMakeCurrent: 0xa7d84180: ver 2 0 (tinfo 
0xa7d832b0)
2019-09-03 17:15:53.256 3308-3308/com.squadtechs.markhor.foodapp 
W/System.err: com.android.volley.ServerError
2019-09-03 17:15:53.257 3308-3308/com.squadtechs.markhor.foodapp 
W/System.err:     at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:205)2019-09-03 17:15:53.257 3308-3308/com.squadtechs.markhor.foodapp W/System.err:     at com.android.volley.NetworkDispatcher.processRequest(NetworkDispatcher.java:131)2019-09-03 17:15:53.257 3308-3308/com.squadtechs.markhor.foodapp W/System.err:     at com.android.volley.NetworkDispatcher.processRequest(NetworkDispatcher.java:111)2019-09-03 17:15:53.257 3308-3308/com.squadtechs.markhor.foodapp W/System.err:     at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:90)

以下是我在服务器端编写的PHP代码:

<?php
    require 'db.php';

    $sql = "SELECT * FROM `company_profile`";
    $result = $con->query($sql);

    if ($result->num_rows > 0) {
    // output data of each row
    while($row = $result->fetch_assoc()) {

        $id=$row['id']; 

        $company_name=$row['company_name'];
        $cuisine=$row['cuisine'];
        $conpany_phone=$row['conpany_phone'];
        $company_description=$row['company_description']; 
        $company_logo=$row['company_logo'];
        $company_type=$row['company_type'];
        $delivery_type=$row['delivery_type'];
        $delivery_range=$row['delivery_range']; 
        $delivery_fee=$row['delivery_fee'];
        $delivery_pickupinfo=$row['delivery_pickupinfo'];
        $address=$row['address'];

        $companyData[] = array('id'=> $id,'company_name'=> 
        $company_name,'cuisine'=> $cuisine,'conpany_phone'=> 
        $conpany_phone,'company_description'=> 
        $company_description,'company_logo'=> $company_logo,'company_type'=> 
        $company_type,'delivery_type'=> $delivery_type,'delivery_range'=> 
        $delivery_range,'delivery_fee'=> 
        $delivery_fee,'delivery_pickupinfo'=> $delivery_pickupinfo,'address'=> $address);   
    }
    echo $jsonformat=json_encode($companyData);
    } else {
        echo "0 results";
    }
    $conn->close();
?>

12 个答案:

答案 0 :(得分:1)

从服务器端代码中删除以下行,然后检查

ie.waitforcomplete 10000 

并且同样不适用于邮递员

enter image description here

答案 1 :(得分:1)

HTTP状态代码500代表internal server error,明确指出您在客户端没有任何问题(这里是您的情况Volly),但问题出在服务器上-侧。尝试调试您的服务器端php代码。代码未正确执行,因此在Http响应标头中返回500 internal server errorVolly只是将接收到的标头作为错误抛出。

如果您是后端开发人员,则在与移动应用程序集成之前,应先使用REST Clients进行尝试。您可以从Here获得它。您的API应该经过良好的测试,并且应该处于工作状态,否则您将始终收到错误消息。

答案 2 :(得分:1)

我有东西 首先将okhttp导入Gradle依赖项(库)中。 这是文档

https://square.github.io/okhttp/

打开邮递员,然后单击代码菜单enter image description here

您可以在发送按钮下方看到代码按钮。单击它,然后选择java-> okhttp

复制代码并将其粘贴到android studio中。它有99.9%的机会会起作用。

答案 3 :(得分:1)

我稍微修改了代码,并在邮递员中对其进行了检查,效果很好。

我将JSON编码语句从if语句中移出了。

// output data of each row
while($row = $result->fetch_assoc()) {

    $id=$row['id']; 

    $company_name=$row['company_name'];
    $cuisine=$row['cuisine'];
    $conpany_phone=$row['conpany_phone'];
    $company_description=$row['company_description']; 
    $company_logo=$row['company_logo'];
    $company_type=$row['company_type'];
    $delivery_type=$row['delivery_type'];
    $delivery_range=$row['delivery_range']; 
    $delivery_fee=$row['delivery_fee'];
    $delivery_pickupinfo=$row['delivery_pickupinfo'];
    $address=$row['address'];

    $companyData[] = array('id'=> $id,'company_name'=> 
    $company_name,'cuisine'=> $cuisine,'conpany_phone'=> 
    $conpany_phone,'company_description'=> 
    $company_description,'company_logo'=> $company_logo,'company_type'=> 
    $company_type,'delivery_type'=> $delivery_type,'delivery_range'=> 
    $delivery_range,'delivery_fee'=> 
    $delivery_fee,'delivery_pickupinfo'=> $delivery_pickupinfo,'address'=> $address);   
}
echo $jsonformat=json_encode($companyData);

$conn->close();

答案 4 :(得分:0)

此错误“ 500”表示服务器端错误。在以下情况下会发生此错误:-

  1. 参数或网址的拼写可能错误
  2. 缺少参数。
  3. 或者您发送的是服务器不接受的内容。
  4. 还要在Urls上选中“ http:/”或“ https:/”。

检查这些条件。我也遇到了同样的问题。API在Post Man上运行,但在使用截击的设备上不运行。希望对您有帮助。

答案 5 :(得分:0)

请检查您尝试发送的所有参数是否与服务器期望的相同。错误或缺失的参数也会返回500错误。 在您的请求中重新验证此参数Company_mobile。希望这能解决您的问题。

答案 6 :(得分:0)

以5开头的HTTP状态代码表示错误在服务器端。代码500被解释为内部服务器错误,要解决此问题,您必须检查可能导致该错误的原因。在这种情况下,可能是由于代码错误引起的,您可以打开error_log查看错误并采取相应措施。

这可能是由于服务器功能暂时无法使用,例如访问数据库或具有多个同时打开的连接而超出了相关的mysql资源。

有时,该错误未记录到error_log文件中。如果使用面板,请在主页的“度量”选项卡下,打开“错误”,然后根据您请求服务器的时间进行检查。如果您不使用cpanel,请查找相应的服务器日志。

遵循此正确标记答案..可能会帮助您

How to deal with unexpected response 500 in Android

答案 7 :(得分:0)

检查您的db.php文件,然后查看返回连接对象的变量。

我认为应该是$con->close()且n为n,而不是$conn->close()且为double n

答案 8 :(得分:0)

您的问题可能来自 ContentType

您添加此:

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

return "application/json"

如果问题仍未解决 您必须使用 JsonObjectRequest

答案 9 :(得分:0)

尝试包括在您的php文件中:

header('Content-Type: application/json');
header("Access-Control-Allow-Origin: *");

我不熟悉Kotlin,但是使用Java对我来说很好用,这是代码:

private void loadRecyclerViewData2(){
        URR_DATA="http://squadtechsolution.com/android/v1/allcompany.php";
        StringRequest stringRequest = new StringRequest(Request.Method.GET,
                URR_DATA,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        System.out.println("****"+response);
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        System.out.println("***"+error.getMessage());                    }
                });
        requestQueue = Volley.newRequestQueue(Home.this);
        requestQueue.add(stringRequest);
    }

我得到以下输出:

I/System.out: ****
    [{"id":"1","company_name":"ABC","cuisine":"QATAR","conpany_phone":"4535345","company_description":"Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut ","company_logo":"company_logo5d80bac690f2e.png","company_type":"Food","delivery_type":"yes","delivery_range":"55","delivery_fee":"","delivery_pickupinfo":"Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, ","address":"33.58539655788556,71.43779296427965"}]

答案 10 :(得分:0)

@Muhammad Faizan忽略您的疑问,该问题 IS 是500服务器错误

这是原因

  • POSTMAN和VOLLEY不同
  • a)您的PHP代码or中有一个错误B)有一个环境设置可以暴露

诊断PHP问题

,您需要在php上打开error_log。根据您的服务器,可能很难解释另一种方法是将php.ini更改为error_log以便在服务器上尝试此操作

lifted from here deliberately

/*This always works for me:*/

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

/*However, this doesn't make PHP to show parse errors - the only way to show those errors is to modify your php.ini with this line:*/

display_errors = on
/*(if you don't have access to php.ini, then putting this line in .htaccess might work too):*/

php_flag display_errors 1

诊断服务器上的环境问题

如果error_log不产生任何结果,请尝试access_log。为什么? 因为它可能表明传入了不同类型的请求。而POSTMAN和VOLLEY并不相同

您需要潜在地查看您的access_log,并在单击邮递员然后单击截击客户端时实时观看

事实:(为什么我们可以确定)

我的直觉说您在配置错误的服务器中遇到问题。不管您相信与否,在这种情况下,access_log将为您提供最大的帮助。

无论如何:在您放入POSTMAN中的内容和凌空客户端发送的内容之间显然存在一个问题,这就是造成这种情况的原因。

我看到的原因包括:

  • 这可能是SAME ORIGIN错误。
  • 这可能是一个INTERNAL SERVER REDIRECT问题。
  • 从$ _GET到$ _POST的不正确转发(我在nginx上看到了这个问题)
  • 这可能是一个糟糕的路径问题,正在被no-redirect和缺乏安全性所困扰。

但是在不告诉我们平台或服务器(Windows?Linux?nginx?php-fpm?apache?等)的情况下,我们无法在这些方面为您提供帮助

答案 11 :(得分:0)

如果仍未解决,我将发布另一个答案。 在邮递员中复制所有标题,例如

.addHeader("content-type", "application/json")
.addHeader("cache-control", "no-cache")
.addHeader("postman-token", "fa72f792-c9d3-7891-a544-f37f634f6ee1")

并将其放入volly params