前后端交互接口封装管理(AJAX HTTP)
文档

better-api

jquery



jquery
var BetterAPI = require('better-api')
var $ = require('jquery')
var message = require('face-message')
var api = new BetterAPI({
    defaultSettings: {
        dataType: 'json'
    },
    loading: function (isLoading, failArg) {
        if (isLoading) {
            message.loadingBar.show(2)
        }
        else {
            switch (failArg[1]) {
                case 'abort':

                    break;
                case undefined:
                    message.loadingBar.hide()
                    break
                default:
                    message.loadingBar.fail()
            }
        }
    },
    input: function (req) {
        return req
    },
    output: function (res, req) {
        return res
    },
    fetch: function (data, settings, callback) {
        settings.data = data
        return $.ajax(settings)
                .done(callback.net.done)
                .fail(callback.net.fail)
                .always(callback.after)
    },
    defaultCallback: {
        net: {
            fail: function (jqXHR, textStatus) {
                switch(textStatus) {
                    case 'timeout':
                        message.error('网络超时')
                    break
                    case 'abort':
                    break
                    default:
                        message.error('网络错误')
                }

            }
        }
    },
    judgeResponseType: function (res) {
        return res.status
    },
    defaultResponseType: {
        pass: function () {
            message.success('操作成功')
        },
        fail: function (res) {
            message.error('fail:' + res.msg)
        },
        error: function (res) {
            message.error('error:' + res.msg)
        }
    }
})
var apiPass = api.create({
    settings: {
        url: 'http://118.25.125.213:9823/onface/echo/mock/pass',
        type: 'get'
    }
})
var apiFail = api.create({
    settings: {
        url: 'http://118.25.125.213:9823/onface/echo/mock/fail',
        type: 'get'
    }
})
var apiNetFail = api.create({
    settings: {
        url: '/404',
        type: 'get'
    }
})
var apiDelay = api.create({
    settings: {
        url: 'http://118.25.125.213:9823/onface/echo/mock/pass?$delay=1000',
        type: 'get'
    }
})
$(function () {
    $('#jquery-pass').on('click', function () {
        apiPass(
            // data
            {
                name: 'nimo'
            },
            // callback
            {
                pass: function () {
                    message.success('操作成功')
                },
                fail: function (res) {
                    message.error(res.msg)
                }
            }
        )
    })
    $('#jquery-fail').on('click', function () {
        apiFail(
            // data
            {
                name: 'nimo'
            },
            // callback
            {
                pass: function () {
                    alert('操作成功')
                },
                fail: function (res) {
                    message.error(res.msg)
                }
            }
        )
    })
    $('#jquery-fail-detailAction').on('click', function () {
        apiFail(
            // data
            {
                name: 'nimo'
            },
            // callback
            {
                pass: function () {
                    message.success('操作成功')
                },
                fail: function (res) {
                    this.defaultAction()
                    message.error('More message (fail)')
                }
            }
        )
    })
    $('#jquery-net-fail').on('click', function () {
        apiNetFail()
    })
    $('#jquery-net-fail-custom').on('click', function () {
        apiNetFail({}, {}, {
            net: {
                fail: function () {
                    message.error('(自定义)网络错误')
                }
            }
        })
    })
    $('#jquery-net-fail-defaultAction').on('click', function () {
        apiNetFail({}, {}, {
            net: {
                fail: function () {
                    this.defaultAction()
                    message.error('More message ($net.fail)')
                }
            }
        })
    })
    $("#jquery-abort").on('click', function () {
        var api = apiDelay({}, {}, {
            net: {
                fail: function () {
                    console.log(arguments)
                }
            }
        })
        api.abort()
    })
    $('#jquery-loading').on('click', function () {
        apiDelay({}, {}, {
            loading: function (isLoading) {
                console.log('isLoading', isLoading)
            }
        })
    })
})

axios

axios
var BetterAPI = require('better-api')
var axios = require('axios')
var message = require('face-message')
var CancelToken = axios.CancelToken

var api = new BetterAPI({
    defaultSettings: {
        dataType: 'json'
    },
    loading: function (isLoading, failArg) {
        // console.log(failArg)
        // if (isLoading) {
        //     message.loadingBar.show(2)
        // }
        // // failArg = [jqXHR, textStatus, errorThrown]
        // else if (failArg[1] !== 'abort') {
        //     message.loadingBar.fail()
        // }
        // // else if (failArg[1] === 'abort') {
        // //     message.loadingBar.hide()
        // // }
        // else {
        //     message.loadingBar.hide()
        // }
    },
    input: function (req) {
        return req
    },
    output: function (res, req) {
        return res
    },
    fetch: function (data, settings, callback) {
        settings.data = data
        settings.method = settings.type.toUpperCase()
        if (settings.method === 'GET') {
            // settings.url = `${settings.url}?${qs.stringify(settings.data)}`
            settings.params = data
            delete settings.data
        }
        let axiosCencel
        settings.cancelToken = new CancelToken((cancel) => {
            axiosCencel = cancel
        })

        axios(settings)
        .then(function(res){
            callback.net.done(res.data)
            callback.after()
        })
        .catch(function(error){
            callback.after()
            if (error.response || error.request || error.message === 'abort') {
                callback.net.fail(error)
            }
            else {
                throw error
            }
        })
        return {
            abort: () => {
                if (typeof axiosCencel === 'function') {
                    axiosCencel('abort')
                }
            }
        }

    },
    defaultCallback: {
        net: {
            fail: function (error) {
                if (/timeout/.test(error.message)) {
                     message.error('网络超时')
                }
                else if (/abort/.test(error.message)) {
                    // cancel request
                }
                else {
                    message.error('网络错误' + error.message)
                }
            }
        }
    },
    judgeResponseType: function (res) {
        return res.status
    },
    defaultResponseType: {
        pass: function () {
            message.success('操作成功')
        },
        fail: function (res) {
            message.error('fail:' + res.msg)
        },
        error: function (res) {
            message.error('error:' + res.msg)
        }
    }
})

var apiTimeout = api.create({
    settings: {
        url: 'http://118.25.125.213:9823/onface/echo/mock/pass?$delay=1000',
        type: 'get',
        timeout: 400
    }
})

$('#axios-timeout').on('click', function () {
    apiTimeout()
})

var apiNotfound = api.create({
    settings: {
        url: '/errorUrl',
        type: 'get',
        timeout: 400
    }
})

$('#axios-404').on('click', function () {
    apiNotfound()
})


var apiAbort = api.create({
    settings: {
        url: 'http://118.25.125.213:9823/onface/echo/mock/pass?$delay=1000',
        type: 'get'
    }
})


$('#axios-abort').on('click', function () {
    var reqeust = apiAbort(
        {},
        {},
        {
            loading: function (isLoading, failArg) {
                if (isLoading) {
                    message.loadingBar.show()
                }
                else {
                    message.loadingBar.hide()
                }
            }
        }
    )
    reqeust.abort()

})

check

校验接口返回格式是非常重要的,虽然写校验代码需要时间。但是“某些情况下”相比调试找bug的时间会少很多。

check
var BetterAPI = require('better-api')
var message  = require('face-message')
var $ = require('jquery')
// https://onface.github.io/types/
var Types = require('face-types')({isRequired: true})
var {
    string, bool,number, array,
    oneOf, arrayOf, object,
    objectOf, shape
} = Types
var notRequiredTypes = require('face-types')({isRequired: false})

var api = new BetterAPI({
    check: function (res, req, settings) {
        if (settings.url !== 'some_special_url') {
            Types.check(
                {
                    status: oneOf(['pass', 'fail'])
                },
                res,
                'ajax',
                settings.url
            )
        }
    },
    defaultSettings: {
        dataType: 'json'
    },
    loading: function (isLoading, failArg) {
        if (isLoading) {
            message.loadingBar.show(2)
        }
        else {
            switch (failArg[1]) {
                case 'abort':

                    break;
                case undefined:
                    message.loadingBar.hide()
                    break
                default:
                    message.loadingBar.fail()
            }
        }
    },
    input: function (req) {
        return req
    },
    output: function (res, req) {
        return res
    },
    fetch: function (data, settings, callback) {
        settings.data = data
        return $.ajax(settings)
                .done(callback.net.done)
                .fail(callback.net.fail)
                .always(callback.after)
    },
    defaultCallback: {
        net: {
            fail: function (jqXHR, textStatus) {
                switch(textStatus) {
                    case 'timeout':
                        message.error('网络超时')
                    break
                    case 'abort':
                    break
                    default:
                        message.error('网络错误')
                }

            }
        }
    },
    judgeResponseType: function (res) {
        return res.status
    },
    defaultResponseType: {
        pass: function () {
            message.success('操作成功')
        },
        fail: function (res) {
            message.error('fail:' + res.msg)
        },
        error: function (res) {
            message.error('error:' + res.msg)
        }
    }
})
var apiAccount = api.create({
    settings: {
        url: 'http://118.25.125.213:9823/onface/echo/mock/account',
        type: 'get'
    },
    check: {
        pass: function (res, req, settings) {
            var { string, bool,number, array,
                  oneOf, arrayOf, object,
                  objectOf, shape
                } = require('face-types')({isRequired: true})
            var notRequired = require('face-types')({isRequired: false})
            Types.check(
                {
                    data: shape({
                        test1: string,
                        test2: notRequiredTypes.string,
                        username: string,
                        age: number,
                        domains: arrayOf(string),
                        projects: arrayOf(
                            shape({
                                name: string,
                                url: string
                            })
                        ),
                        currentProject: shape({
                            name: string,
                            url: string
                        })
                    })
                },
                res,
                'ajax',
                settings.url
            )
        }
    }
})

$('#check-account').on('click', function () {
    apiAccount()
})

var apiFail = api.create({
    settings: {
        url: 'http://118.25.125.213:9823/onface/echo/mock/fail',
        type: 'get'
    },
    check: {
        fail: function (res, req, settings) {
            Types.check(
                {
                    msg: string
                },
                res,
                'ajax',
                settings.url
            )
        }
    }
})
$('#check-fail').on('click', function () {
    apiFail()
})

Github
better-api - 项目源码
相关站点
component-spec - 组件规范
module - 开源项目脚手架
onface.live - 资源集合