我使用Volley库向服务器发送请求以登录应用程序。几个小时前它没有任何问题。但没有任何理由,我收到此错误“ BasicNetwork.performRequest:意外的响应代码429 ”
代码是这样的:
public void loginRequest(final String username, final String password) {
String URL = Misc.Server_Url() + "login";
final StringRequest sr = new StringRequest(Request.Method.POST, URL, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
JSONObject obj;
try {
obj = new JSONObject(response);
if (obj.getInt("success") == 1) {
startActivity(new Intent(ActivityLogin.this, ActivityArticles.class));
finish();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
}
}) {
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> params = new HashMap<>();
params.put("Content-Type", "application/x-www-form-urlencoded");
return params;
}
@Override
protected Map<String, String> getParams() {
Map<String, String> params = new HashMap<>();
params.put("username", username.trim());
params.put("password", password);
return params;
}
};
RetryPolicy policy = new DefaultRetryPolicy(2 * 1000, 2, 2);
sr.setRetryPolicy(policy);
AppController.getInstance().addToRequestQueue(sr);
}
我在维基百科中搜索了这个错误(429),我发现这意味着:“用户在给定的时间内发送了太多请求”
从服务器端(php)获得更高的安全性,如果从ip获得超过例如60秒内的请求,它将阻止该IP一段时间...并且客户端获得429错误代码。我想知道当我向服务器发送一个与上述代码相同的请求时它将如何发生!在政策中我将尝试设置为2次不超过该次数。我不知道为什么当我发送这个请求时我得到错误429.意味着你在有限的时间内发送了60个请求。
你知道如何解决这个问题吗? 提前谢谢......答案 0 :(得分:1)
是的,正如你所说,429响应代码说明了这一点。但是,棘手的部分是服务器发送此响应代码
如果您阅读了与响应代码相关的RFC,您会看到RFC 不表明服务器必须识别单个用户并且只发送繁忙的用户状态:429。可能是因为其他人发送了太多请求,服务器正在向所有人发送429响应。
此外,RFC声明服务器应响应429响应,服务器可以在其响应头中发送以下参数。
Retry-After: 3600
这意味着您应该在此超时后重试。
答案 1 :(得分:0)
原因是服务器中的缓存系统。 如果我们每次发送新的请求,它工作正常。但是如果我们的请求使用来自服务器中的缓存策略系统...它会出现429错误号...