• fetchapi封装js调接口方法


    js封装异步调接口的方法

    • 使用isomorphic-fetch库:npm install --save isomorphic-fetch es6-promise
      优点:可以同时照顾 node 和 browser 环境。
    • 使用form-datanpm install --save form-data
    import 'isomorphic-fetch'
    import 'form-data'
    
    function prepend(prefix, name, separator) {
      //封装一个加前缀的方法
      if (prefix) {
        if (separator)
          return prefix + "." + name;
    
        return prefix + name;
      }
      return name;
    }
    
    function isObject(value) {
        var type = typeof value;
        return !!value && (type == 'object' || type == 'function');
    }
    
    function flatten(prefix, obj, map) {
      if (obj) {
        if (Array.isArray(obj)) {
          for (let i = 0; i < obj.length; i++) {
            var item = obj[i];
            flatten(prepend(prefix, "[" + i + "]", false), item, map);
          }
        } else if (isObject(obj)) {
          if (obj['__type__'] == 'map') {
            for (let key in obj) {
              if (key != '__type__')
                flatten(prepend(prefix, "[" + key + "]", false), obj[key], map);
            }
          } else if (obj instanceof File) {
            // deal with JS based file load
            map[prefix] = obj;
          } else {
            for (let key in obj) {
              flatten(prepend(prefix, key, true), obj[key], map);
            }
          }
        }
        else {
          map[prefix] = obj;
        }
      }
    }
    
    export function toFlattenMap(obj) {
      let map = {};
    
      flatten(null, obj, map);
      return map;
    }
    
    export function composeFetch(service, endpoint, data, headers) {
      let fullUrl = !!service ? service + endpoint : endpoint;
    
      let method = !!data && !!data.method ? data.method : 'POST';
    
      if (method == 'POST') {
        let formData = new FormData();
        if (!!data && !!data.commandObject) {
          let flattenMap = toFlattenMap(data.commandObject);
          for (let key in flattenMap) {
            formData.append(key, flattenMap[key]);
          }
        }
        //支持请求头的设置,电商接口的Content-Type与园区不同,因当前库已经在电商用户版使用,故优先为'Content-Type': 'application/json'
        return ({
          fullUrl,
          fetchData: headers
            ? {
              headers,
              //Credentials 标志设置为 true,从而向服务器发送 Cookies
              credentials: 'include', 
              method,
              body: formData
            }
            : {
              headers: {
                'Accept': 'application/json',
                'Content-Type': 'application/json'
              },
              credentials: 'include',
              method,
              body: JSON.stringify(data.commandObject)
            }
        });
    
      } else {
        let params = [];
        if (!!data && !!data.commandObject) {
          let flattenMap = toFlattenMap(data.commandObject);
    
          let i = 0;
          for (let key in flattenMap) {
            if (i++ == 0)
              params.push('?');
            else
              params.push('&')
    
            params.push(encodeURIComponent(key) + '=' + encodeURIComponent(flattenMap[key]));
          }
    
          if (params.length > 0)
            fullUrl = fullUrl + params.join('');
        }
    
        return ({
          fullUrl,
          fetchData: {
            credentials: 'include',
            method
          }
        });
      }
    }
    
    export function callApi(service, endpoint, data) {
      let fetchInfo = composeFetch(service, endpoint, data);
    
      return fetch(fetchInfo.fullUrl, fetchInfo.fetchData)
        .then((response) => {
          return response.text().then(text => text)
        })
        .then((response) => {
          // 长整型bug
          const data = JSON.parse(response.replace(/([^\])":(d{15,})/g, '$1":"$2"'))
          if (Number(data.errorCode) !== 200) {
            return Promise.reject(data)
          }
          return (data);
        });
    }
    
    export function callRaw(service, endpoint, data, headers) {
      let fetchInfo = composeFetch(service, endpoint, data, headers);
      return fetch(fetchInfo.fullUrl, fetchInfo.fetchData);
    }
    
    
  • 相关阅读:
    C++之类和对象
    PHP程序设计基础
    PHP函数和MySQL数据库
    HTML语言基础
    文件和目录1(文件属性和权限)
    文件IO
    查找
    使用tcpdump抓包实例
    导入模块的2种方法
    ansible启用sudo执行命令
  • 原文地址:https://www.cnblogs.com/Lewiskycc/p/7119726.html
Copyright © 2020-2023  润新知