当前位置: 首页 > article >正文

【js】URL处理

背景

有这样子一个url,search部分的value可能包含空格,也可能是一个对象,如何正确解析这样子的url呢?

search如下,?accountId=144115188076933939&accountName=mock name&xxx

{
    "accountId": "144115188076933939",
    "accountName": "mock name", // 空格
    "accountNumber": "*1623",
    "accountType": "6",
    "bankId": "36",
    "bankName": "DUIT NOW OB PHONE NUMBER",
    "proxyType": "1",
    "recipientType": "3",
    "saved": "true",
    "status": "2",
    "test": { // json对象
        "1": 1,
        "2": 2
    }
}

空格

通常来说,空格在URL中通常需要被编码为%20或者+。有这样子的两个方法,encodeURIComponent和decodeURIComponent对url进行编码和解码操作。

encodeURIComponent('?accountId=144115188076933939&accountName=mock name')

// 输出
?accountId=144115188076933939&accountName=mock%20name

json对象

编码的时候,将对象序列化成字符串,然后再调用encodeURIComponent;
解码的时候,就先parse成对象,再调用decodeURIComponent。

代码

遍历json对象,如果value为对象的话,则将其stringify成字符串:

export function shallowStringifyObjectFields(
  obj: Record<
    string,
    string | number | boolean | Record<string, unknown> | null | undefined
  >
): Record<string, string | number | boolean | null | undefined> {
  const newObj: Record<
    string,
    string | number | boolean | null | undefined
  > = {};
  for (const key of Object.keys(obj)) {
    const val = obj[key];
    if (typeof val === 'object' && val) {
      newObj[key] = JSON.stringify(val);
    } else {
      newObj[key] = val;
    }
  }
  return newObj;
}

将对象转换成url search,类似?xx=xx这样子的字符串:

/**
 * format a javascript object into query string, keep the key value in alphabetic order
 * @static
 * @param {object} json
 * @returns {string} query string
 */
export function jsonToQueryString(
  json: Record<
    string,
    string | null | undefined | number | boolean | Array<any>
  >,
  skipQuestionMark = false
): string {
  if (!json) {
    return '';
  }
  const keys = Object.keys(json).filter(key => {
    const val = json[key];
    return typeof val !== 'undefined' && val !== null;
  });
  if (!keys.length) {
    return '';
  }
  return (
    (skipQuestionMark ? '' : '?') +
    keys
      .sort()
      .map(function (key) {
        return (
          encodeURIComponent(key) +
          '=' +
          // undefined | null is already filtered out above
          encodeURIComponent(json[key] as string | number | boolean)
        );
      })
      .join('&')
  );
}

将url search字符串解析成对象:

/**
 * Parse query string using string splitting
 * @static
 * @param {string} queryString
 * @return {Object.<string>}
 */
export function parseQueryStringToObj(
  queryString: string | null | undefined
): {
  [key: string]: string;
} {
  const dictionary: {
    [key: string]: string;
  } = {};

  if (typeof queryString !== 'string' || queryString.length === 0) {
    return dictionary;
  }

  // remove the '?' from the beginning of the
  // if it exists
  if (queryString.indexOf('?') === 0) {
    queryString = queryString.substr(1);
  }
  if (!queryString.length) {
    return dictionary;
  }

  // Step 1: separate out each key/value pair
  const parts = queryString.split('&');

  for (let i = 0; i < parts.length; i++) {
    const p = parts[i];
    // Step 2: Split Key/Value pair
    const keyValuePair = p.split('=');

    // Step 3: Add Key/Value pair to Dictionary object
    const key = keyValuePair[0];
    let value = keyValuePair[1];

    // decode URI encoded string
    value && value.replace(/\+/g, '%20');
    value = decodeURIComponent(value); // 解码

    dictionary[key] = value;
  }

  // Step 4: Return Dictionary Object
  return dictionary;
}

http://www.kler.cn/a/450113.html

相关文章:

  • Pytorch | 从零构建EfficientNet对CIFAR10进行分类
  • 汽车IVI中控开发入门及进阶(四十):FDK AAC音频编解码软件库
  • Android基于Path的addRoundRect,Canvas剪切clipPath简洁的圆角矩形实现,Kotlin(1)
  • 设置中 wifi密码框被输入键盘遮挡的处理
  • systemverilog中task的disable用法
  • javaEE-线程的常用方法-4
  • 快手后端面试,被面试官秒挂了!
  • HEX文件格式详解
  • flask-admin modelview 中重写get_query函数
  • oracle怎样使用logmnr恢复误删除的数据
  • 优化 HTTP 接口请求:缓存策略与实现方法
  • Leetcode1705:吃苹果的最大数目
  • Jetson xavier 刷机安装教程
  • new 分配空间;引用
  • 电气设计 | 低压接地系统:TN-C 、TN-S、TN-C-S、TT适用哪些场所?
  • vue中proxy代理配置(测试二)
  • 大模型面试快问快答
  • 设计模式--抽象工厂模式【创建型模式】
  • 利用Spring Cloud Gateway Predicate优化微服务路由策略
  • 【wordpress】建立数据库连接时出错,您看到此页面,则表示您在 wp-config.php 文件中定义的用户名和密码信息不正确,或是……
  • QT——day1
  • 畅捷通-条件竞争
  • 前端开发 之 12个鼠标交互特效上【附完整源码】
  • 120页PPT讲解ChatGPT如何与财务数字化转型的业财融合
  • Scala_【2】变量和数据类型
  • 批量生成二维码,助力数字化管理-Excel易用宝