URL编码问题

我们要查询一个年龄为20,姓名包含 tom 的人,那么我们会这样去组织请求

var url="http://xxx/?age=20&name=tom"

然后服务端就能收到下面的接口请求参数

{
    "age":"20",
    "name":"tom"
}

如果我要搜索的姓名是 tom&lucy ,那么url就变成了

var url="http://xxx?age=20&name=tom&lucy"

我们预想的结果是

{
    "age":"20",
    "name":"tom&lucy"
}

然而实际上确是

{
    "age":"20",
    "name":"tom",
    "lucy":""
}

想必大家也能理解,这个参数中包含 & ,就被当做URL本身的参数结构了,关键是如何解决这个问题呢?

encodeURI

可能有的同学知道JavaScript中有个 encodeURI() 方法用来对URI进行编码,接下来我们试试

encodeURI(url)

得到的结果呢?抱歉,和原url一模一样,没有任何变化,为什么会这样呢?,这是因为encodeURI强调的是给整个URL进行编码,用特殊的UTF-8编码替换所有的无效字符,从而让浏览器能够接受和理解,里面的空格和中文都被编码了,而 &= 未被编码

encodeURIComponent

相比于encodeURI encodeURIComponent则强调对URL中的某个部分彻底编码,比encodeURI编码的范围更大,能够编码更多的字符,@#$&=:/,;?+ 

可见?&=这些本属于URL结构的特殊字符会被encodeURIComponent编码,而不会被encodeURI编码,所以使用encodeURIComponent对url进行部分编码,编码的结果为纯粹的字符串,肯定是不能对整个url运用这个方法,

正确的姿势是单独对name的值进行单独编码

结论

encodeURI本质上对接口的识别没有任何影响,仅仅是为了让URL更好看

encodeURIComponent则是彻底解决了特殊字符带来的影响,能够正确识别参数值中的特殊字符

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RestTemplate在发送HTTP请求时,有时会出现URL编码问题。根据引用\[1\]和引用\[3\]的内容,可以看出在发送请求前,可以通过设置RestTemplate的消息转换器来解决URL编码问题。具体做法是使用`restTemplate.getMessageConverters().set(1,new StringHttpMessageConverter(StandardCharsets.UTF_8))`来设置编码为UTF-8。这样可以确保URL中的参数不会被错误地编码为%25。另外,根据引用\[2\]的内容,还可以通过自己封装URI的方式来解决URL编码问题,具体做法是使用`URI.create(url + myparams + signUrl)`来创建URI对象,然后使用`restTemplate.postForEntity(uriObj, request, String.class)`来发送请求。这样可以确保URL中的参数不会被错误地编码。 #### 引用[.reference_title] - *1* [SpringBoot RestTemplate 解决编码问题 UTF8](https://blog.csdn.net/weixin_42195284/article/details/114935420)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [springboot中使用restemplate,请求接口会将url参数的%编码为%25问题解决](https://blog.csdn.net/weixin_45973130/article/details/120896847)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值