我正在使用 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 没有声明服务器必须识别单个用户并且只向他们发送忙碌状态:429。这可能是因为其他人发送了太多请求并且服务器正在向所有人发送 429 响应。
此外,RFC 声明服务器应响应 429 响应,并且服务器可以在其响应 header 中发送以下参数。
Retry-After: 3600
这意味着您应该在此超时后重试。
关于android - 基本网络.performRequest : Unexpected response code 429 (android),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36959156/