使用Volley库时出现com.android.volley.ServerError错误,可能的原因有哪些?

8
当我在Volley中发送请求时,我会收到com.android.volley.ServerError和响应代码400。
我做的类似于以下示例代码(通用示例代码):
final String param1 = "...";
final String param2 = "...";
// etc. 

StringRequest stringRequest = new StringRequest(Request.Method.POST, API_URL,
        new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                Toast.makeText(MainActivity.this,response,Toast.LENGTH_LONG).show();
            }
        },
        new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(MainActivity.this,error.toString(),Toast.LENGTH_LONG).show();
            }
        }){
    @Override
    protected Map<String,String> getParams(){
        Map<String,String> params = new HashMap<String, String>();
        params.put("PARAM_1", param1);
        params.put("PARAM_2",password);
        return params;
    }

};

RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(stringRequest);

这可能是什么原因导致的?

1
我建议使用tcpdump或wireshark在网络上捕获请求,并将其与浏览器或Postman中的工作请求进行比较。 - Gary Bak
你的 PHP 脚本也可能有问题,我曾经遇到过这种情况。 - Manny265
我遇到了一个类似的问题,但后来我意识到我的URL没有使用HTTPS,而是HTTP。一旦我切换到HTTPS,它就完美地工作了。请仔细检查以确保您没有犯同样的疏忽。 - undefined
8个回答

8

我曾经遇到过同样的问题,它浪费了我一整天的时间。最终,我找到了微小的错误,就是我在参数中传递了一个空值。

检查一下你是否在getParams()或JSON对象中向服务器传递了空值。如果是的话,那可能就是问题所在。


2
如果有帮助的话: 你不想传递任何参数?--> 将其设置为null,但不要使用空的HashMap<String, String>作为第二个参数。例如,这样可以工作:JsonObjectRequest(YOUR_URL, null, ...) - Andi F.
我遇到了一个类似的问题,但后来我意识到我的URL没有使用HTTPS,而是HTTP。一旦我切换到HTTPS,它就完美地工作了。请仔细检查,确保你没有犯同样的疏忽。 - undefined

7
在下面的方法中:
public void onErrorResponse(VolleyError error)

添加这一行:

error.printStackTrace()

你将获得所有堆栈跟踪,这将为您提供实际错误。我也遇到了这个错误,但在我的情况下,它实际上是TimeoutException。

我遇到了类似的问题,但后来我意识到我的URL没有使用HTTPS,而是HTTP。一旦我切换到HTTPS,它就完美地工作了。请仔细检查,确保你没有犯同样的疏忽。 - undefined

3

响应码400表示请求错误。

一些可能的原因如下:

  1. 请求方法可能有问题,是GET还是POST?
  2. API可能需要授权头信息。

我遇到了类似的问题,但后来我意识到我的URL没有使用HTTPS,而是HTTP。一旦我切换到HTTPS,它就完美地工作了。请仔细检查,确保你没有犯同样的疏忽。 - undefined

1

此错误可能的原因:

  1. URL 错误。检查您的 URL 是否有任何错误。
  2. 参数缺失,任何参数具有空值或您缺少任何参数。
  3. 注意 params 中定义的键,它应该与 API 中的键匹配。

1
您可能还需要告知服务器发送带有200代码的响应,Volley会检查这些代码。

1
这个错误可能意味着“错误的请求”,请检查您发送的标头。通过重载getHeaders()方法,您可以发送正确的标头。
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
    return (headers != null || headers.isEmpty()) ? headers : super.getHeaders();
}

此外,通常 WebServices 需要应用程序/json头,如下所示:
headers.put("Accept","application/json");
headers.put("Content-Type","application/json");

0

请仔细检查您的参数(不应该有空参数)。如果一切正常,那么如果您正在使用JSONObjectRequest,根据新的谷歌政策,请删除Request.Method.GET


0
我遇到了类似的问题,但后来我意识到我的URL没有使用HTTPS,而是HTTP。一旦我切换到HTTPS,它就完美地工作了。请仔细检查,确保你没有犯同样的疏忽。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接