request 回调函数问题 success fail
发布于 5 年前 作者 min63 15703 次浏览 来自 问答

调用wx.request接口后,服务器返回HTTP状态码401,本来希望小程序中掉起fail回电函数,但是掉起的是success。请问success和fail是怎么界定的?

4 回复

顺便附上我的对 wx.request 包装的代码:

App({
    request: function (data, finish) {
        var params = {
            url: 'https://xxx.com/index.php',
            data: data,
            complete: function (res) {
                if (typeof finish != 'function') return;
                if (res.errMsg != 'request:ok' || typeof res.data != 'object' || !res.data.success) {
                    finish(false, res);
                    return;
                }
                finish(true, res.data.result);
            }
        }
        wx.request(params);
    },

这样的话,所有原来需要调用 wx.request 的地方都改成 app.request 就好了,类似下面这样:

var app = getApp();
app.request({...}, function(success, result) {
    // ...
});

返回的数据是什么

401时,服务器返回的数据是我自己定义的错误信息

我猜想 wx.request 的 success 和 fail 本意是用来区分网络层的成功与失败,比如连接超时、传输中断。这样的话,401、500 之类被归为 success 似乎也说得通,因为它至少在 HTTP request/response 层面是完整的。


但无论如何这种处理方式的确有点反直觉,也许只是一个 BUG 吧……


我个人的习惯是,服务器端程序在正常的响应中加入自己的 success 标志,而小程序端不使用 success 和 fail,只使用 complete,只有在 'request:ok' 并且自己的 success 标志置位的情况下,才认为“成功”,否则认为“失败”。


哈哈,你的分析很到位哇。最近在摸索小程序开发,能否交流一下?

如果request是桥梁的话,那么把结果从服务器端转交给客户端时,应该保证状态传递的一致性。如果服务器端已经告知这个处理结果是不成功的,那么客户端看到的结果也应该是不成功的。

如果request的定位是跟HTTP同属一个网络层级,success||fail和HTTP状态码对等,那么,如果服务器端我们是通过HTTP状态码来定性结论的,而到了客户端中又无法根据success||fail来定性结论,这是不对等的。

我猜想 wx.request 的 success 和 fail 本意是用来区分网络层的成功与失败,比如连接超时、传输中断。这样的话,401、500 之类被归为 success 似乎也说得通,因为它至少在 HTTP request/response 层面是完整的。

但无论如何这种处理方式的确有点反直觉,也许只是一个 BUG 吧……

我个人的习惯是,服务器端程序在正常的响应中加入自己的 success 标志,而小程序端不使用 success 和 fail,只使用 complete,只有在 ‘request:ok’ 并且自己的 success 标志置位的情况下,才认为“成功”,否则认为“失败”。

返回的数据是什么

回到顶部