SuperMonster003 / AutoJs6

安卓平台 JavaScript 自动化工具 (Auto.js 二次开发项目)
https://docs.autojs6.com
Mozilla Public License 2.0
2.16k stars 656 forks source link

HTTP 设置请求超时无效 #196

Open anenn opened 7 months ago

anenn commented 7 months ago

方式一: (function () { let request = http.request; http.request = function () { try { return request.apply(http, arguments); } catch (err) { console.error('HTTP Error:', err); return null; } } })(); http.okhttp.setTimeout(10000);

方式二: var response = http.get(url, { timeout: 10000, headers: { contentType: 'application/json' } });

上述两种方式设置请求的超时,都没有效果,请求会一直卡着。

bukkumaaku commented 7 months ago

我也遇到了这个问题,找了很久都不能解决,现在勉强用着另一个方法:

先设置res为空 然后用线程启动一个http请求,在线程里面令res=http请求 然后用Thread.join来设置超时

let res;
let t = threads.start(()=>{
    res=http.post(...);
});

t.join(5000);
t.interrput();
anenn commented 7 months ago

我也遇到了这个问题,找了很久都不能解决,现在勉强用着另一个方法:

先设置res为空 然后用线程启动一个http请求,在线程里面令res=http请求 然后用Thread.join来设置超时

let res;
let t = threads.start(()=>{
    res=http.post(...);
});

t.join(5000);
t.interrput();

感谢,这段代码可以解决。 🤝👍

SuperMonster003 commented 3 months ago

我尝试使用下述两个示例代码进行测试 (示例 A 和 示例 B, 其区别仅在于 timeout 参数值), 结果如预期, 即示例 A 正常返回用户名, 示例 B 超时并抛出 java.net.SocketTimeoutException 异常.

示例 A:

let url = 'https://api.github.com/users/supermonster003';
let response = http.get(url, {
    timeout: 10000,
    headers: { contentType: 'application/json' },
});
console.log(response.body.json().name);

示例 B:

let url = 'https://api.github.com/users/supermonster003';
let response = http.get(url, {
    timeout: 100,
    headers: { contentType: 'application/json' },
});
console.log(response.body.json().name);

可以尝试不加 timeout 参数检查是否会导致无限阻塞, 或尝试其他 URL 检查是否存在同样问题.

另 AutoJs6 中 http 模块的 timeout 参数功能内部实现, 就是使用的 http.__http__.setTimeout 方法, 所以本质上你提供的方式一与方式二是等价的.

Sent from my XQ-DQ72 using FastHub