在HarmonyOS开发中编码过的URL在放入map时,会被自动解码?

在HarmonyOS开发中编码过的URL在放入map时,会被自动解码?编码过的URL在放入map时会被自动解码,如何能让其保持编码状态存入map呢?

import { url } from '@kit.ArkTS'; 
 
function parseUrlParam(parseUrl: string): url.URLParams | undefined { 
  try { 
    let parsedUrl = url.URL.parseURL (parseUrl) 
    console.info('parseUrl111:' + parsedUrl.params.toString()); 
    return parsedUrl?.params 
  }catch (err) { 
    return undefined 
  } 
} 
 
function parseUrlParamToMap(parseUrl: string): Map<string, Object> { 
  let param = parseUrlParam(parseUrl) 
  console.info('parseUrl222:' + param?.toString()); 
  const map: Map<string, Object> = new Map() 
  if (!param) { 
    return map 
  } 
  param.forEach((value, key)=>{ // 放入map的时候,url会被解码 
    console.info('parseUrl333, key:' + key + ", value:" + value); 
    map.set(key, value) 
  }) 
  return map 
} 
 
@Entry 
@Component 
struct ParseUrlTest { 
  build() { 
    RelativeContainer() { 
      Button('ParseURL', { stateEffect: true, type: ButtonType.Capsule }) 
        .width('80%') 
        .height(40) 
        .margin(10) 
        .onClick(() => { 
          let urlMap = parseUrlParamToMap('lianjiabeike://web/main?url=https%3A%2F%2Fc-bplus.ke.com%2Fc-h5%2Fmap%3Flat%3D32.415593%26lng%3D119.592545%26tabIndex%3D0%26housedelCode%3D103132780520%26from_source%3Dzhoubian%26detailData%3D%257B%2522title%2522%253A%2522%25E9%2587%2591%25E5%259F%259F%25C2%25B7%25E5%259C%25B0%25E4%25B8%25AD%25E6%25B5%25B7%2B2%25E5%25AE%25A42%25E5%258E%2585%2B%25E5%258D%2597%2B...%2522%252C%2522href%2522%253A%2522https%253A%252F%252Fc-bplus.ke.com%252Fc-h5%252Fdetail%253FhousedelCode%253D103132780520%2526cityId%253D321000%2526hidenav%253D2%2526immersive%253Dtrue%2526pagetype%253DBplusapph5detail%2526from_type%253Dclick%2526view_type%253Drank%2526from_page%253DcFeed%2526parentSceneId%253D959671633515267600%2522%252C%2522desc%2522%253A%2522%25E6%25B1%259F%25E9%2583%25BD%25E5%258C%25BA%2B58.8%25E4%25B8%2587%25E5%2585%2583%2B60%25E5%25B9%25B3%25E7%25B1%25B3%2522%252C%2522headerImg%2522%253A%2522https%253A%252F%252Fimg.ljcdn.com%252F110000-inspection%252F4f2f6bbb23fa2c46da3ffae0e2e8158e-032.jpg%2521m_fit%252Cw_720%252Cl_fbk%252Clx_random%252Cly_random%252Cls_50%252Cf_jpg%2522%257D') 
          console.info('parseUrl444:' + urlMap.get("url")); 
        }) 
    } 
    .height('100%') 
    .width('100%') 
  } 
}

本文参与了 【 HarmonyOS NEXT 技术问答冲榜,等你来战!】欢迎正在阅读的你也加入。

阅读 609
avatarAI BotBETA
**在HarmonyOS开发中编码过的URL在放入map时,会被自动解码吗?**

是的,编码过的URL在放入map时可能会被自动解码,这取决于具体的实现和使用的数据结构。在JavaScript或TypeScript环境中,当你从URL解析参数并放入map时,如果直接以字符串形式处理,可能会遇到自动解码的情况。

**如何能让其保持编码状态存入map呢?**

为了避免自动解码,你可以在将URL参数存入map之前,对其进行适当的处理,以确保其保持编码状态。例如,你可以将编码后的URL参数作为字符串存储,而不是直接解析为URL组件。但这种方法可能会使得后续处理变得复杂,因为你需要手动处理编码和解码。

在你的代码中,`url.URL.parseURL` 方法已经对URL进行了解析,并生成了一个包含解码后参数的对象。因此,当你将这些参数放入map时,它们已经是解码后的状态。

如果你需要保持URL的编码状态,你可以考虑以下方案:

1. **不解析URL**:直接将整个编码后的URL作为字符串存储在map中。
2. **自定义编码存储**:在将参数放入map之前,对它们进行自定义的编码处理(例如,使用Base64编码),然后在需要时再进行解码。

然而,这些方案可能会增加代码的复杂性和维护成本。通常,对于大多数应用场景来说,接受URL解析后的解码状态是更实用和简单的选择。

在你的具体代码示例中,如果你确实需要保持URL的编码状态,你可能需要调整你的设计,以便在需要时能够重新构建编码后的URL,而不是依赖解析后的参数。
1 个回答

URLParams的forEach方法规则就是会将value值解码,如需取编码的值,可以调用encodeURIComponent(value)进行再编码
将源字符串的key和value解码一次,比较解码前后的值,如果相同,则源字符串未编码,直接插入map,反之则源字符串是编码过的,需编码一次后再插入map。可参考如下代码:

import { url } from '@kit.ArkTS'; 
 
function parseUrlParam(parseUrl: string): url.URLParams | undefined { 
  try { 
    let parsedUrl = url.URL.parseURL (parseUrl) 
    return parsedUrl?.params 
  }catch (err) { 
    return undefined 
  } 
} 
 
function parseUrlParamToMap(parseUrl: string): Map<string, Object> { 
  let param = parseUrlParam(parseUrl) 
  const map: Map<string, Object> = new Map() 
  if (!param) { 
    return map 
  } 
 
  param.forEach((value, key)=>{ 
    if (decodeURIComponent(key) == key && decodeURIComponent(value) == value) { 
      map.set(key, value) 
    } else { 
      map.set(encodeURIComponent(key), encodeURIComponent(value)) 
    } 
  }) 
  return map 
} 
 
@Entry 
@Component 
struct ParseUrlTest { 
  build() { 
    RelativeContainer() { 
      Button('ParseURL', { stateEffect: true, type: ButtonType.Capsule }) 
        .width('80%') 
        .height(40) 
        .margin(10) 
        .onClick(() => { 
          let urlMap = parseUrlParamToMap('lianjiabeike://web/main?url=https%3A%2F%2Fc-bplus.ke.com%2Fc-h5%2Fmap%3Flat%3D32.415593%26lng%3D119.592545%26tabIndex%3D0%26housedelCode%3D103132780520%26from_source%3Dzhoubian%26detailData%3D%257B%2522title%2522%253A%2522%25E9%2587%2591%25E5%259F%259F%25C2%25B7%25E5%259C%25B0%25E4%25B8%25AD%25E6%25B5%25B7%2B2%25E5%25AE%25A42%25E5%258E%2585%2B%25E5%258D%2597%2B...%2522%252C%2522href%2522%253A%2522https%253A%252F%252Fc-bplus.ke.com%252Fc-h5%252Fdetail%253FhousedelCode%253D103132780520%2526cityId%253D321000%2526hidenav%253D2%2526immersive%253Dtrue%2526pagetype%253DBplusapph5detail%2526from_type%253Dclick%2526view_type%253Drank%2526from_page%253DcFeed%2526parentSceneId%253D959671633515267600%2522%252C%2522desc%2522%253A%2522%25E6%25B1%259F%25E9%2583%25BD%25E5%258C%25BA%2B58.8%25E4%25B8%2587%25E5%2585%2583%2B60%25E5%25B9%25B3%25E7%25B1%25B3%2522%252C%2522headerImg%2522%253A%2522https%253A%252F%252Fimg.ljcdn.com%252F110000-inspection%252F4f2f6bbb23fa2c46da3ffae0e2e8158e-032.jpg%2521m_fit%252Cw_720%252Cl_fbk%252Clx_random%252Cly_random%252Cls_50%252Cf_jpg%2522%257D') 
          console.info('parseUrl:' + urlMap.get("url")); 
        }) 
    } 
    .height('100%') 
    .width('100%') 
  } 
}

本文参与了 【 HarmonyOS NEXT 技术问答冲榜,等你来战!】欢迎正在阅读的你也加入。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进