问题:加号后台接收变空格问题

结论:

1.任何get拼接的请求 参数key value 需要编码后在拼接

2.get请求避免做数据提交,用post提交。jq,axios的post提交默认编码了不会有问题

3.php后台获取get请求和application/x-www-form-urlencoded的post请求,都自动urldedecode,所以如果请求参数

没有编码,会出现加号变空格问题

解决方案:

1. 按照form表单的方式提交, jq axios 按照表单的方式都没问题。

2.自己拼接的数据需要 进行urlencode编码, 前端可以用 encodeURIComponent 对key,value编码

遗留问题:

1.  不确定post的 multipart/form-data 有没有对参数进行urlencode编码

get请求的参数含有特殊字符 需要编码后传输。

浏览器默认get 请求和 content-type为application/x-www-form-urlencoded的post请求都会对参数进行编码,服务端默认会解码获取参数。

浏览器前端js 编码

安全字符不同 其他字符转换为%16进制值 如空格 %20
escape (69 个) */@+-._0-9a-zA-Z   
encodeURI (82 个) !#$&'()*+,/:;=?@-._~0-9a-zA-Z  
encodeURIComponent (71 个) !'()*-._~0-9a-zA-Z   ( 注意+ 号未在其安全字符里)

适用场合不同 
encodeURI 被用作对一个完整的URI 进行编码,而encodeURIComponent 被用作对URI 的一个组件进行编码。 浏览器get请求

php

urlencode (65) -_.0-9a-zA-z  特殊空格则编码为加号(+)

rawurlencode(65)  -_.0-9a-zA-z  空格没有特殊处理

返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。此编码与 WWW 表单 POST 数据的编码方式是一样的,同时与 application/x-www-form-urlencoded 的媒体类型编码方式一样。由于历史原因,此编码在将空格编码为加号(+)方面与 RFC1738 编码(参见 rawurlencode())不同。

rawurlencode 函数:

返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数。这是在 » RFC 3986 中描述的编码,是为了保护原义字符以免其被解释为特殊的 URL 定界符,同时保护 URL 格式以免其被传输媒体(像一些邮件系统)使用字符转换时弄乱。

下面为请求测试代码

结论:

# form method="get" enctype="application/x-www-form-urlencoded"
<input name="v2" value="form get request 123 我+123" disable>
/index/test?v1=&v2=form+get+request+123+%E6%88%91%2B123
结果:一致
[v2] => form get request 123 我+123

# form method="post" enctype="application/x-www-form-urlencoded"
<input name="v2" value="form get request 123 我+123" disable>
/index/test?v1=&v2=form+get+request+123+%E6%88%91%2B123
结果:一致
[v2] => form get request 123 我+123

# form method="post" enctype="multipart/form-data"
<input name="v2" value="form post multipart/form-data request 123 我+123" disable>
/index/test?v1=&v2=form+get+request+123+%E6%88%91%2B123
结果:一致
[v2] => form get request 123 我+123

# a 
<a href="http://192.168.2.251/index/test?v2= a get request 123 我+123">跳转</a>
/index/test?v2=%20a%20get%20request%20123%20%E6%88%91+123
结果:不一致
[v2] => a get request 123 我 123

# axios
## get 
1.
url = 'http://192.168.2.251/index/test?v2= a get request 123 我+123'
axios.get(url)
结果:不一致
发送形式:http://192.168.2.251/index/test?v2=%20a%20get%20request%20123%20%E6%88%91+123
[v2] => a get request 123 我 123
2.
url = 'http://192.168.2.251/index/test'
let data = {
params:{v2: ' a get request 123 我+123'}
}
axios.get(url,data)
结果:一致
发送形式:http://192.168.2.251/index/test?v2=+a+get+request+123+%E6%88%91%2B123
[v2] => a get request 123 我+123
## post

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<a href="/" class="trans_effect">摸我!</a>
<button class="fade in" onclick="fade(this)">fade</button>
<div class="dialog fade " onclick="fade()" >
<slot name="header"></slot>
<slot name="body"></slot>
<slot name="footer"></slot>
</div>
<iframe width="100%" height="300" src="http://jsrun.net/6ZYKp/embedded/all/light/" allowfullscreen="allowfullscreen" frameborder="0"></iframe>
<form method="get" action="http://192.168.2.251/index/test">
<input name="v1">
<input name="v2" value="form get request 123 我+123" disable>
<button type="submit">submit get</button>
</form>
<form method="post" enctype="application/x-www-form-urlencoded" action="http://192.168.2.251/index/test">
<input name="v1">
<input name="v2" value="form post application/x-www-form-urlencoded request 123 我+123" disable>
<button type="submit">submit post application/x-www-form-urlencoded</button>
</form>
<form method="post" enctype="multipart/form-data" action="http://192.168.2.251/index/test">
<input type="file" name="v1">
<input name="v2" value="form post multipart/form-data request 123 我+123" disable>
<button type="submit">submit post multipart/form-data</button>
</form>
<div><a href="http://192.168.2.251/index/test?v2= a get request 123 我+123">跳转</a></div>
<div>
<button onclick="getAjax()">getAjax</button>
<button onclick="postAjax()">postAjax</button>
</div>
</body>
<script src="https://cdn.bootcss.com/axios/0.17.1/axios.min.js"></script>
<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<script type="text/javascript">
function getAjax(){
url = 'http://192.168.2.251/index/test?v2= a get request 123 我+123'
axios.get(url)

url = 'http://192.168.2.251/index/test'
let data = {
params:{v2: ' a get request 123 我+123'}
}
axios.get(url,data)

// 接收有问题
url = 'http://192.168.2.251/index/test?v2= a get request 123 我+123 $'
$.get(url)
// 接收没问题
url = 'http://192.168.2.251/index/test'
data = {
v2: ' a get request 123 我+123 $$'
}
$.get(url,data)
}

function postAjax(){
url = 'http://192.168.2.251/index/test'
// let data = {}
// data.params = {
// v2: ' a get request 123 我+123',
// v1: 'aa'
// }
// let data = 'v2='+encodeURIComponent(' a get request 123 我+123')
let data = 'v2= a get request 123 我+123'
let config = {headers: {'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8'}};
axios.post(url,data,config)

var params = new FormData();
params.append('v2', 'a get request 123 我+123 FormData');
axios.post(url, params);

data = {
v2: ' a get request 123 我+123 $',
v1: 'aa $'
}
$.post(url, data)
}
</script>
<script>
function fade (that) {
// body...
console.log(that.style.opacity);
console.log(that);
that.style.opacity=that.style.opacity==0?1:0;
that.style.display="block";
that.style.background=0xfff;
}
</script>
</html>

参考:

http://www.jb51.net/article/96511.htm

加号变空格问题 url参数 post get 请求发送的更多相关文章

  1. 解决url传递过程中加号变空格的问题

    url传递过程中加号变空格 在接收url参数的过程中,会发现如果参数中存在‘+’号,接收后会变成空格. 如11+22接收后变成11 22. 要解决这个问题,需要将加号替换为%2B进行传递. 如11%2 ...

  2. 解决url传递过程中加号变空格的问题<转>

    url传递过程中加号变空格在接收url参数的过程中,会发现如果参数中存在‘+’号,接收后会变成空格. 如11+22接收后变成11 22.要解决这个问题,需要将加号替换为%2B进行传递. 如11%2B2 ...

  3. ASP.NET页面传值加号变空格解决办法

    只需要把欲传值进行编码 string EncodeId = Server.UrlEncode(id); 加号就变成了 % 2 B  (中间无空格) 然后再传出去. Request.QueryStrin ...

  4. [Android Pro] http请求中传输base64出现加号变空格的解决办法

    reference to : http://blog.csdn.net/jsjwbxzy/article/details/45970231 try { des = URLEncoder.encode( ...

  5. 【2019】问题记录一:后端获取URL参数的值内加号“+”变成空格“ ”

    问题:URL参数中加号“+”变成空格“ ” 一.现象     URL如:http://example.****.com/controller/action?param=rice+cook+panda ...

  6. url参数中有+、空格、=、%、&、#等特殊符号的处理

    url参数中有+.空格.=.%.&.#等特殊符号的问题解决? 解决办法: 将这些字符转化成服务器可以识别的字符,对应关系如下: URL字符转义 + URL 中+号表示空格 %2B 空格 URL ...

  7. IIS7.5 URL文件名有加号或空格显示404错误的解决办法

    转:http://www.gyd.cc/zhuanti/tech/9319.html 将服务器由windows2003升级到windows2008后,某个网站的图片突然不能显示,显示404错误, 后来 ...

  8. base64码通过http传输 +号变 空格 问题解决

    通过七牛云base64上传图片,通过官方示例上传成功后,根据示例改了一个controller. 通过前端往后端传base64码形式进行测试.死活不通过,七牛报400. 仔细排查后发现,示例转换的bas ...

  9. Http请求特殊符号变空格

    Http请求特殊符号变空格 今天在调试客户端向服务器传递参数时,url中的参数值出现+,空格,/,?,%,#,&等特殊符号的时候就自动变成空格,在服务器端无法获得正确的参数值.解决方法如下: ...

随机推荐

  1. hdu 6070 Dirt Ratio 线段树+二分

    Dirt Ratio Time Limit: 18000/9000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)Spe ...

  2. [jshint] 'import' is only available in ES6 (use 'esversion: 6'). (W119) 提示import等ES6语法的jshint错误的,在代码前加一行 /* jshint esversion: 6 */

    官方下载了vue的简单项目,用vscode打开main.js,代码前出现黄点,js报错了 把鼠标移至import的波浪线上,出现提示:W119 - ‘import’  is only availabl ...

  3. PSFTP用法

    PSFTP是PuTTY SFTP客户端,用于本地与服务器间安全传输文件(使用SSH连接). 1. 启动PSFTP 在Windows命令提示符中输入 set PATH=C:/PSFTP.exe所在路径; ...

  4. PHP中json数组与对象的问题

    在PHP后端,对于数组和对象的区分不是很大,主要用到的数组居多,而PHP提供接口时响应的一般是json数据(为什么使用json呢,总体来说就是体积小速度快).但是前端对数组对象很'敏感',所以对PHP ...

  5. jenkins之从0到1利用Git和Ant插件打war包并自动部署到tomcat(第二话):安装插件,配置JDK、Git、Ant

    jenkins之所以这么强大,离不开丰富的插件库. 要确保jenkins上安装好Git plugin.GitHub plugin.AntPlugin插件,一般在启动jenkins时默认安装的插件中就包 ...

  6. idea maven环境下 java实现发送邮件验证

    1.开通smtp授权 QQ邮箱-设置-账户-开启 得到一个授权码 2.下载javax.email包 maven项目中 pom文件加入: <dependency> <groupId&g ...

  7. 雷林鹏分享:jQuery EasyUI 树形菜单 - 树形菜单添加节点

    jQuery EasyUI 树形菜单 - 树形菜单添加节点 本教程向您展示如何附加节点到树形菜单(Tree).我们将创建一个包含水果和蔬菜节点的食品树,然后添加一些其他水果到已存在的水果节点. 创建食 ...

  8. python hashable

    判断一个对象是否hashable: hash(obj) 或 obj.__hash__() ,返回 hash 值 hashable 的有: int / float / tuple / str/  obj ...

  9. 练习 配置WCF服务

    http://blog.csdn.net/suntanyong88/article/details/8203572   目录(?)[+] 1OrderTrackWindowsKZT   控制台应用 程 ...

  10. uva11552

    将字符串分为len/k块.用dp[i][j]表示第i个块必须以j结尾的最小划分.当第i块没有字符j时,dp[i][j]多计一个.如果当前块只有1种字符,那么就等于dp[i-1][j].否则对于第i块的 ...