处理超时的 http 请求,而实际上请求已被服务器成功处理
Handle http request that has timedout while in reality request was processed by server successefully
考虑下一个案例。
我正在通过我的应用程序向服务器发布一些内容。例如,我已将连接和响应超时设置为 3000 毫秒。
在网络连接速度较慢的情况下,用户应用程序将抛出异常,该异常将被处理以通知用户请求已超时,但实际上请求和数据已被服务器成功处理。
当然我会设置超时时间超过3000ms,我只是为了测试目的才注意到这个问题,但我不禁想知道如何处理?
第一步是将我们的 api 发送到应用程序的控制状态代码,如果此代码是 'statusCode == 200' 我们可以知道连接的开始和结束是正确的。作为第二步,我这样做我的服务器将向我发送自定义答案。例如,如果我可以读取所有内容并且我们正确地完成了连接,我会发送 'OK' 作为来自我的服务器的响应实体。你可以在下面看到我的代码:
private String Sync3_GetRequest_NewLocalInformation(String url,String id,List<NameValuePair> ListOfValues){
//Declaration of variables
DefaultHttpClient httpClient;
HttpPost Request = new HttpPost(url);
HttpResponse Response;
HttpParams httpParameters = new BasicHttpParams();
httpParameters.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
String Result = "Completed";
// Set the timeout in milliseconds until a connection is established.
// The default value is zero, that means the timeout is not used.
int timeoutConnection = 3000;
HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
// Set the default socket timeout (SO_TIMEOUT)
// in milliseconds which is the timeout for waiting for data.
int timeoutSocket = 60000;
HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
httpClient = new DefaultHttpClient(httpParameters);
try {
HttpEntity entity = new UrlEncodedFormEntity(ListOfValues);
Request.setHeader(entity.getContentType());
Request.setEntity(entity);
Response = httpClient.execute(Request);
if (Response.getStatusLine().getStatusCode() == 200) {
String EntityResult = EntityUtils.toString(Response.getEntity());
Log.e("-- Sync_Class.Sync3_GetRequest_NewLocalInformation --", EntityResult);
if(EntityResult.contains("\"message\":OK")){
//My code
}
else{
Log.e("-- Sync_Class.Sync3_GetRequest_NewLocalInformation --", "Invalid code");
}
return Result;
}
else{
MainActivity.CanUpdate = true;
Log.e("-- Sync_Class.Sync3_GetRequest_NewLocalInformation --", "Invalid Status Code");
throw new RuntimeException("Invalid Status Code");
}
}
catch (Exception ex){
MainActivity.CanUpdate = true;
Log.e("-- Sync_Class.Sync3_GetRequest_NewLocalInformation --", "Exception",ex);
return ex.toString();
}
}
我用简单的步骤来控制这个问题。如果我能帮到你,请告诉我,祝你好运!
考虑下一个案例。
我正在通过我的应用程序向服务器发布一些内容。例如,我已将连接和响应超时设置为 3000 毫秒。
在网络连接速度较慢的情况下,用户应用程序将抛出异常,该异常将被处理以通知用户请求已超时,但实际上请求和数据已被服务器成功处理。
当然我会设置超时时间超过3000ms,我只是为了测试目的才注意到这个问题,但我不禁想知道如何处理?
第一步是将我们的 api 发送到应用程序的控制状态代码,如果此代码是 'statusCode == 200' 我们可以知道连接的开始和结束是正确的。作为第二步,我这样做我的服务器将向我发送自定义答案。例如,如果我可以读取所有内容并且我们正确地完成了连接,我会发送 'OK' 作为来自我的服务器的响应实体。你可以在下面看到我的代码:
private String Sync3_GetRequest_NewLocalInformation(String url,String id,List<NameValuePair> ListOfValues){
//Declaration of variables
DefaultHttpClient httpClient;
HttpPost Request = new HttpPost(url);
HttpResponse Response;
HttpParams httpParameters = new BasicHttpParams();
httpParameters.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
String Result = "Completed";
// Set the timeout in milliseconds until a connection is established.
// The default value is zero, that means the timeout is not used.
int timeoutConnection = 3000;
HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
// Set the default socket timeout (SO_TIMEOUT)
// in milliseconds which is the timeout for waiting for data.
int timeoutSocket = 60000;
HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
httpClient = new DefaultHttpClient(httpParameters);
try {
HttpEntity entity = new UrlEncodedFormEntity(ListOfValues);
Request.setHeader(entity.getContentType());
Request.setEntity(entity);
Response = httpClient.execute(Request);
if (Response.getStatusLine().getStatusCode() == 200) {
String EntityResult = EntityUtils.toString(Response.getEntity());
Log.e("-- Sync_Class.Sync3_GetRequest_NewLocalInformation --", EntityResult);
if(EntityResult.contains("\"message\":OK")){
//My code
}
else{
Log.e("-- Sync_Class.Sync3_GetRequest_NewLocalInformation --", "Invalid code");
}
return Result;
}
else{
MainActivity.CanUpdate = true;
Log.e("-- Sync_Class.Sync3_GetRequest_NewLocalInformation --", "Invalid Status Code");
throw new RuntimeException("Invalid Status Code");
}
}
catch (Exception ex){
MainActivity.CanUpdate = true;
Log.e("-- Sync_Class.Sync3_GetRequest_NewLocalInformation --", "Exception",ex);
return ex.toString();
}
}
我用简单的步骤来控制这个问题。如果我能帮到你,请告诉我,祝你好运!