axiosステップアップ:ajaxリクエストを最も優雅な方法で書く



姉妹編jQuery進級:最も優雅な方法でajaxリクエストを書く
xfire:シンプルで優雅で、高度に構成可能なfetchインタフェースの一括生成ツールも試してみてください.
axiosは、vue-resourceの代わりにVueが公式に推奨するajaxライブラリです.
  • ajax ,
  • axios , api ,

  • 1.content-type構成
    // filename: content-type.js
    module.exports = {
      formData: 'application/x-www-form-urlencoded; charset=UTF-8',
      json: 'application/json; charset=UTF-8'
    }

    2.api構成
    // filename: api-sdk-conf.js
    import contentType from './content-type'
    
    export default {
      baseURL: 'http://192.168.40.231:30412',
      apis: [
        {
          name: 'login',
          path: '/api/security/login?{{id}}',
          method: 'post',
          contentType: contentType.formData,
          status: {
            401: '         '
          }
        }
      ]
    }

    3. request.jsメソッド
    // request.js
    import axios from 'axios'
    import qs from 'qs'
    import contentType from '@/config/content-type'
    import apiConf from '@/config/api-sdk-conf'
    
    var api = {}
    
    // render             ,              
    //   render('/{{userId}}/{{type}}/{{query}}', {userId:1,type:2, query:3})
    //       /1/2/3
    
    function render (tpl, data) {
      var re = /{{([^}]+)?}}/
      var match = ''
    
      while ((match = re.exec(tpl))) {
        tpl = tpl.replace(match[0], data[match[1]])
      }
    
      return tpl
    }
    
    // fire  this,            
    function fire (query = {}, payload = '') {
      // qs      formData     
      if (this.contentType === contentType.formData) {
        payload = qs.stringify(payload)
      }
      
      //     axios  ,    then,  catch  
      return axios({
        method: this.method,
        url: render(this.url, query),
        data: payload,
        headers: {
          contentType: this.contentType
        }
      })
    }
    
    apiConf.apis.forEach((item) => {
      api[item.name] = {
        url: apiConf.baseURL + item.path,
        method: item.method,
        status: item.status,
        contentType: item.contentType,
        fire: fire
      }
    })
    
    export default api

    4.コンポーネントでの使用
    import api from '@/apis/request'
    ...
          api.login.fire({id: '?heiheihei'}, {
            username: 'admin',
            password: 'admin',
            namespace: '_system'
          })
    ...

    ブラウザの結果:
    Request URL:http://192.168.40.231:30412/api/security/login??heiheihei
    Request Method:POST
    Status Code:200 OK
    Remote Address:192.168.40.231:30412
    Referrer Policy:no-referrer-when-downgrade
    
    POST /api/security/login??heiheihei HTTP/1.1
    Host: 192.168.40.231:30412
    Connection: keep-alive
    Content-Length: 47
    Accept: application/json, text/plain, */*
    Origin: http://localhost:8080
    contentType: application/x-www-form-urlencoded; charset=UTF-8
    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36
    Content-Type: application/x-www-form-urlencoded
    Referer: http://localhost:8080/
    Accept-Encoding: gzip, deflate
    Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
    
    username=admin&password=admin&namespace=_system

    5.その他
    コンポーネントにloginメソッドしか必要ない場合は、このように書くとエラーが発生します.
    import {login} from '@/apis/request'

    このように書く前提はrequestです.js最後に書く
    export var login = api.login

    しかし、これは私が望んでいないので、インタフェースを1つ増やすたびに、ここではexportを1回しなければなりません.これは に合わないので、何かもっと良い方法がありますか?