为HTTP请求设置时间限制
当XMLHttpRequest请求没有成功时,在指定的时间段后显示有帮助的信息。
XMLHttpRequest对象会打开一组异常,这些异常是连接服务器失败时由JavaScript程序产生的。为什么会发生?网络延迟可能是问题所在,或者服务器出现了错误。你并不知道你的用户连接得有多快,服务器端程序也可能因为处理大量同步请求而陷于停滞,甚至完全中断。无论如何,作为一个开发者,你希望控制用户等待多长的时间来获得应用的响应。就我们所知,用户不愿意等待太长时间,超过几秒钟通常被认为是不可接受的。
本hack在显示友好的信息给用户前花10秒钟等待服务器响应。
提示:如果你愿意,可以是5秒或更少,或者60秒。最大可容忍的等待时间依赖于你的应用场景、你的用户测试结果,以及其他因素。例如,比起依赖于应用并对其投入大量时间的局域网用户,一个普通的公众客户可能更希望一个活跃的应用,不愿意花时间等待。
本hack使用顶层window对象的名为setTimeout()的JavaScript方法。
提示:感谢Joshua Gitlin及他在http://www.xml.com/ pub/a/2005/05/11/ajax-error.html所发表的文章,它给本技术提供了很好的提示。
你可以不需要在前面冠以window对象而使用window对象的方法。换句话说,只使用setTimeout()和使用window.setTimeout()一样能正常工作。
setTimeout()接收一个函数名或者函数体作为第一个参数,另一个参数是调用方法前要等待的毫秒数(千分之一秒)。它返回一个数字值,这个数字值能用于取消函数调用。待会儿将会为你展示这些;同时,这里有段代码http_request.js,它封装了XMLHttpRequest对象的初始化以及用法。(“使用自己的库封装XMLHttpRequest”[Hack #3]可见更完整的解释。)
下面就是代码,重新改进以包含setTimeout()和一个新函数timesUp():
var request = null;
var timeoutId;
/* request对象的封装函数。
参数:
reqType: HTTP请求类型,如GET 或 POST。
url: 服务器端程序的URL
asynch: 是否异步发送请求
respHandle: 处理响应的函数名
arguments[4]所代表的第5个参数是POST请求要发送的数据
*/
function httpRequest(reqType,url,asynch,respHandle){
//基于Mozilla的浏览器
if(window.XMLHttpRequest){
request = new XMLHttpRequest();
} else if (window.ActiveXObject){
request=new ActiveXObject("Msxml2.XMLHTTP");
if (! request){
request=new ActiveXObject("Microsoft.XMLHTTP");
}
}
//如果ActiveXObject没有被初始化,我们会测试到一个null的request
if(request) {
//如果请求类型是POST,那么第5个参数是被发送的数据
if(reqType.toLowerCase() != "post") {
initReq(reqType,url,asynch,respHandle);
} else {
//被发送的数据
var args = arguments[4];
if(args != null && args.length > 0){
initReq(reqType,url,asynch,respHandle,args);
}
}
} else {
alert("Your browser does not permit the use of all "+
"of this application's features!");
}
}
/*初始化已经构造的request对象 */
function initReq(reqType,url,bool,respHandle){
try{
/*指定处理HTTP响应的函数 */
request.onreadystatechange=respHandle;
request.open(reqType,url,bool);
timeoutId = setTimeout(timesUp,10000);
//如果请求类型是POST,那么第5个参数是被发送的数据
if(reqType.toLowerCase() == "post") {
request.setRequestHeader("Content-Type",
"application/x-www-form-urlencoded; charset=UTF-8");
request.send(arguments[4]);
} else {
request.send(null);
}
} catch (errv) {
alert(
"The application cannot contact "+
"the server at the moment. "+
"Please try again in a few seconds.\n"+
"Error detail: "+errv.message);
}
}
function timesUp(){
//见下...
request.open()方法为发起一个HTTP连接准备了XMLHttpRequest对象。然后代码在请求被发送之前调用setTimeout()。下面是余下的代码:
/* XMLHttpRequest的事件处理器;这个函数并不是
http_request.js的一部分,但是将被定义在另一个使用
http_request.js的代码文件里,就像在
httpRequest("GET",url,true,handleReq)一样 */
function handleReq(){
if(request.readyState == 4){
//timeoutId 在http_request.js中声明
//但在这儿能作为一个全局变量引用
clearTimeout(timeoutId);
if(request.status == 200){
//做些有趣的事...
}
}//结束外部的if
}
function timesUp(){
request.abort();
alert("A problem occurred with communicating with "+
"the server program. Please make sure you are connected "+
"to the Internet and try again in a few moments.");
}
回想一下 setTimeout()每隔10秒钟调用一次timesUp()函数。如果过了10秒钟,request.readyState ==4没有返回true(代表HTTP请求完成),那么清除时限(timeout),timesUp()中止请求并显示一个alert窗口给用户。这个动作停止了请求;用户不得不重新启动和应用的交互以发起另一个请求。
提示:如果你想将时限设为3秒,例如,安装代码看起来如下:
timeoutId = setTimeout(timesUp,3000);
如果HTTP请求无故障地成功完成,代码将前面提到的timeoutId作为参数来调用clearTimeout()。这个动作立即取消了timesUp()的调用,让应用程序继续执行,做它想做的工作。
分享到:
相关推荐
本主题聚焦于"cpp-并行执行http请求支持超时设置",这涉及到并发处理、HTTP协议以及时间管理等核心概念。 首先,"并行执行http请求"指的是同时发起多个HTTP请求,以提高程序的执行效率。在多核处理器和现代操作系统...
在上面的代码中,我们使用了 XMLHttpRequest 对象来发送 HTTP 请求,并设置了 timeout 属性来限制请求时长。这样,Node.js 就不会继续请求下去,即使遇到 404 响应。 另一种解决方法是使用 Node.js 的 http 模块,...
在Go语言中,HTTP客户端是进行网络通信的重要组成部分,它允许我们向远程服务器发送HTTP请求并接收响应。Go的标准库`net/http`提供了强大的HTTP客户端功能,但有时我们需要更高级的功能,例如异步请求处理。这里我们...
在C#中,我们可以使用`System.Net.Http`命名空间中的HttpClient类来处理HTTP请求。以下是如何使用HttpClient发送GET和POST请求的示例: **GET请求示例:** ```csharp using System.Net.Http; using System....
为了解决上述问题,可以通过修改Windows注册表中的相应设置来延长IE浏览器的HTTP请求超时时间。下面将详细介绍具体的步骤: 1. **暂时禁用防火墙和杀毒软件** - 如果计算机上已安装了防火墙或杀毒软件,这些安全...
1. **微信小程序的网络请求接口**:微信小程序提供了`wx.request()`接口来执行HTTP请求,它允许开发者向服务器获取数据,如JSON、图片等。使用`wx.request()`时,需要提供URL、请求方法(GET或POST)以及数据等参数...
回到我们的示例,"http请求options测试"可能包含了一个前端项目和一个后端接口,用于演示如何设置CORS策略以及OPTIONS预请求的工作流程。前端部分可能创建了一个跨域请求,而后端部分则配置了相应的响应头以允许这个...
总之,对于HTTP请求长时间等待无结果返回的问题,关键在于合理设置请求超时,并且在超时时能正确处理异常,避免进程阻塞。同时,与服务提供商保持良好的沟通,共同排查和解决可能存在的服务器端问题,是预防此类问题...
5. **超时控制**:为整个请求加上超时限制,如果在设定时间内未收到响应,则终止请求,不再重试。 在代码实现上,我们可以创建一个自定义的`Interceptor`类,重写`intercept(Chain chain)`方法。在该方法中,我们...
然而,在这种特定情况下,“请求筛选模块被配置为拒绝超过请求内容长度的请求”,这意味着服务器上的安全策略或配置阻止了请求的处理,因为请求的数据量超过了预先设定的限制。 #### 二、原因分析 这类错误通常...
当这个时间限制到达而操作仍未完成,系统会认为该操作失败并采取相应措施,比如重试或抛出异常。在网络通信中,超时设置尤为重要,因为网络延迟、服务器负载或网络故障可能导致请求无法及时响应。 在CXF中,超时...
首先,Android系统为了防止主线程被长时间的网络操作阻塞,引入了异步任务和网络访问的限制。因此,我们通常会在后台线程执行Http请求,而主线程负责展示数据。这可以通过使用`AsyncTask`,`Thread`+`Handler`,或者...
在本文中,我们将探讨HTTP请求流程,特别是为什么很多网站第二次打开时速度会更快,以及用户登录后再次访问站点时如何保持登录状态。HTTP协议是建立在TCP连接基础之上的,用于浏览器向服务器获取各种资源,如HTML、...
如果一个网页中包含大量独立的图像资源,那么这将导致大量的HTTP请求,延长页面加载时间。因此,通过合并多个小图像为一张大图,然后使用图片地图可以显著减少HTTP请求的数量。 HTML的`<img>`标签常用于在网页中...
这个示例中的限制仅在前端实现,意味着用户可以通过禁用JavaScript或者直接发送HTTP请求来绕过这个限制。为了增强安全性,通常需要在服务器端也进行验证。例如,可以使用Session或Cookie来记录最近的请求时间,当新...
1. **请求构造**:允许用户自定义HTTP请求的各个部分,包括URL、HTTP方法(Post或Get)、请求头、以及POST请求的数据。 2. **代理设置**:HttpProxy工具可能支持配置HTTP代理服务器,使得用户可以通过代理服务器...
`connection-timeout`属性定义了服务器等待客户端发送请求数据的时间,而`max-http-header-size`则限制了单个HTTP请求头的最大大小。对于keepalive,我们需要关注`keep-alive-timeout`属性,它设定了在服务器关闭...
- **设置超时**:限制请求等待时间。 ```python response = requests.get('http://example.com', timeout=5) ``` - **携带Cookie**:在请求中附带Cookie信息。 ```python cookies = dict(cookies_are='working') ...
为了解决这个问题,BootstrapTable 提供了设置超时(timeout)的功能,使得在请求数据时可以设定一个等待限制,超过这个限制就认为请求失败,并进行相应的处理。 当使用 BootstrapTable 获取数据时,通常会通过 ...