我正在使用 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 在 10 秒内收到超过 60 个请求,它将阻止该 IP 一段时间......并且客户端会收到 429 错误代码。我想知道当我向服务器发送与上面代码相同的单个请求时会如何发生!在策略中我将尝试设置为 2 次,不超过该次数。我不知道为什么当我发送此请求时,我收到错误 429。这意味着您在有限的时间内发送了 60 个请求。
你知道如何解决这个问题吗? 预先感谢...
是的,正如您所说,429 响应代码说明了这一点。然而,棘手的部分是服务器会为任一者发送此响应代码
如果您阅读与响应代码相关的 RFC,您会发现 RFC not 声明服务器必须识别单个用户并仅向他们发送忙碌状态:429。这可能是因为其他人正在发送请求太多,服务器正在向所有请求发送 429 响应。
此外,RFC 规定服务器应使用 429 响应进行响应,并且服务器可以在其响应标头中发送以下参数。
Retry-After: 3600
这意味着您应该在此超时后重试。
टेस्टबुकएपबिल्कुलकामनहींकररहाहै
原因是服务器中的缓存系统。 如果我们每次发送新的请求,它就可以正常工作。但是如果我们的请求使用服务器中的缓存策略系统...则会出现 429 错误号...