原文链接:https://blog.csdn.net/stpeace/article/details/82892571

参考:https://blog.csdn.net/z69183787/article/details/35987711

web客户端通过http post提交数据到web服务端,其中一个字段名是content, 部分js代码如下:

var xmlHttp = new XMLHttpRequest();
xmlHttp.open('post', 'http://localhost:8080/heheda')
xmlHttp.setRequestHeader("Content-type","application/x-www-form-urlencoded")
xmlHttp.send('content=' + str)

go gin做web服务端, 一切工作的好好的。

可是,实际发现,web服务端概率取不到content的内容,快速确认了一下, 比如当str="abc%"的时候,web服务端就取不到这个值。

   然而,tcpdump抓包的内容显示有这个字段啊: content=abc%

       也就是说,"abc%"的确传递到了web服务端,  怎么就取不出这个值呢?

要注意:content参数在传递后, web服务端默认content参数进行了urlencode, 所以接受到"abc%"后, web服务端的gin框架对"abc%"进行urldecode,  很显然,独立的"%"服务解析出错(特殊字符), 所以在web服务端的代码中取不到"abc%"

那如果确实要传递"abc%", 怎么办呢?先进行urlencode吧,对应的串是"abc%25",  此时"content=abc%25",  tcpdump抓包也能看到这个串"content=abc%25", 而在web服务端解析出来的content的内容abc% (web服务端自动进行了urldecode后)

回到题目那个问题, 为什么要urlencode呢?

假设我们在http post请求中要传递的内容为"name1=xxx&name2=yyy", 如果xxx的内容为"lucy&key=hehe", 那么整个串就成了"name1=ucy&key=hehe&name2=yyy", 很显然,明明是两个字段,却变成了3个字段, 任何人都无法把原来的正确字段提取出来,一切都是"lucy&key=hehe"在捣鬼,所以,要对"lucy&key=hehe"进行转化,进行urlencode, 免得与"&","="产生冲突。

想一下, 不进行urlencode, 而进行base64编码可以吗?当然可以,只不过,需要自己去base64解码。相比较而言,urlencode就要好很多, web服务端会自己去进行urldecode, 更爽。

最后,要注意html form表单的post请求会默认进行urlencode, 可以抓包试试看。想一想,为什么要怎么做?

为什么需要Url 编码
1.  Url 中有些字符会引起歧义 , =,& 号等
2.  Url 的编码格式采用的是ASCII 码,而不是Unicode ,这也就是说你不能在Url 中包含任何非ASCII 字符,例如中文

哪些字符需要编码
RFC3986 文档规定,Url 中只允许包含英文字母(a-zA-Z )、数字(0-9 )、-_.~4 个特殊字符以及所有保留字符。
Url 可以划分成若干个组件,协议、主机、路径等。RFC3986 中指定了以下字符为保留字符: ! * ' ( ) ; : @ & =+ $ , / ? # [ ]

最新文章

  1. Github注册账户过程
  2. css -- 高度相等的列 -- 3列高度相等
  3. 你真的会写单例模式吗-------Java实现
  4. C语言 百炼成钢5
  5. Net文章汇总帖
  6. 如何设置 Windows 开机启动项
  7. 无锁编程(五) - RCU(Read-Copy-Update)
  8. 使用Powershell在Microsoft Azure中创建Virtual Machine
  9. layout_weight体验(实现按比例显示)
  10. 尝鲜delphi开发android/ios_环境搭建
  11. localStorage保存账号密码
  12. POJ 1503 Integer Inquiry 简单大数相加
  13. poj - 4045 - Power Station
  14. TreeSet与TreeMap的源码分析 JDK7
  15. java 并发工具类CountDownLatch & CyclicBarrier
  16. 敏捷开发相关编辑思想(SOA、DDD、REST、CQRS)
  17. LeetCode题解39.Combination Sum
  18. Python中4位1进制数与float浮点数互相转换
  19. 洛谷P3381 最小费用最大流
  20. MGF 637: Financial Modeling

热门文章

  1. 小a的学期 (组合数取模模板)
  2. vigil rpm 包制作
  3. 27-ESP8266 SDK开发基础入门篇--编写Android SmartConfig一键配网程序
  4. 洛谷P1043数字游戏
  5. C语言函数内局部变量释放的坑
  6. element ui分页器的使用
  7. 下载根目录下的pdf文件, 浏览器下载
  8. compass和paoding分词器的基本使用
  9. 刷题记录:[SUCTF 2019]EasySQL
  10. 运维笔记--postgresql占用CPU问题定位